逻辑 0:表示低电平,也就是对应我们电路的GND;
逻辑 1:表示高电平,也就是对应我们电路的VCC;
逻辑 X:表示未知,有可能是高电平,也有可能是低电平;
逻辑 Z:表示高阻态,外部没有激励信号是一个悬空状态。
进制表示
二进制b或B,十进制d,十六进制h
4‘b0101表示4位二进制数字0101,4代表二进制位宽
4'ha表示四位十六进制数字a(ASIC码97)1010
16’b1001_1010_1010_1001=16'h9AA9
标识符
区分大小写
普通内部信号建议全部小写
信号命名最好体现信号的含义
数据类型(寄存器数据类型,线网数据类型和参数数据类型)
寄存器数据类型
表示一个抽象的数据存储单元,通过赋值语句可以改变寄存器的值关键字reg,reg类型数据的默认初始值为不定值x
reg[31:0] delay_cnt; //表示名为delay_cnt(为标识符)的[31:0]32位寄存器,一般默认位宽为1
定义寄存器数据类型的时候不能给它赋初值,因为reg类型的数据只能在always语句和initial语句中被赋值。
时序逻辑?组合逻辑?;时钟信号,触发器,硬件连线?
线网数据类型
wire key_flag;
参数类型
定义常量 parameter H_SYNC=11’d41;
常用于定义状态机的状态,数据位宽和延迟大小等;在模块调用时,可通过参数传递来改变被调用模块中已定义的参数。
运算符
“/”只能整除,只保留整数部分
“%”取余运算
&&两者都为一,结果才为1
||或
a?b:c条件运算符
~a 每位取反
a&b每位相与
a^b每位进行异或(每位值相同结果为0,值不相同结果为1)
移位运算符
a<<b将a左移b位(左移时,位宽增加,右移时,位宽不变)
4‘b1001<<2=6'b100100;
4'b1001>>1=4'b0100;
拼接运算符
{} {a,b} 将a,b拼接起来,作为一个新信号
c={a,b[3:0]};表示将a和b的低四位拼接起来
运算符优先级
verilog程序框架
基本设计单元“模块”
模块定义,模块定义以 module 开始,endmodule 结束
每个程序包括端口定义,IO说明,内部信号声明,功能定义
功能定义部分有三种方法:
1:assign语句 描述组合逻辑
2:always语句 描述组合/时序逻辑
3:例化实例元件 and #2 u1(q,a,b);//输出q=a&b,#表示延时,延时二个单位的时间,表示上一个语句执行完之后开始延时
上述逻辑功能是并行的。
在always中,逻辑是顺序执行的。而多个always间是并行的
模块调用
例化模块时要给每个模块起个名称 time_count:u_time_count
结构语句:
initial语句它在模块中只执行一次。常用于测试文件的编写,用来产生仿真测试信号或者用于对存储器变量名赋初值
always语句一直不断地重复运动,但只有和一定时间控制结合在一起才有用
时间控制可以是沿触发,也可以是电平触发。沿触发?电平触发?
敏感列表:关键字or多个事件名或信号名组成的列表
沿触发:时序逻辑行为,有关键字posedge(上升沿)or negedge(下降沿)
电平触发:组合逻辑行为
赋值语句:
信号有两种赋值方式
1、阻塞赋值 如b=a;所谓阻塞就是指在同一个always块中,后面的赋值语句是在前一句赋值语句结束后才开始赋值的。
2、非阻塞赋值 如b<=a;非阻塞赋值只能用于对寄存器类型的变量进行赋值,因此只能用在initial和always块中。
组合逻辑用阻塞赋值=,时序逻辑用非阻塞赋值<=
在同一个always块中不要既用非阻塞赋值又用阻塞赋值
不允许在多个always块中对同一个变量进行赋值!
条件语句:
if语句对表达式的值进行判断,若为0,x,z则按假处理,若为1,按真处理
允许IF语句嵌套
case语句(多分支选择语句)
1、分支表达式的值互不相同
2、所有表达式的位宽必须相等
3、casez比较时,不考虑表达式中的高阻值
4、casex不考虑高阻值z和不定值x
状态机:在有限个状态之间按一定规律转换的时序电路