南京观海微电子----Verilog基础(一)——数据类型、运算符

news2024/11/16 9:32:40

1. 数据类型

1.1 常量

整数:整数可以用二进制b或B,八进制o或O,十进制d或D,十六进制h或H表示,例如,8’b00001111表示8位位宽的二进制整数,4’ha表示4位位宽的十六进制整数。

XZ:X代表不定值,z代表高阻值,例如,5’b00x11,第三位不定值,3’b00z表示最低位为高阻值。

下划线:在位数过长时可以用来分割位数,提高程序可读性,如8’b0000_1111

1.2 参数

参数 parameter:parameter可以用标识符定义常量,运用时只使用标识符即可,提高代码可读性及维护性,如定义parameterwidth = 8 ; 定义寄存器reg[width-1:0] a; 即定义了8位宽度的寄存器。

参数的传递:在一个模块中如果有定义参数,在其他模块调用此模块时可以传递参数,并可以修改参数,如下所示,在module后用#()表示。

1.3 传参示例

例如模块定义如下,该ROM模块有两个输入参数,其中addr变量为15位位宽,data变量为8位位宽:

module ROM

#(

    parameter depth=15,

    parameter width = 8

)

(

    input [depth-1:0] addr,

    input[width-1:0] data,

    output result

) ;

endmodule

调用该ROM模块时,可以在调用时修改传参来修改参数。如下代码,在调用ROM模块时,将depth和width变量的位宽分布修改成了32位位宽和16位位宽。

module top() ;

wire [31:0] addr ;

wire [15:0] data ;

wire result ;

ROM

#(

    .depth(32),

    .width(16)

)

ROM1

(

    .addr(addr) ,

    .data(data) ,

    .result(result)

) ;

endmodule

Parameter可以用于模块间的参数传递,而localparam仅用于本模块内使用,不能用于参数传递。Localparam多用于状态机状态的定义。

1.4 变量

变量是指程序运行时可以改变其值的量,下面主要介绍几个常用了变量类型。

1.4.1 Wire

Wire 类型变量,也叫网络类型变量,用于结构实体之间的物理连接,如门与门之间,不能储存值,用连续赋值语句assign赋值,定义为wire[n-1:0] a ;其中n 代表位宽,如定义wire a ; assign a = b ;是将b的结点连接到连线a上。如下图所示,两个实体之间的连线即是wire类型变量。

1.4.2 Reg

Reg类型变量,也称为寄存器变量,可用来储存值,必须在always语句里使用。其定义为reg [n-1:0] a ;表示n位位宽的寄存器,如reg [7:0] a;表示定义8位位宽的寄存器a。

如下所示定义了寄存器q

module TOP

(

    input d,

    input clk,

    output reg q

) ;

always @(posedge clk)

begin

    q <= d ;

end

endmodule

生成的电路为时序逻辑,下图为其结构,为D触发器。

也可以生成组合逻辑,如下面代码所示为一个数据选择器,敏感信号没有时钟

module TOP

(

    input a,

    input b,

    input c,

    input d,

    input[1:0] sel,

    output reg Mux

) ;

always @(sel or a or b or c or d)

begin

    case(sel)

    2'b00 : Mux = a ;

    2'b01 : Mux = b ;

    2'b10 : Mux = c ;

    2'b11 : Mux = d ;

    endcase

end

endmodule

最终生成电路为组合逻辑。

图片

1.4.3 Memory

可以用memory类型来定义RAM、ROM等存储器,其结构为reg [n-1:0]存储器名[m-1:0],意义为m个n位宽度的寄存器。例如,reg [7:0] ram [255:0]表示定义了256个8位寄存器,256也即是存储器的深度,8为数据宽度。

2. 运算符

运算符可分为以下几类:

(1)算术运算符(+,-,*,/,%)

(2)赋值运算符(=,<=)

(3)关系运算符(>,<,>=,<=,==,!=)

(4)逻辑运算符(&&,||,!)

(5)条件运算符(?:)

(6)位运算符(~,|,^,&,^~)

(7)移位运算符(<<,>>)

(8)拼接运算符({ })

大部分运算符与C/C++语言中定义的运算符用法基本上一致,这里主要介绍几种与C/C++语言中差异较大的运算符。

2.1 赋值运算符

“=”为阻塞赋值,”<=”为非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为顺序执行,而且赋值是立即执行;非阻塞赋值可理解为并行执行,不考虑顺序,在always块语句执行完成后,才进行赋值。

2.1.1 阻塞赋值运算符

下面先介绍阻塞赋值,代码如下:

module TOP

(

    input din,

    input clk,

    output reg a,b,c

) ;

always @(posedge clk)

begin

    a = din;

    b = a;

    c = b;

end

endmodule

下面是上面模块对应的仿真代码(用于给上面模块提供时钟、激励信号用于仿真模块功能的正确性):

module SimFile ();

reg din ;

reg clk ;

wire a,b,c ;

initial

begin

    din = 0 ;

    clk = 0 ;

    forever

    begin

        #({$random}%100)      // 随机等待一段时间(0~99ns之间)

        din = ~din ;

    end

end

always #10 clk = ~clk ;

TOP TOP_i

(

    .clk(clk),

    .din(din),

    .a(a),

    .b(b),

    .c(c)

);

clk时钟的周期是20ns,从仿真结果可以看到,在clk的上升沿时,寄存器a的值等于输入din的值,并立即赋给寄存器b,b的值赋给c。

上面编写的阻塞赋值TOP模块在FPGA内部布局成的电路(RTL)如下图所示,由RTL可以明显看出,在每个时钟周期上沿到来时,寄存器a、b、c的值都被统一赋值成了输入din的值。

图片

2.1.2 非阻塞赋值运算符

将上面编写TOP模块的赋值方式改为非阻塞赋值方式,代码如下:

module TOP

(

    input din,

    input clk,

    output reg a,b,c

) ;

always @(posedge clk)

begin

    a <= din;

    b <= a;

    c <= b;

end

endmodule

仿真代码仍然使用2.1.1节的仿真代码提供时钟和激励信号,仿真结果如下:

在每个时钟clk上升沿时,寄存器a的值没有立即赋值给b,b为a原来的值,同样,c为b原来的值。上面编写的非阻塞赋值TOP模块在FPGA内部布局成的电路(RTL)如下图所示。

图片

一般情况下,在时序逻辑电路中使用非阻塞赋值,可避免出现竞争冒险现象。在组合逻辑中使用阻塞赋值,执行赋值语句后立即改变。在assign语句中必须用阻塞赋值。

2.2 位拼接运算符

“{ }”拼接运算符,将多个信号按位拼接,如{a[3:0], b[1:0]},将a的低4位,b的低2位拼接成6位数据。

{n{a[3:0]}}表示将n个a[3:0]拼接,{n{1’b0}}表示n位的0拼接。如{8{1’b0}}表示为8’b0000_0000。

2.3 运算符的优先级

各种运算符的优先级别如下图所示:

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1486453.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel MATCH函数 两张顺序不同表格,统一排序

目录 一. 背景二. 添加辅助列,使用MATCH函数生成排序条件三. 效果 一. 背景 有如下图所示的两张表格&#xff0c;分别记录着同一批人的1月份和2月份的工资。表格A和表格B中的姓名列相同&#xff0c;工资列数据不同现在要求参考表格A中的姓名列对表格B中的数据进行排序&#xf…

机器学习:数据处理基操

在处理完数据之后&#xff0c;选择好模型&#xff0c;就可以用训练集训练模型&#xff0c;用测试集输入模型 然后输出需要预测的结果啦&#xff5e; 一、模块导入 import numpy as np import pandas as pd #读入数据 二、pandas数据 一、dataframe基础 一、dataframe的创建…

latex中\documentclass[preprint,review,12pt]{elsarticle}的详细解释

在LaTeX中&#xff0c;\documentclass 是一个命令&#xff0c;用于指定文档所使用的文档类。文档类定义了文档的总体结构、格式和样式。elsarticle 是一个常用的文档类&#xff0c;它主要用于在Elsevier出版的期刊上提交论文。 详细解释 \documentclass[preprint,review,12pt…

【Linux】ecs 挂载分区

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 详细步骤&#xff1a; 结语 我的其他博客 前言 在Linux系统中&#xff0c;挂载分区是连接额外存储空间到文件系统的重要步骤之一…

【转载】深度学习笔记——详解损失函数

原文链接: https://blog.csdn.net/weixin_53765658/article/details/136360033 CSDN账号: Purepisces github账号: purepisces 希望大家可以Star Machine Learning Blog https://github.com/purepisces/Wenqing-Machine_Learning_Blog 损失函数 根据您使用的神经网络类型和数…

kubectl 命令行管理K8S(下)

目录 声明式资源管理方式 介绍 命令 修改yaml文件指定的资源 离线修改 在线修改 YAML 语法格式 查看 api 资源版本标签 编辑yaml配置清单生成资源 编写yaml文件 yaml创建Deployment yaml创建service服务对外提供访问并测试 yaml创建Pod 生成模板 pod模板 serivc…

【降维算法UMAP】调参获得更适合的低维图

目录 UMAP降维介绍 UMAP的主要步骤 1. 学习高维空间中数据点间的距离 2. 构建高维图 local_connectivity参数 n_neighbors参数 3. 构建低维图 计算最小距离 min_dist超参数 最小化成本函数 R语言中的RunUMAP函数 关键参数 Reference UMAP降维介绍 为什么要降维&am…

最长上升子序列(LIS)简介及其例题分析

一.最长上升子序列&#xff08;LIS&#xff09;的相关知识 1.最长上升子序列&#xff08;Longest Increasing Subsequence&#xff09;&#xff0c;简称LIS&#xff0c;也有些情况求的是最长非降序子序列&#xff0c;二者区别就是序列中是否可以有相等的数。假设我们有一个序…

[数据结构]栈

1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出的原则。 压栈&#xff1a;栈的插入操作叫做进栈/压栈/入栈&#…

【UEFI实战】BIOS中的openssl

BIOS中的openssl openssl是一个密码库或者密码工具&#xff0c;在密码学基础_hex string is too short, padding with zero bytes t-CSDN博客介绍了基本的密码学概念已经openssl工具的使用&#xff0c;而这里将介绍BIOS下如何使用openssl。 在开源的BIOS代码库EDK中包含一个C…

数据结构作业复盘1:字符串疑难杂症小汇总(字符串赋值,指针数组...)

学校里开始上数据结构了&#xff0c;一开始是从C语言一些相关的基础开始讲起。第一次作业主要是字符串相关的基础知识以及编程题目。先做了一部分&#xff0c;整理了一下一些字符串隐含的知识和一些易误易混的概念&#xff0c;算是给自己的一个复盘和归纳。 strcpy函数相关 首…

Linux系统编程之多线程

目录 1、进程与线程 2、线程的优势与使用理由 3、多线程的使用 3.1 线程的使用 1.线程创建函数 2.线程退出函数 3.线程的等待 4.线程脱离 5. 线程ID获取及比较 6.示例 3.2 互斥锁的应用 1.互斥锁相关API 2.示例 3.3 条件变量的使用 1. 创建及销毁条件变量 2. 等待…

数字化转型导师坚鹏:证券公司数字化领导力提升之道

证券公司数字化领导力提升之道 ——融合中西智慧&#xff0c;践行知行合一思想&#xff0c;实现知行果合一 课程背景&#xff1a; 很多证券公司存在以下问题&#xff1a; 不知道证券公司数字化思维如何提升&#xff1f; 不清楚证券公司数字化领导力模型内涵&#xff1f;…

加密与安全_探索数字证书

文章目录 Pre概述使用keytool生成证书使用Openssl生成证书 &#xff08;推荐&#xff09;证书的吊销小结 Pre PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证 PKI - 04 证书授权颁发机构&#xff08;CA&#xff09; & 数字证书 PKI - 数字签名与数字证…

土壤侵蚀量化评估

根据之前的文章,已经算出了R、K、LS、C、P 现在计算土壤侵蚀,将几个前期制作好的因子的TIFF文件,用栅格计算器相乘 发现局部地区存在轻度侵蚀,大部分区域是微度侵蚀 然后对比了一下范围 其中的几个因子都在文献范围内,说明计算结果并未出错,可能就是研究区正常范围和结…

《数字图像处理(MATLAB版)》相关算法代码及其分析(1)

目录 1 自适应中值滤波算法 1.1 函数定义 1.2 输入参数检查 1.3 初始化 1.4 自适应中值滤波过程 1.5 处理剩余未处理的像素 1.6 总结 2 计算输入数组的平均值 2.1 函数定义 2.2 注释 2.3 输入验证 2.4 计算平均值 2.5 总结 3 基于高斯模型的贝叶斯分类器 3.1 函…

【搭建 Hbase 集群】

搭建 Hbase 集群 一、准备工作二、三台服务器之间的 SSH 免密登录1.修改hosts文件添加DNS映射2.在每台服务器上生成 SSH 密钥对3.将公共密钥&#xff08;通常为 ~/.ssh/id_rsa.pub&#xff09;复制到目标服务器上4.从本地使用 SSH 命令无需密码连接到目标服务器 二、安装JDK1.执…

Linux/Docker 修改系统时区

目录 1. Linux 系统1.1 通过 timedatectl 命令操作1.2 直接修改 /etc/localtime 文件 2. Docker 容器中的 Linux 操作环境&#xff1a; CentOS / AlmaOSMySQL Docker 镜像 1. Linux 系统 1.1 通过 timedatectl 命令操作 使用 timedatectl list-timezones 命令列出可用的时区…

Learning from Unlabeled 3D Environments forVision-and-Language Navigation

这篇论文是关于高级指令的 摘要 在视觉和语言导航 (VLN) 中&#xff0c;实体代理需要按照自然语言指令在真实的 3D 环境中进行导航。现有 VLN 方法的一个主要瓶颈是缺乏足够的训练数据&#xff0c;导致对未见过的环境的泛化效果不理想。虽然 VLN 数据通常是手动收集的&#x…

2024年 前端JavaScript Web APIs 第一天 笔记

1.1 -声明变量const优先 1.2 -DOM树和DOM对象 1.3 -获取DOIM元素 1.4 -DOM修改元素内容以及年会抽奖 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content&quo…