本节的文档编号:001100000037
需要看对应的视频,请点击视频编号: 001100000052
1、本节主要介绍,Verilog HDL的信号类型,主要包括两种数据类型:线网类型(net type)和寄存器类型(reg type),在进行工程设计中也只会使用到这两个类型的信号;信号位宽,定义信号类型的同时,必须定义好信号的位宽,取决于该信号要表示的最大值,例如a信号的最大值为1000,那么信号a的位宽必须大于或等于10位;线网类型wire,用于对结构化器件之间的物理连接的建模,代表的是物理连接线,不存储其逻辑值,通常用assign进行赋值;寄存器类型reg,通常用于对存储单元的描述,如D型触发器、ROM等。必须注意的是:reg类型的变量不一定是存储单元,如在always语句中进行描述的必须是用reg类型的变量;wire和reg的区别,
2、本书总结出一套解决方法:在本模块中使用always设计的信号都定义为reg型,其他都定义为wire型。
3、ALTERA和VIVADO文档
第4节 信号类型 Verilog HDL的信号类型有很多种,主要包括两种数据类型:线网类型(net type) 和寄存器类型(reg type)。 笔者在进行工程设计过程中,也是只会使用到这两个类型的信号。 4.1 信号位宽 定义信号类型的同时,必须定义好信号的位宽。默认信号的位宽是1位,当信号的位宽为1时可不表述, 如定义位宽为1的wire型信号a可直接用“wire a;”来表示。但信号的位宽大于1位时就一定要表示出来, 如用“wire [7:0]”来表示该wire型信号的位宽为8位。
信号的位宽取决于要该信号要表示的最大值。该信号能表示的无符号数最大值是:2n-1,其中n
表示该信号的位宽。例如,信号a的最大值为1000,那么信号a的位宽必须大于或等于10位。
下面向读者分享一个位宽计算技巧:打开电脑的“计算器”后选用程序员模式,在在10进制下
输入信号值,如1000,随后可以查看信号位宽。
4.2 线网类型wire
线网类型用于对结构化器件之间的物理连线的建模,如器件的管脚,芯片内部器件如与门的输出
等。由于线网类型代表的是物理连接线,因此其不存储逻辑值,必须由器件驱动。通常用assign 进行赋值, 如 assign A = B ^ C。
wire 类型定义语法如下:
wire [msb: lsb] wire1, wire2, . . .,wireN;
下面对上述情况进行举例说明:
wire [3:0] Sat; // Sat为4 位线型信号
wire Cnt; //1 位线型信号
wire [31:0] Kisp, Pisp, Lisp ;// Kisp, Pisp, Lisp 都是32位的线型信号。
4.3 寄存器类型reg reg 是最常用的寄存器类型,寄存器类型通常用于对存储单元的描述,如D型触发器、ROM 等。 寄存器类型信号的特点是在某种触发机制下分配了一个值,在下一触发机制到来之前保留原值。 但必须注意的是:reg 类型的变量不一定是存储单元, 如在always语句中进行描述的必须是用reg 类型的变量。
reg 类型定义语法如下:
reg [msb: lsb] reg1, reg2, . . . reg N;
例如:
reg [3:0] Sat; // Sat为4 位寄存器。
reg Cnt; //1 位寄存器。
reg [32:1] Kisp, Pisp, Lisp ; //不建议这样定义。
4.4 wire和reg的区别 reg型信号并不一定生成寄存器。针对什么时候使用wire类型,什么时候用reg类型这一问题, 笔者总结出一套方法:在本模块中使用always设计的信号都定义为reg型,其他信号都定义为wire型。
上述代码中,cnt1是用always设计的,所以定义为reg型。 add_cnt1和end_cnt不是由always产生的,所以定义为wire型。
上述代码中,信号x是用always设计的,所以要定义为reg型。 注意:实际的电路中信号x不是寄存器类型,但仍然定义为reg型。
以上是例化的代码,其中df是例化模块的输出。 由于df不是由always产生的,而是例化产生的,因此要定义成wire型。 |