每日签到 地址发布 老王说明书 宣传中心 繁/简
此板块只作为纯讨论

正经话题,不搞色情!贤者时间必备
查看: 1.2K|回复: 0
收起左侧

[学习讨论] 【芝士】VLSI第五讲:Verilog HDL常量与数据类型

[复制链接]
发表于 2026-7-24 14:56:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?免费注册

x
依旧写点科普文赚点CHEESE币(
为了减轻学习的难度,每一篇都不会介绍很多东西,避免东西太多难以理解,这一篇是常量和数据类型

一、常量(Constants)
所谓常量,就是在程序运行期间值不能被改变的量。Verilog里的常量主要有三种类型:整数、实数和字符串。

二、整数(Integer)
整数是Verilog里最常用的常量,写法比较特殊,一般格式是:
+/- <size> '<base> <value>
其中:
+/- 可选的符号位,正负号
size 位宽,表示这个数占多少位
' 单引号,是必须的
base 进制,有四种写法:
b 或 B:二进制
d 或 D 或省略:十进制
h 或 H:十六进制
o 或 O:八进制
value 数字序列

举例:
8'b11000101    //位宽为8位的二进制数
8'd162         //位宽为8位的十进制数
8'B1100_0101   //下划线只是为了好看,不影响数值
'hAF           //省略位宽,十六进制
'o721          //省略位宽,八进制

写整数的时候有几个坑要注意:
1)长数之间可以用下划线分开,比如 16'b1010_1101_0010_1001,这样看位数更清楚
2)不写位宽的话,默认是32位
3)x 代表不定值,z 代表高阻值,二进制里是1位,八进制里是3位,十六进制里是4位
   4'b10x0    //第2位为不定值
   8'b1001xxxx  //等价于 8'h9x
4)位宽比实际位数长,左边自动补0;最左边是x或z就用x或z补
   10'b10    //补成 0000000010
   10'bx0x1  //补成 xxxxxxx0x1
5)位宽比实际位数短,左边就被截断
   3'b1001_0011  //等价于 3'b011
6)? 符号和 z 完全等价,可以互换
7)负数写在最前面,表示二进制的补码形式
   -8'd5    //表示5的补码
   8'd-5    //这种写法非法,不要写

三、实数(Real)
实数在硬件描述里用得不多,主要用于仿真。Verilog里的实数有两种写法:
十进制表示法:比如 2.0、0.1(小数点两边都必须有数字,单独写"."是非法的)
科学计数法:比如 5.1e2(=510.0)、9.6E2(=960.0)、5E-4(=0.0005)
e和E是一个意思,都能用。

四、字符串(Strings)
字符串是双引号包起来的一串字符,主要用于仿真时打印信息,比如:
"INTERNAL ERROR"
字符串不能拆成多行写。Verilog里的字符串其实是按位宽为8的reg型变量来存的,存"Hello world!"(12个字符)就需要 8*12=96 位的reg变量:
reg [8*12:1] stringvar;
initial begin
    stringvar = "Hello world!";
end
字符串里支持 \n(换行)、\t(制表符)这些C语言里常用的转义字符。

五、数据类型(Data Type)
数据类型是用来描述电路里物理连线、数据存储和数据传输这些实际东西的。Verilog里有四种基本的逻辑状态:
0:低电平、逻辑假
1:高电平、逻辑真
x 或 X:不确定或未知状态
z 或 Z:高阻态(不区分大小写)

六、变量分类
Verilog里的变量分两种大类:
net型(网络连线):常用的有 wire、tri,由驱动端信号决定其值
variable型(变量):常用的有 reg、integer

注:在Verilog-1995标准里 variable型叫做 register型,到了Verilog-2001标准改名为 variable,避免大家把它和硬件里真正的寄存器搞混。

七、net型变量
wire是最常用的net型变量,对应电路里一根普通的物理连线。wire的驱动方式有两种:一种是在结构描述里把它连到门或模块的输出端,另一种是用 assign 持续赋值。
写法:
wire a, b;            //定义两个wire型变量
wire [7:0] databus;   //定义一个8位的wire型变量(8位总线)

tri型和wire型功能完全一样,只是强调这个信号可能被多个驱动源驱动。综合器对两者的处理没区别,主要是为了让代码更易读。

八、variable型变量
variable型变量必须放在过程语句(initial或always块)里赋值。在这些过程块里被赋值的信号必须声明成variable型(一般是reg型)。
注意:variable型变量并不一定对应硬件里的触发器或锁存器,综合器会根据上下文决定把它映射成连线还是触发器。
reg型是最常用的variable型变量:
reg a, b;            //两个1位reg型变量
reg [7:0] qout;      //8位的reg型向量

integer型是有符号整数变量,比如可以用作循环变量:
integer i;
for (i = 0; i < 8; i = i + 1)
    ...



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 免费注册
点击进行验证

本版积分规则

我们不生产资源,只做资源的搬运工。

广告合作-tags标签-app下载-Archiver-小黑屋-