1.逻辑值:
0—GND
1—VCC
X—未知 可能是高电平 也可能是低电平
Z—高阻态、悬空 高或低或中间
2.位宽没有指出默认32位
4位4位用_下划线分开
3.标识符:模块名、端口名、信号名
标识符可以是任意一组字母、数字、$符号和下划线_符号的组合,但标识符的第一个字符必须是字母或者是下划线,标识符区分大小写;
标识符推荐写法:
有意义的有效名字sum、下划线区分名词cpu_addr、采用一些前缀或者后缀;
4.三大数据类型:寄存器类型reg、线网数据类型
寄存器类型关键字reg,数据默认初始值为不定值x;
寄存器表示一个抽象的数据存储单元,通过赋值语句可以改变寄存器存储的值;
例:
reg [31:0] delay_cnt;
reg类型的数据只能在always语句和initial语句中被赋值;
时序逻辑——always语句中带有时钟信号,该寄存器变量为触发器;
组合逻辑——always语句中不带有时钟信号,该寄存器变量为硬件连线;
线网数据类型:包括wire型和tri型
线网数据类型表示结构实体(例如门)之间的物理连线,线网类型的变量不能
储存值,它的值由驱动它的元件所决定。
驱动线网类型变量的元件有门、连续赋值语句、assign等
若没有驱动元件,该变量就为高阻态z。
参数类型的变量:参数实际就是常量
用parameter定义常量,可一次定义多个参数,参数之间需要用逗号隔开,每个参数定义的右边必须是一个常数表达式。
例如:parameter H_SYNC = 11’d41
5.运算符
算数运算符:+、-、*、/、%
关系运算符:
逻辑运算符:
条件运算符:
三目运算符
位运算符:每位的运算(逻辑运算符指单位)
移位运算符:用0填补移出的空位,左移位宽增加、右移位宽不变
拼接运算符:
运算符优先级:
6.verilog注释方式
//注释本行
/*...*/注释两符号之间的语句
7.常用关键字
8.verilog的基本设计单元—模块
模块由两部分组成,一部分描述接口,另一部分描述逻辑功能。
每个verilog程序包括4个主要部分:
端口定义、IO说明、内部信号声明、功能定义
示例:
module block(a,b,c,d); //端口定义
input a,b; //IO说明
output c,d;
assign c = a | b; //功能定义
assign d = a & b;
endmodule
9. 模块调用===模块实例化(按变量名/按顺序)
10.结构语句:initial(初始化)——在模块中只执行一次,常用于测试文件的编写,用来产生仿真测试信号(激励信号),或用于对存储器变量赋初值
结构语句:always语句——重复活动,但只有和一定的时间控制结合在一起才有作用
always的时间控制可以是沿触发,也可以是电平触发;
可以是单个信号,也可以是多个信号,多个信号中间要用关键字or连接。
always后紧跟的过程块根据它的触发条件满足决定是否运行;
电平触发的always块常常描述组合逻辑行为
组合逻辑电路:任何时刻任意时刻输出只取决于该时刻输入,与电路原来状态无关;
时序逻辑电路:任何时刻输出不仅取决当时输入,还取决原来状态,也就是与之前的输入有关,时序逻辑必须具备记忆功能。
11.赋值语句:阻塞赋值(blocking)(如:b = a ;)和非阻塞赋值(non_blocking)(如:b <= a;)
阻塞赋值:可以认为只有一个步骤的操作——>计算RHS并更新LHS(RHS指的是右手边的表达式,同理LHS为左手边的表达式)
非阻塞赋值:
阻塞赋值需要等前一句语句赋值完成才能进行下一句语句赋值,而非阻塞赋值允许所有非阻塞赋值语句同时计算RHS和LHS;
12.条件语句:
if_else语句
简写
If(a)等同于if(a == 1)
if语句对表达式的值进行判断若为0,x,z按假处理,若为1按真处理;
允许if语句的嵌套;
case语句——多分支选择语句
13.状态机(有限状态机的简称-FSM)
在有限个状态间按照一定规律组成的时序电路;
状态机模型如下:
当产出输出的组合逻辑只与当前状态有关时,变成moore状态机:
状态机设计四段论:状态空间定义、状态跳转、下个状态判断、各个状态下的的动作
1.状态空间定义:
用参数类型定义各个状态,采用独热码(只有一个寄存器置位,译码逻辑简单)+寄存器类型变量定义;
2.状态跳转(时序逻辑)
3.下个状态判断(组合逻辑)
4.各个状态下的动作—组合逻辑
三目运算符/if-else:
三段式状态机例子(由四段论组成的状态机称作三段式状态机)