逻辑值:
逻辑0:表示低电平,对应电路中GND;
逻辑1:表示高电平,对应电路中的VCC;
逻辑X:表示未知,有可能是高电平,也有可能是低电平;
逻辑Z:表示高阻态,是一个悬空状态。
数字进制格式:
二进制表示如下:4'b0101表示4位二进制数字0101
十进制表示如下:4'd2表示4位十进制数字2
十六进制表示如下:4'ha表示4位十六进制数字a
(因为计算机处理的二进制数据,所以最前面的数字始终表示二进制位宽,当前面没有指出位宽时('d2),默认32位;在没有指出进制时,默认十进制(100表示32位的十进制数字100))
16’b1001_1010_1010_1001中的下划线主要由于突出显示,增加可读性,下划线在程序编译中会被直接忽略
标识符(类似于C语言的变量),可以用于定义模块名、端口名、信号名等。
标识符可以是字母、数字、下划线和$的组合,但第一个字符必须是字母或者下划线,区分大小写
(不建议大小写混合使用例如首字母大写,普通内部信号建议小写)
数据类型:寄存器数据类型、线网数据类型和参数数据类型,其中真正在数字电路中起作用的数据类型是寄存器数据类型和线网数据类型。而参数数据类型是给编译器识别的。
寄存器数据类型:寄存器表示一个抽象的数据存储单元,通过赋值语句可以改变寄存器存储的值,寄存器数据类型的关键字为reg,默认初始值为不定制X,
以下为定义寄存器类型数据的示例 :reg [31:0] delay_cnt;
reg key_reg;
(其中[31:0]表示该数据的位宽为32位,必须遵从高位在前的写法,当没有写出具体位宽时,默认为1位)
reg类型的数据只能在always语句和initial语句中被赋值。
如果该过程语句是时序逻辑,即always语句带有时钟信号,则该寄存器变量对应为触发器;
如果该过程语句描述的是组合逻辑,即always语句中不带有时钟信号,则该寄存器变量对应为硬件连线。
线网数据类型:表示的是结构实体(例如门)之间的物理连线,不能够存储值,它的值是有驱动他的元件所决定,即不需要给这类变量赋值
驱动线网类型变量的元件有门、连续赋值语句、assign等。
如果没有驱动元件连接到线网类型的变量上,则该变量就是高阻Z
线网数据类型的关键字为wire和tri,最常用的是wire型,
以下为定义线网类型数据的示例 :wire[1:0] key_flag;
wire key1;
参数数据类型:该类型的数据其实就是一个常量,其关键字为parameter
以下为定义参数数据类型(常量,类似于#define)的示例 :
parameter H_SYNC = 11'd41;
参数型数据类型常用于定义状态机的状态、数据位宽和延迟大小,在尝试不同参数对程序影响时有很大的便利性。在模块调用时,可以通过参数传递来改变被调用模块中已定义的参数。
运算符: [/]:整除
[!]=:不等于
[!]:非
[&&]:与
[ || ]:或
[a?b:c] :a为真选b
[~]:按位非
[&]:按位与
[ | ]:按位或
[^]:按位异或
[<<]:左移,4'b1001<<2=6'100100;左移位宽会增加
[>>]:右移,4'b1001>>1=4'b0100;右移位宽不变,会抛弃最低位的数值
Verilog的关键字:
module :模块开始定义
endmodule :模块结束定义
input :输入端口定义
output :输出端口定义
inout :双向端口定义
parameter :信号的参数定义(常量宏定义)
wire :wire信号定义
reg :reg信号定义
always :产生Reg信号语句的关键字
assign :产生wire信号语句的关键字
begin :语句的起始标志
end :语句的结束标志
edge/posedge/negedge:时序电路的标志
verilog的程序框架:
verilog的基本设计单元时“模块”(相当于C语言中的函数),一个模块有两个部分组成,一部分描述接口,另一部分描述逻辑功能: module block(a,b,c,d);
input a,b;
output c,d;
assign c=a|b;
assign d=a&b;//功能定义
endmodule
其中[block]是模块名,[ (a,b,c,d) ]是端口定义,[input a,b; output c,d;]是IO说明
可综合模块能够得到一个由门级结构得到电路网表,可以生成物理电路;不可综合的模块可以用来做仿真语句
如果不指定数据类型,默认端口为wire类型的
功能定义部分有三种方法:
1、assign语句:描述组合逻辑
2、always语句:描述组合/时序逻辑
3、例化实例元件
上述三种逻辑功能是并行的
(在always块中,逻辑是顺序执行的,而多个always块之间是并行的)
在模块调用时,顶层模块和子模块之间的各相应信号的位宽要一致,子模块的输出信号一定要传给顶层模块中的wire型数据,不能是reg型