VerilogHDL中总共有19种数据类型。数据类型是用来表示数字电路硬件中的数据储存和传送元素的。它们是:
reg型、wire型、integer型和parameter型(最基本的四种)以及
large型、medium型、scalared型、time型、small型、tri型、trio型、tril型、triand型、trior型、trireg型、vectored型、wand型和wor型。
1.常量
1.数字
- 整数:
有二进制(b或B)、十进制(d或D)、十六进制(h或H)、八进制(o或O)四种表示方式。
表达方式如下:(1)<位宽><进制><数字>(常用)
(2)<进制><数字>位宽为默认位宽(一般不少于32位)
(3)<数字>默认十进制
在表达式中,位宽指明了数字的精确位数。例如:一个4位二进制数的数字的位宽为4,一个4位十六进制数数字的位宽为16(因为每单个十六进制数就要用4位二进制数来表示)。
例如:
8'b10101111
位宽为8的二进制表示,'b表示二进制
8'ha2
位宽为8的数十六进制表示
- x和z值
x和z值在数字电 路中,x代表不定值,z代表高阻值。一个x可以用来定义十六进
制数的4位二进制数的状态、八进制数的3位、二进制数的1位。z的表示方式同x类似。z还有一种表达方式是可以写作“?”。在使用case表达式时建议使用这种写法,以提高程序的可读性
4'b10x0 //位宽为4的二进制数从低位数起第2位为不定值
4'b101z //位宽为4的二进制数从低位数起第1位为高阻值
12'dz //位宽为12的十进制数,其值为高阻值(第1种表达方式)
12'd? //位宽为12的十进制数,其值为高阻值(第2种表达方式)
8'h4x //位宽为8的十六进制数,其低4位值为不定值
- 负数
注意:减号不可以放在位宽和进制之间,也不可以放在进制和具体的数之间。
4. 8'd5 //这个表达式代表5的补数(用八位二进制数表示)
8'd- 5 //非法格式
2.参数(parameter)型
在VerilogHDL中用parameter来定义常量,即用parameter来定义一个标识符代表一个常量,称为符号常量,即标识符形式的常量,采用标识符代表一个常量可提高程序的可读性和可维护性(本人认为可理解C中的#define或者const)。parameter型数据是一种常数型的数据,其说明格式如下:
parameter msb=7; //定义参数msb为常量7
parameter e=25, f= 29; //定义两个常数参数
parameter r=5.7; //声明r为一个实型参数
parameter byte_ size=8, byte. 'msb= byte_ size - 1; //用常数表达式赋值
2.变量
1.wire类型
wire型数据常用来表示用以assign关键字指定的组合逻辑信号。Verilog 程序模块中输入、输出信号类型默认时自动定义为wire型。wire型信号可以用做任何方程式的输人,也可以用做“assign"语句或实例元件的输出。
wire型信号的格式同reg型信号的格式很类似。其格式如下:
wire [n-1:0]数据名1,数据名2,...数据名i; //共有i条总线,每条总线内有n条线路,
或
wire [n:1]数据名1,数据名2,...数据名i.
[n-1:0]和[n:1]都能表示总共是n个位宽
2.reg型
寄存器是数据储存单元的抽象。寄存器数据类型的关键字是reg。通过赋值语句可以改变寄存器储存的值,其作用与改变触发器储存的值相当。reg类型数据的默认初始值为不定值x。
如:reg rega
定义了一个1位的名为rega的reg型数据
reg[3:0] regb
定义了一个4位的名为regb的reg型数型
reg型数据常用来表示“always”模块内的指定信号,常代表触发器。通常,在设计中要由“always” 模块通过使用行为描述语句来表达逻辑关系。在“always"模块内被赋值的每一个信号都必须定义成reg型(但reg并不是只能是寄存器或触发器的输出)。
3.memory型
Verilog HDL通过对reg型变量建立数组来对存储器建模,可以描述RAM型存储器、
ROM存储器和reg文件。数组中的每一个单元通过一个数组索引进行寻址。在Verilog语言中没有多维数组存在,memory型数据是通过扩展reg型数据的地址范围来生成的。格式:reg[n-1:0] 存储器名[m-1:0]
或reg[n-1:0] 存储器名[m:1]
在这里,reg[n-1:0]定义了存储器中每一个存储单元的大小,即该存储单元是一个n位的寄存器;存储器名后的[m-1:0]或[m:1]则定义了该存储器中有多少个这样的寄存器;最后用分号结束定义语句。下面举例说明:
reg[7:0] m[255:0];
这个例子定义了一个名为m的存储器,该存储器有256个8位的寄存器构成的存储器组,该存储器的地址范围是0到255。
reg[n- 1:0] m;//一个n位的寄存器
reg m[n- 1:0];//一个由n个1位寄存器构成的存储器组
如果想对memory中的存储单元进行读写操作,必须指定该单元在存储器中的地址。下面的写法是正确的:
m[3]=0; //给memory中的第3个存储单元赋值为0
3.赋值
Verilog HDL有两种为变量赋值的方法
一种叫做连续赋值(Continuous Assignment),另一种叫做过程赋值(Procedural Assignment)。
过程赋值又分为阻塞赋值(Blocking Assignment)和非阻塞赋值(Nonblocking Assignment)
1.连续赋值
连续赋值是为线网型变量提供驱动的一种方法,它只能为线网型变量赋值,并且线网型变量也必须用连续赋值的方法赋值。
最基本的格式:assign # [延时量] 线网型变量名 =赋值表达式
赋值表达式可以是 a.标量 b.向量线网 c.向量寄存器 d.函数调用;
执行过程:连续赋值语句总是处于激活状态,只要右侧表达式中的任意一个操作数发生变化,表达式就会被立即重新计算,并且将结果赋值给对象。
2.过程赋值
过程赋值提供了为寄存器型变量赋值的方法,出现的位置是在各种块结构中,例如always块、 initial块等。
经过赋值后,变量(reg,integer,real,time)的取值保持不变,直到触发条件。
过程赋值又分为阻塞赋值和非阻塞赋值两种。—>关于阻塞和非阻塞赋值的理解