【学习笔记】verilog HDL之二:数据类型与表达式

简介: 本文介绍了Verilog语言中的常量、变量和表达式。Verilog有四种基本值:0、1、x(未知)和z(高阻)。整型常量有十进制和基数两种格式,实数型常量包括浮点数,字符串常量由双引号括起的字符序列构成。变量分为线网型和寄存器型,线网型包括wire、tri等11种类型,寄存器型有reg、integer、time等,其中reg可声明存储器。表达式中的操作数包括常数、参数、线网等8种类型,操作符包括算术、关系、逻辑等9种类型。

1 常量

verilog有四种基本值:

·0表示逻辑0或“假”;

·1表示逻辑1或“真”;

·x表示未知;

·z表示高阻。

x和z在这里是不分大小写的。也就是说,0x1z和0X1Z是相同的。


1.1 整型常量

     整形常量即整数,Verilog的整数有两种书写格式:

·十进制数格式和基数格式。

(1)十进制数格式是一个可以带正负号的数字序列,代表一个有符号数。

(2)基数格式的数通常都是无符号数。形式如下:

[size]'base value

size定义常量的位数(长度),这是可选项;base是基数,规定数据的进制,可以是o(八进制)、B、H和D。value是一个数字序列,其形式应与base定义的形式相符。

7'Hx    //7位x(扩展的x),即xxxxxxx

4'HZ   //4位Z,即ZZZZ

如果size定义的长度大于数字的实际长度,通常在数据序列的高位补0.但是如果这个数字序列最左边一位是x或z,就用x或z在左边补位。如果定义的长度小于数字序列的实际长度,这个数字序列最左边超出的位将被截断。


1.2 实数型常量

     在verilog中,实数就是浮点数,实数的定义方式有两种:

(1)十进制格式,由数字和小数点组成。

(2)指数格式,由数字和字符e(E)组成,e(E)的前面必须要有数字而且后面必须为整数:

23_5.1e2           //其值为23510.0,忽略下划线

3.6E2                //其值为360.0

这里的e可以理解为10。

1.3 字符串型常量

      字符串常量是由一对双引号括起来的字符序列。


2 变量

2.1 线网型变量

      线网表示元件之间的物理连线,它 不能存储数据。线网是被驱动的,可以用连续赋值或把元件的输出连接到线网等方式给线网提供驱动,给线网提供驱动的赋值元件就是“驱动源”,线网的值由驱动源决定。如果没有驱动源连接到线网,线网的缺省值为Z。

     verilog共有11种线网类型:wire tri wor trior wand triand trireg tril tri0 supply0 supply1。

     线网的声明语法形式:net_kind[msb:lsb]net1, net2, .........,netN;

net_kind是线网类型;[msb:lsb]定义线网宽度????????的最高位和最低位,这一项是可选的,默认为一位;netN是线网变量的名称。线网可以有多个驱动源,每个驱动源都会给线网赋值,出现这种情况时,线网的取值由线网类型决定。

     关于位宽的一点补充:

     最高有效位(MSB)

指二进制中最高值的比特。在16比特的数字音频中,其第1个比特便对16bit的字的数值有最大的影响。例如,在十进制的15,389这一数字中,相当于万数那1行(1)的数字便对数值的影响最大。比较与之相反的“最低有效位”(LSB)。汇编中,比如8位2进制数10000001,其中第一个1是MSB,第二个1是LSB。在计算机计算的时候用于判断的比如如果是整数那么小数点(实际上是没有小数点的,但就把那一位和下一位之间看作有)在LSB后面,如果是小数小数点在MSB后面,其中MSB在有符号数中又是符号位。

     在这11种线网中,经常用到的是前六种,下面给出其详细的用法举例。

(1)wire和tri线网

      有些问题,先跳过!

(2)wor和trior线网

·wor线或     ·trior三态线或

(3)wand和triand线网

·wand线与   ·triand线与

(4)trireg线网(三态寄存器)

       这种线网可以存储数值,可用于电容节点的建模。当没有驱动源时,三态寄存器线网的缺省初始值为x。当它的所有驱动源都处于高组态时,三态寄存器保存的值是作用在该线网上的最后一个值。

(5)tri0和tri1线网

·tri0 三态0     ·tri1 三态1

这两个的特征是,若无驱动源(z可视为无驱动源),它的值为0(tri0)或1(tri1)。

(6)supply0     supply1线网

·supply0用于对“地”建模,即低电平。

·supply1用于对电源建模,即高电平1。

2.2 寄存器型变量

      寄存器表示一个抽象的数据存储单元,可以通过赋值语句改变寄存器内存储的值。寄存器只能在always语句和initial语句中赋值,always语句和initial语句是verilog提供的功能强大的结构语句。在未被赋值时,寄存器的缺省值为x。

      verilog共有五种寄存器类型:reg integer time real realtime。

2.2.1 reg寄存器

(1)reg寄存器的类型

reg寄存器是最常用的寄存器类型,这种寄存器中只能存放无符号数。如果给reg中存入一个负数,通常会被视为正数。

(2)用reg声明存储器

      在verilog中不能直接声明存储器,存储器是通过寄存器数组声明的,即用reg声明。可以说,存储器是由若干个寄存器组成的,通过定义单个寄存器的位宽和寄存器的个数可以决定存储器的大小。

      存储器声明如下:

reg [msb:lsb] memory1 [upper1:lower1], memory2 [upper2:lower2], ...............

其中msb、lsb定义了存储器单个寄存器的位宽,memory1和memory2是存储器名;upper和lower分别定义了这两个存储器的大小。

2.2.2 integer寄存器类型

      integer是整数寄存器,也是verilog中最常用的变量类型,这种寄存器中存储有符号整数值。integer即可以定义单个寄存器,也可以用来定义一个寄存器组。整数寄存器中最少可以容纳32位的数,但是不能作为位向量访问。

 

2.2.3 time寄存器类型

      time类型寄存器用于存储和处理时间,通常用在系统函数$time中。其声明形式如下:

time time_id1, time_id2, ..........,time_idN[msb:lsb];

msb lsb是规定范围界限的常量,这个范围将决定寄存器内能存储时间值的个数,如果未定义界限,默认值为1,那么每个寄存器只能存储一个至少64位的时间值。time类型的寄存器只存储无符号数。

2.2.4 real和realtime寄存器类型

      real(实数型寄存器)和realtime(实数型时间寄存器)一般用于在测试模块中存储仿真时间,二者声明形式完全相同。real变量的缺省值为0,当将值x和z赋给real型寄存器时,这些值被当作0。



3. 表达式

3.1 操作数

      操作数即运算对象,位于操作符左右两侧。操作数有以下8种类型:常数、参数、线网、寄存器、位选择、部分选择、存储器单元、函数调用。

(1)常数:表达式中经常出现常数,一般是做运算或赋值。表达式中的整数值可以是有符号数或无符号数。如果表达式中的整数形式是十进制整数,就会被当作有符号数,如果整数形式是基数型整数,那么该整数会被当作无符号数对待。

(2)参数:参数类似于常量,表达式中出现的参数都作为常数对待。参数是用某标识符代表某个数字的,所以定义它时要给它赋值。

(3)线网

(4)寄存器:寄存器是在表达式中出现次数最多的操作数,许多程序语句都是通过对寄存器中存储的值进行转换和传输实现设计目的的。注意:整型寄存器中的值被视为有符号的二进制补码数;实数和实数时间类型寄存器中的值被视为有符号浮点数;而reg寄存器或时间寄存器中的值被视为无符号数。

(5)位选择

(6)部分选择

(7)存储器单元:存储器建模是使用reg声明寄存器组,不能在一条语句内就完成对存储器内所有寄存器单元的赋值,必须对其中的存储单元进行赋值。形式如下:

memory[word_address]

其中,memory是存储器名,word_address是要选择单元的编号。不允许对存储器单元做位选择或部分选择。

(8)函数调用:verilog中的函数和C语言中的函数没什么大的区别,都用来实现某个计算过程或完成某个事件处理。函数可以被随意调用,函数调用也可以作为表达式中的操作数。调用的函数可以是系统函数(以字符$开始)或用户定义的函数。

3.2 操作符

verilog的操作符有如下九种类型:

·算术操作符

·关系操作符

·相等操作符

·逻辑操作符

·按位操作符

·归约操作符

·移位操作符

·条件操作符

·连接和复制操作符

(1)算术操作符

+ - * 、 %

·整数除法截断所有小数部分。

·模操作符求出与第一个操作数符号相同的余数,如-7/4结果为-3。

·如果算术操作符的操作数中出现x或z,那么整个算术操作的运算结果为x。

·算术操作结果的长度

     进行算术操作时,表达式中操作数的长度可能不一致,这时运算结果的长度由最长的操作数决定。在赋值语句中,算术操作符结果的长度由操作符左端的赋值目标长度决定。

reg [0:3] Arc, Bar, Crt;

reg [0:5] Frx;

Arc = Bar + Crt;

Frx = Bar + Crt;

在第一个赋值中,加法操作的溢出部分被丢弃,而在第二个赋值中,任何溢出的为存储在位Frx[1]中。在较大的表达式中,中间结果的长度应取最大操作数的长度(在赋值时此规则也包括左端赋值目标)。

·无符号数和有符号数

     执行算术操作和赋值时,要注意哪些操作数时无符号数、哪些操作数是有符号数。无符号数存储在线网、一般寄存器和基数格式表示形式的整数中。有符号数存储在整数寄存器和十进制形式的整数中。

·关系操作符

       关系操作符是对两个操作数进行比较,如果比较结果为真则结果为1,如果比较结果为假则结果为0,关系操作符多用与条件判断。 > <   >=   <=

      如果操作数中有x或z出现,那么结果为x。

·相等操作符

四种:== !=   === !==             其中==和!=是比较逻辑值,由于操作数中某些位可能是x,所以比较结果也有可能是x。===和!==是按位比较,所以不会出现结果为x的情况。

·逻辑操作符

&&   ||   !

如果操作数是向量,那么非0向量被当作逻辑1。

·位操作符

位操作符是对操作数按位进行与、或、非等逻辑操作。

~:一元非       &:二元与    | : 二元或    ^~,~^二元异或或非

·规约操作符

规约操作符的操作数只有一个,并只产生一位结果。共有如下6种:

(1)& 规约与 将操作数的各位进行与操作的结果。

(2)~& 规约与非   与规约与相反。

(3)| 规约或 将操作数的各位进行或操作的结果。

(4)~| 规约或非

(5)^ 规约异或:某个位有x或z,结果为x,操作数有偶数个1,那么结果为0;否则为1。

·移位操作符

<<    >>

·条件操作符

条件操作符是根据条件表达式的值来选择执行表达式,形式如下:

cond_expr?expr1:expr2

      其中,con_expr是条件表达式,他的结果是真或假,expr1和expr2是待选的执行表达式。con_expr为真,选择执行1,否则选择执行2。如果con_expr为x或z,两个都要计算,然后对计算结果按位运算,某一位都为1,则结果为1,都为0,结果为0,否则为x。

·连接操作符

连接操作符是把位于大括号{}中的两个或以上用“,”分隔的小表达式按位连接在一起,形成一个大表达式。

·赋值操作符

=     或 <=   前者为阻塞赋值 后者为非阻塞赋值。

相关文章
|
存储 机器学习/深度学习 监控
物联网平台常见类别及对应平台(二)
物联网平台常见类别及对应平台(二)
638 21
|
数据可视化 前端开发 大数据
商场智能导视系统深度解析,AR与大数据融合创新商业运营模式
**商场智能导视系统提升购物体验:** 通过三维电子地图、AR导航、AR营销、VR全景导购及可视化数据,解决顾客寻路困扰,增强店铺曝光,简化招商流程,优化商场管理,借助科技创新驱动顾客满意度、品牌曝光度及运营效率的全面提升。
881 2
商场智能导视系统深度解析,AR与大数据融合创新商业运营模式
|
人工智能 自然语言处理 小程序
政务VR导航:跨界融合AI人工智能与大数据分析,打造全方位智能政务服务
政务大厅引入智能导航系统,解决寻路难、指引不足及咨询台压力大的问题。VR导视与AI助手提供在线预览、VR路线指引、智能客服和小程序服务,提高办事效率,减轻咨询台工作,优化群众体验,塑造智慧政务形象。通过线上线下结合,实现政务服务的高效便民。
466 2
政务VR导航:跨界融合AI人工智能与大数据分析,打造全方位智能政务服务
|
移动开发 小程序 物联网
智能车位引导系统:智能导航,便捷停车
摘要(Markdown格式): 智慧停车场结合室内定位导航技术,提升停车效率及用户体验。设计包括移动端H5导航小程序、大屏端智能联动,以及基于GIS的物联网管理。系统提供空余车位引导、车位预约、多样化寻车及AR导航等功能,支持与不同停车场系统对接,确保可扩展性。通过优化的离场引导,减少车主寻找出口的时间,整体提升了大型公共场所的客流管理和信息化水平。
1098 3
智能车位引导系统:智能导航,便捷停车
|
消息中间件 分布式计算 网络协议
从管道路由到共享内存:进程间通信的演变(内附通信方式经典面试题及详解)
进程间通信(Inter-Process Communication, IPC)是计算机科学中的一个重要概念,指的是运行在同一系统或不同系统上的多个进程之间互相发送和接收信息的能力。IPC机制允许进程间共享数据、协调执行流程,是实现分布式系统、多任务操作系统和并发编程的基础。
355 1
从管道路由到共享内存:进程间通信的演变(内附通信方式经典面试题及详解)
|
机器学习/深度学习 JSON 人工智能
「寻找热爱技术创作的你:写下你在技术探中的实践和思考」 零一万物大模型开放平台 第四天 我爱我园
在PowerShell中,由于安全策略,直接使用curl命令(实为`Invoke-WebRequest`别名)从特定URL请求数据时,可能出现错误。修正后的`Invoke-RestMethod`示例展示了如何向API发送POST请求,包含授权头、JSON体,并处理返回的数据。尽管成功展示了如何描述一张图片,但尝试对网上.html格式的图片进行分析时失败,因为需要的是可直接访问的网络图片URL。
「寻找热爱技术创作的你:写下你在技术探中的实践和思考」 零一万物大模型开放平台  第四天  我爱我园
|
存储 安全 编译器
Python学习日记(一:List、Tuple、dictionary)
1.列表、元组和字典都是序列 2.列表字典可以修改和删除序列中的某个元素,而元组就是一个整体,不能修改和删除,一定要修改或删除的话,只能修改和删除整个元组。 3.既然元组不能删除和修改,有什么作用呢? 1.元组比列表遍历速度快,因为元组是一个整体,运算效率高; 2.正是因为不能修改,元组可以保护不需要修改的数据,可以使代码结构更安全。
232 2
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
674 1
|
JavaScript 前端开发
一个好看的vue admin模板
这是一个关于Vue管理模板的引用,提到了[PanJiaChen](https://github.com/PanJiaChen/vue-admin-template)在GitHub上的`vue-admin-template`项目。该项目是一个前端管理模板,链接指向了详细的资源。页面中还包含了一张图片,但markdown格式中无法直接显示。简而言之,这是关于一个基于Vue的后台管理界面模板的参考信息。
|
存储 Shell 数据处理
深入浅出:进程管理的艺术
进程可以被视为一个执行中的程序实例,它包含了程序代码、数据集以及一个描述其状态和控制信息的进程控制块(Process Control Block, PCB)。操作系统通过PCB来跟踪和控制进程的执行状态,包括进程的ID、内存映射、打开的文件、状态信息等。
248 1