软硬件学习记录5—— Verilog语言中的数据类型

Verilog语言中的数据类型

在 Verilog 语言中,主要有三大类数据类型:寄存器数据类型线网数据类型参数数据类型

1、寄存器类型 reg

1.1 概述:
寄存器数据类型的关键字是 reg,reg 类型数据的默认初始值为不定值x

reg 是最常用的寄存器类型,寄存器类型通常用于对存储单元的描述,如 D 型触发器、 ROM等。

寄存器类型信号的特点是在某种触发机制下分配了一个值,在下一触发机制到来之前保留原值。

reg类型的数据只能在 always 语句和 initial 语句中被赋值。

  • 如果该过程语句描述的是时序逻辑,即always语句带有时钟信号,则该寄存器变量对应为触发器;
  • 如果该过程语句描述的是组合逻辑,即always语句不带有时钟信号,则该寄存器变量对应为硬件连线;

1.2 reg 类型定义语法如下:

reg [msb: lsb] reg1, reg2, . . . reg N;
  • msb 和 lsb 定义了范围,表示了位宽。例如 [7:0] 是 8 位位宽,也就是可以表示成 8’b0 至 8’b1111_1111;
  • msb 和 lsb 必须为常数值;
  • 如果没有定义范围,缺省值为 1 位;
  • 没有定义信号数据类型时,缺省为 wire 类型,不是 reg 型。
  • 对数组类型按照降序方式,如 [7:0] ;不要写成 [0:7] 。

1.3 举例说明:

reg [3:0] Sat;  // Sat 为 4 位寄存器型信号。
reg Cnt;        //1 位寄存器。
reg [31:0] Kisp, Pisp, Lisp ;  // Kisp, Pisp, Lisp 都是 32 位的寄存器型信号。
2、线网类型 wire

2.1 概述:

  • 线网数据类型表示结构实体(例如门)之间的物理连线。
  • 线网类型的变量不能储存值,它的值是由驱动它的元件所决定的。
  • 驱动线网类型变量的元件有门、连续赋值语句、assign等。
  • 如果没有驱动元件连接到线网类型的变量上,则该变量就是高阻的,即其值为z。
  • 线网数据类型包括 wire 型和 tri 型,其中最常用的就是 wire 类型。

2.2 wire 类型定义语法如下:

wire [msb: lsb] wire1, wire2, . . .,wireN ;
  • msb 和 lsb 定义了范围,表示了位宽。例如 [7:0] 是 8 位位宽,也就是可以表示成 8’b0 至 8’b1111_1111;
  • msb 和 lsb 必须为常数值;
  • 如果没有定义范围,缺省值为 1 位;
  • 没有定义信号数据类型时,缺省为 wire 类型。
  • 注意数组类型按照降序方式,如 [7: 0] ,不要写成 [0:7]。

2.3 举例说明:

wire [3:0] Sat; // Sat 为 4 位线型信号
wire Cnt;       //1 位线型信号
wire [31:0] Kisp, Pisp, Lisp ; // Kisp, Pisp, Lisp 都是 32 位的线型信号
3、参数类型

3.1 概述:

  • 参数其实就是一个常量,在 Verilog HDL 中用 parameter 定义常量。
  • 我们可以一次定义多个参数,参数与参数之间需要用逗号隔开。
  • 每个参数定义的右边必须是一个常数表达式
  • 参数型数据常用于定义状态机的状态数据位宽延迟大小等。
  • 采用标识符来代表一个常量可以提高程序的可读性和可维护性。
  • 在模块调用时,可通过参数传递来改变被调用模块中已定义的参数。

3.2 举例说明:

parameter WHITE = 16'b11111_111111_11111;
parameter RED = 16'b11111_000000_00000;
parameter GREEN = 16'b00000_111111_00000;
parameter BLUE = 16'b00000_000000_11111;
parameter YELLOW = 16'b11111_111111_00000;
4、信号位宽(补充内容)

定义信号类型的同时,必须定义好信号的位宽。默认信号的位宽是 1 位,当信号的位宽为 1 时可不表述,如定义位宽为 1 的 wire 型信号 a 可直接用“ wire a;”来表示。但信号的位宽大于 1 位时就一定要表示出来,如用“ wire [7:0]”来表示该 wire 型信号的位宽为 8 位。

信号的位宽取决于要该信号要表示的最大值。该信号能表示的无符号数最大值是: 2n-1,其中 n表示该信号的位宽。例如,信号 a 的最大值为 1000,那么信号 a 的位宽必须大于或等于 10 位。

下面分享一个位宽计算技巧:打开电脑的“计算器”后选用程序员模式,在在 10 进制下输入信号值,如 1000,随后可以查看信号位宽。

你可能感兴趣的:(软硬件学习,Verilog,reg,wire)