来自正点原子的学习笔记
我在学习的过程中会尽量把它和C语言进行比较,毕竟有较大的相似之处
Verilog基础语法笔记
正文开始
1 基础知识
1.1 逻辑值
(数电知识)
1.2数字进制格式
最终在数字电路里的数据形式都是0101的二进制!
所以说这里所说的位宽全都是指的转换成二进制的位宽!
没写 ’ 的话默认为32位,没写进制的话默认为d(十进制)
详细请看: FPGA-数字进制格式.
1.3标识符
几乎与C语言的规则相同
标识符推荐写法
2 数据类型
verilog不像C语言的数据类型那么多,主要有三大类数据类型。
下面依次介绍三大类型
2.1 寄存器类型
2.1.1 定义寄存器
关键字是reg,初始值为不定的
下面以一段定义寄存器的代码为例:
注意!结尾同C语言一样,用分号;
//eg1:
//reg define
reg [31:0] delay_cnt; //延时函数
reg 定义寄存器的关键字
[31:0] 表示寄存器的位宽,是32位的。高位在前
delay_cnt 定义的寄存器的名称
//eg2:
reg key_reg; //此处默认位宽为1
2.1.2 注意
reg类型的数据只能在 always 语句和 initial 语句中被赋值!!
so 不要在定义寄存器的时候对其进行赋值!!!
注意:不像C语言,可以在定义的时候直接进行赋值
// C语言
int i =100;//在定义的时候直接进行赋值
2.2 线网类型
2.2.1 介绍
线网数据类型表示结构实体(门)之间的 物理连线,可以抽象为模块与模块之间的连线
关键字是wire型和tri型,最常用的是wire类型
线网数据类型不能存储值,它的值由驱动它的元件所决定
2.2.2 驱动 线网数据类型的 元件
驱动它的元件:门、连续赋值语句、assign
如果没有驱动元件连接到线网数据类型的变量上,则该变量就是高阻的,其值为z(见1.1逻辑值)
(对比:同样不赋值,寄存器reg类型的变量的初始值是不定值x,而线网数据类型的变量的初始值是z)
2.2.3 wire类型变量 定义
// wire define
wire key_flag;
关键字wire + 标识符key_flag + ;
此处没有指定位宽,则是默认为1
可以用[1:0]l来定义位宽为2,同2.1.1代码所示
2.3 参数类型
2.3.1介绍及定义
参数类型其实就是一个常量,在Verilog HDL中用parameter定义变量
类似于C语言的define,不过此处需要用到等号还有分号
只需要要在代码
可以一次定义多个参数,之间用逗号隔开,
参数右边必须是一个常数表达式
but 此处为了代码的美观性和可读性,采用了分行定义!
// parameter define 4.3'RGB LCD
parameter H_SYNC = 11'd41;//行同步
parameter H_BACK = 11'd2;//行显示后沿
parameter H_DISP = 11'd480;//行有效数据
parameter H_FRONT = 11'd2;//行显示前沿
parameter H_TOTAL = 11'd525;//行扫描周期
2.3.2适用及含义
参数型数常用于表示状态机的状态,数据位宽和延迟大小等。
采用标识符来代表一个常量可以提高程序的可读性和可维护性。
在模块调用时,可通过参数传递来改变被调用模块中已定义的参数。(类似于C语言函数参数传递)
简而言之,可以统一修改
3 运算符
Verilog 中的操作符 按照功能可分为:
1.算术运算符
2.关系运算符
3.逻辑运算符
4.条件运算符
5.位运算符
6.移位运算符
7.拼接运算符
3.1 算术运算符
注意:1./ 除法是表示整除,小数部分被省略掉了
2.取模就是求余
3.2 关系运算符
注意==!(与C语言保持一致)
3.3 逻辑运算符
与 或 非
3.4 条件运算符(Verilog特有的运算符,其实C语言也有,只是用得少)
主要是简化了if else的写法,其实本质相同
3.5 位运算符
如果a和b的位宽不一样,会把位宽小的前面补为0
~非:取反,都懂
&与:0&0=0; 0&1=0; 1&0=0; 1&1=1,只有1和1 才为1
|或:0|0=0; 0|1=1; 1|0=1; 1|1=1,有1则为1
^ 异或:0^ 0=0, 1^ 0=1, 0 ^ 1=1, 1^1=0,不一样才为1
3.6 移位运算符
3.7 拼接运算符
把a和b的低四位拼接在一起,作为新的信号:c
c的位宽为两个连接部分的和
3.8 运算符优先级
克服优先级出错的的办法就是——多用括号!