Verilog逻辑值
逻辑电路中有四种值:
-----逻辑0:表示低电平,对应电路中的GND
-----逻辑1:表示高电平,对应电路中的VCC
-----逻辑X:表示未知,高低电平都有可能
-----逻辑Z:表示高阻态,外部没有激励信号,是一个悬空状态
Verilog标识符
规范建议:
----- 1、名字起得有实际意义。(例如 sum、cpu)
----- 2、用下划线区分词语组合。(例如 sum_cpu)
----- 3、统一缩写
----- 4、参数统一全部大写(例如 SIZE)
----- 5、同一标识符在不同层次时,保持一致性。
----- 6、自定义的标识符不能与关键词同名
Verilog进制格式
二进制:4’b0101 —— 表示4位二进制数字0101
十进制:4’d2 ——表示4位十进制数字2(二进制0010)
十六进制:4’ha ——表示4位十六进制数字a(二进制1010)
(注意:十六进制的计数方式为0、1、2、…、9、a(10)、b、c、d、e、f)
当代码中没有指定数字位宽与进制时,默认为32位的十进制。
(例如:100,实际上是32’d100)
Verilog的数据类型
Verilog语句中主要有三大数据类型------寄存器类型、线网类型、参数类型。
真正在电路中起作用的是前两者。
(一)寄存器类型
寄存器相当于一个抽象的数据存储单元
只能在 always 语句和 initial 语句中被赋值
它的值从一个赋值到另一个赋值过程中被保存下来。
如果该过程语句描述是—时序逻辑,也就是always语句带有时钟信号,则该寄存器变量对应为—寄存器。
如果该过程语句描述是—组合逻辑,也就是always语句不带有时钟信号,则该寄存器变量对应为—硬件连线
寄存器类型 的 缺省值(默认值) 是 x(未知状态)
寄存器数据类型有很多种,例如:reg、integer、real等,其中最常用的就是reg类型
(这里先暂时只介绍reg,其他的后面补)
reg类型使用注意事项:
1、reg类型默认初值是不定值x
2、reg类型可以有0、1、x、z四种取值
3、always模块内被赋值的信号,必须定义为reg型,代表触发器
4、reg相当于存储单元
5、reg一定要有时钟触发,输出才会反映输入
代码示例:
reg [31:0] delay_cnt;//延时计数器
reg key_flag;//按键标志
reg [7:0] counter = 8'h0; // 声明一个 8 位十六进制寄存器变量 counter,初始值为 0
(二)线网类型
线网相当于Verilog结构化元件之间的物理连线。
它的值由驱动元件决定,例如—连续的赋值 或 门的输出
如果没有驱动元件连接到线网,线网的缺省值为z(高阻态)
种类也有很多,最常用的的就是wire类型
wire类型使用注意事项:
1、wire是一个连续的信号类型,传输的值即使更新,不需要时钟触发
2、通常用于连接不同模块、逻辑元件或传递信号
3、wire也可以有0、1、x、z四种取值
4、wire只能在assign语句中被连续赋值
代码示例:
wire data_en; //数据使能信号
wire [7:0] data; //数据
input wire in_data, // 定义一个输入端口 in_data
output wire out_data // 定义一个输出端口 out_data
——
(三)输入输出—input和output
在 Verilog 中, 当你使用这些关键字来定义模块的输入和输出端口时,input 和 output 定义的端口变量类型通常默认为wire 类型。这对于连接不同模块之间的信号或进行逻辑数据传输是非常常见和方便的。
(四)参数类型
参数其实就是一个常量,常被用于定义状态机的状态、数据位宽、延迟大小等。
它可以在编译的时候修改参数的值,因此又被用于一些参数可调的模块,使用户在实例化模块时,可以根据需要配置参数。
定义时,可以一次性定义多个参数,参数之间需要用逗号隔开。
参数的定义是局部的,只在当前模块有效。
parameter DATA_WIDTH = 8; // 数据位宽8位
parameter用于定义常量,不允许在运行时修改它的值。可以写在模块内部也可以写在头部。