VerilogHDL是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。
1.1 Verilog基础语法
1.11 逻辑值
- 0: 逻辑低电平,条件为假;
- 1:逻辑高电平,条件为真;
- z:高阻态,无驱动:
- X:未知逻辑电平;
1.12 关键字
module 模块开始定义
input 输入端口定义
output 输出端口定义
inout 双向端口定义
integer 寄存器数据类型
parameter 信号的参数定义
localparam 信号的参数定义
wire wire 线网型变量
reg reg 寄存器型变量
always 产生reg信号语句的关键字
assign 产生wire信号语句的关键字
begin 语句的起始标志
end 语句的结束标志
posedge/negedge 时序电路的标志
case Case 语句起始标记
default Case 语句的默认分支标志
endcase Case 语句结束标记
if if/else 语句标记
else if/else 语句标记
for for 语句标记
endmodule 模块结束定义
module -------- 模块开始定义,后续跟着模块名
moudle 模块名(一般与 .v 文件的名称是一致的)
wire -------- 线网型变量
wire 可以看作直接的连接,在可综合逻辑中,会被映射成一条真实存在的物理引线
reg -------- 寄存器型变量,变量为无符号数
reg 对有某一时间点,进行保持的功能。在可综合逻辑中,会被映射成一条真实存寄存器
integer -------- 寄存器型变量,变量为有符号数
integer的位宽为宿主机的字的位数,但最小为32位,integer定义为32bit的总线
for循环变量需要使用integer类型
parameter -------- 参数定义
parameter 可以在顶层文件通过实例化,来对此功能模块中的参数呢进行修改
localparam -------- 参数定义
localparam 只能在模块内部使用,不能进行实例化
always -------- 描述组合逻辑以及时序逻辑的语法
always@(敏感条件)
什么是敏感条件:
简单理解,当敏感条件中的电平发生变化的时候,触发一次语句
同时敏感条件中可以填入 * 号 *号表达的意思是通配符
简单理解: 只要有任何一个信号发生变化的时候,都会触发这个语句。
always块是Verilog中用来描述组合逻辑以及时序逻辑的语法。
需要补充的是一个设计中可以有多个always块,或者说一定有很多个always块。
这些硬件块都是相互独立同时工作的。每个块之间的连接是决定数据流的原因。为了模拟这种行为,一个always块被做成一个连续的过程(硬件不可能断断续续工作),当敏感列表中的一个信号变化时,它就会被触发并执行一些动作(always块内的语句)。
reg 无符号整数变量,可以选择不同的位宽。
integer 有符号整数变量,32位宽,算术运算可产生2的补码。
real 有符号的浮点数,双精度。
time 无符号整数变量,64位宽(Verilog-XL仿真工具用64位的正数来记录仿真时刻)
1.13 常量
在程序运行过程中,其值不能被改变的量,称为常量
- parameter常量(或称符号常量)
- 数字(包括整数、x和z、负数)
x:指不定值,0/1,寄存器类型变量(无初值时为x)
z: 指高阻态,断开
整数型常量(整常量)
整数型常量(整常量)
- 二进制整数**(b/B)**
- 八进制整数**(o/O)**
- 十进制整数**(d/D)**
- 十六进制整数**(h/H)**
常量一般用基数表示法
-
位宽指换算为二进制后位宽的总长度
-
为提高可读性,较长数字之间可用下划线隔开,但不能用在<进制><数字>之间。
例如:
8'd171 指的是 位宽为8bit,十进制171
8'hab 指的是 位宽为8bit,十六进制数ab
8'o253 指的是 位宽为8bit,八进制数253
8'b1010_1011 指的是 位宽为8bit,二进制数10101011
换算为二进制后的位宽总长度:可有可无,verilog会自动为常量匹配合适的位宽,当总位宽长度大于实际位宽,自动向左边补零,
当总位宽长度小于实际位宽,则自动截断左边超出的位数
例如:
大于实际位宽:
'd7与8'd7:表示相同数值,8'd7换算为二进制就是8"b0000 0111,前面5位补0;
小于实际位宽:
2'd7换算为二进制就是2 b11,超过2位宽的部分被截断。
如果直接写参数,例如100,表示位宽为32bit的十进制数100.
1.14.阻塞赋值
可以理解为顺序执行,执行完一条才会向后面执行
a=1;
b=2;
c=3;
begin
a = b;
c = a;
end
/*
最后结果为:
a=2
b=2
c=2
*/
1.15.非阻塞赋值
可以理解为并行执行(同时执行),全部一起执行的
a=1;
b=2;
c=3;
begin
a <= b;
c <= a;
end
/*
最后结果为:
a=2
b=2
c=1
*/