FPGA开发verilog语法基础1-LMLPHP

主体内容

1.1 逻辑值

       1,逻辑0,表示低电平

       2,逻辑1,表示高电平

       3,逻辑X,表示未知,有可能是高电平,也有可能是低电平(不区分x和X)

       4,逻辑Z,表示高阻态,外部没有激励信号,是一个悬空状态(不区分z和Z)

1.2 数字进制格式

       Verilog数字进制格式包括二进制(b)八进制(o)十进制(d)十六进制(h)。(注意对应的字母!)一般常用的为二进制、十进制和十六进制。

eg:

       4’b0101:表示4位二进制数字0101

       4’d2:表示4位十进制数字2(二进制0010)

       4’ha:表示4位十六进制数字a(二进制1010)

​       16’b1001_1010_1010_1001 = 16’h9AA9

数值的整数及其表示注意以下事项!!!

       1,在较长的数之间可以用下划线来分开,目的是提高可读性,下划线本身没有意义,但下划线符号不能用作首字符;

       2,当数字没有说明位宽时,默认为32位

       3,若没有定义一个整数的位宽,其宽度为相应值中定义的位数

eg:

'o642	//9位八进制数
'hBD	//8位十六进制数

       4,若定义的位宽比实际数的位宽大,则在左边用0补齐。但如果数最左边一位为x或z,就相应地用x或z在左边补齐,如果定义的位宽比实际数的位宽小,那么最左边的位被截断

       5,“?”是高阻态 z 的另一种表示符号,在数字的表示中,字符 “?” 和 Z 或 z 是等价的,可以互相替代。

       6,整数可以带正负号,并且正负号应写在最左边。负数表示为二进制的补码形式

eg:

4'd-4	//错误表达
-4		//等价于4'b1100

       7,如果位宽和进制都缺省,则代表十进制数

       8,位宽不能是表达式形式。

eg:

(4+4)'b11	//错误表达

1.3 数据类型

       在 Verilog 语言中,主要有三大类数据类型:寄存器数据类型、线网数据类型和参数数据类型。其中寄存器与线网类型都可以映射到实际物理电路上的,是真正在数字电路中起作用的。

1.3.1 寄存器类型

       寄存器数据类型的关键字是 reg,reg 类型数据的默认初始值为不定值x。在过程块内被赋值的每一个信号都必须定义为reg类型,reg类型的数据只能在 always 语句initial 语句中被赋值。且在定义reg型变量时,未指定位宽则默认为1

       与下面说的线网类型不同,reg 型数据保持最后一次的赋值,而 wire 型数据需要有持续的驱动

reg [31:0] delay_cnt;
reg key_reg;

       如果该过程语句描述的是时序逻辑,即always语句带有时钟信号,则该寄存器变量对应为触发器

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

1.3.2 线网类型

​       线网数据类型表示结构实体(例如门)之间的物理连线。线网类型的变量不能储存值,它的值是由驱动它的元件所决定的。驱动线网类型变量的元件有门、连续赋值语句、assign等。如果没有驱动元件连接到线网类型的变量上,则该变量就是高阻的,即其值为z。且在定义线网型变量时,未指定位宽则默认为1

       线网数据类型包括 wire 型tri 型,其中最常用的就是 wire 类型

wire key_flag;
1.3.3 参数类型

       参数其实就是一个常量,在 Verilog HDL 中用 parameter 定义常量。我们可以一次定义多个参数,参数与参数之间需要用逗号隔开。每个参数定义的右边必须是一个常数表达式。类似于C语言中的#define

       参数型数据常用于定义状态机的状态、数据位宽和延迟大小等。采用标识符来代表一个常量可以提高程序的可读性和可维护性。在模块调用时,可通过参数传递来改变被调用模块中已定义的参数。

parameter H_SYNC = 11'd41;
1.3.4 存储器类型

       存储器(memory)本质上还是寄存器型变量阵列,只是 Verilog 中没有多维数组,所以就用 reg 型变量建立寄存器组(数组)来实现存储器的功能,也就是拓展的reg型数据地址范围。存储器类型变量可以描述 RAM 型、ROM 型存储器以及 reg 文件。数组中的每一个单元通过一个数组索引进行寻址

​       存储器型变量的一般声明格式如下:

reg <range1><name_of_register><range2>

​       其中 range1 和 range2 都是可选项缺省时都为1。range1 表示存储器寄存器的位宽;range2表示寄存器的个数

eg:

reg [7:0] mem1 [255:0];		//定义了一个有256个8位寄存器的存储器mem1,地址范围是0~255
reg [15:0] mem2 [127:0], reg1, reg2;	//定义了一个具有128个16位寄存器的存储器mem2和
										//2个16位的寄存器reg1和reg2

参考资料

1,正点原子领航者ZYNQ7020视频

2,《verilog HDL数字集成电路设计原理与应用(第二版)》 蔡觉平等

3,文心一言搜索结果

10-25 09:08