目录
前言
笔者写这篇文章的目的主要是为了和大家分享一下学习心得,因为作为一名学生党,没有接受专门的培训,也没有老师给我讲解(课程安排在大四,笔者这时才大二),所以在参考了很多书籍和网上的视频教程后写出一些心得,希望能够对入门的同学或者相关人员有一点帮助吧。篇幅可能不多,大部分都是从不同的书籍里面整理的,偏向于概括性的文章。可能内容也有许多漏洞或错误,欢迎大家指出。
在学Verilog之前建议最好有数电基础,不然很多东西从头学可能会有点费力。文中会有一些C语言的类比,可能有些不妥,但是我个人按照这个比较好理解,希望大家参考一下就行。在大概的把语法了解后,个人建议可以直接编程验证,在这里我推荐小梅哥、黑金和特权的视频教程(并无广告的意思),他们讲的比较细,涵盖面也比较广泛。Verilog还算是比较好学,但是FPGA设计还是不容易,加油吧。
1.词法规定
1.1间隔符
(类似于C语言)
1.2标识符和关键词
标识符:英文字母、数字、$符和下划线组成(首字符必须为英文字母或下划线)。
转义标识符:如:\***。
2.四种逻辑值
0 | 逻辑0、逻辑假 |
1 | 逻辑1、逻辑真 |
x或X | 不确定值(未知逻辑状态) |
z或Z | 高阻态 |
3.八种强度值
最强————>最弱 | ||||||||
强度等级名称 | supply | strong | pull | large | weak | medium | small | highz |
类型 | 驱动 | 驱动 | 驱动 | 存储 | 驱动 | 存储 | 存储 | 高阻抗 |
4.常量及其表示
4.1整数型表示
格式:
<+/- size>'<signed><base format><number>
例如:
3'b101 //3位二进制数101
5'o37 //5位八进制数37
8'b1001_1100 //八位二进制数,等同于8'b10011100
注意:在这里的‘_’无实际意义,可以随便在整数或实数中使用,方便读数。
4.2实数型常量
(实数通过四舍五入转换为整数)
例如:
42.45转换为整数42; 92.5,92.699转化为93;-15.62转换为-16.
4.3字符串常量
(每个字符串包括空格都被看做8位的ACSII值序列)
例如:
存储字符串"FPGA"就需要定义一个8*4位的变量。
reg [8*4:1] messsage;
initial begin
message = "FPGA";
end
对于初学者来说,reg、initial这些请无视掉,只用了解这个格式就行。
4.4参数语句
格式:
parameter<signed><msb:lsb>
param1 = xxxx,
param2 = xxxx,
......;
parameter声明的符号常量常量通常出现在module(模块)内部,参数常用于指令yan'延迟、变量的wei'位宽和状态值de等(类似于C语言的局部参数)
补:define是宏定义,通常放在module外部,改常量是一个全局变量。
localparam(局部参数)是模块内部参数(无传递,类似于C语言的函数内部参数)。
5.数据类型
5.1线网类型
wire、tri(wire为一般连线;tri为驱动的线网);
wor、trior(一个线网被多个信号驱动qing情况);
wand、triand(一个线网被多个信号驱动qing情况);
trireg(电荷保持特性);
tri1(上拉电阻);
tri0(下拉电阻);
supply1(电源建模、高点平);
supply0(对地建模、低电平)。
线网变量声明:
<signed><[msb:lsb]>变量1,2,3,...,n;
例如:
wire A,B; //两个1位wire类型的变量
wire [7:0] Databus; //Databus位8位向量的wire变量
supply0 logic_0,vss; //‘地’
supply1 logic_1,vdd; //‘电源线’
建议别对同一变量多次赋值。
5.2寄存器类型
(只能在initial或always块内部被赋值)
reg、integer、time未赋值前为x;
real、realtime默认值是0.
reg:寄存器变量,默认值是x
格式
reg <signed><[msb:lsb]> 变量1,2,3,...,n;
例如:
reg clock,a; //1位的reg型变量clock,a;
reg [3:0] cnt; //4位的reg型变量cnt,等效于:cnt[3],cnt[2],cnt[1],cnt[0];
integer:整数型寄存器变量
(变量保持的是整数值)
格式:
integer 1,2,3,...,n<[msb:lsb]>;
例如:
integer A,B,C; //3个整数型变量;
integer HINT[3:0]; //一个由四个整数变量组成的数组;
tiem型变量主要用于存储和处理仿真时间
time 1,2,3,...,n [msb:lsb]
reale和realtime变量通产用于对实数型产量常量进行存储和运算,实数不能定义范围,默认值是0
real 1,2,3,...,n; //实型变量声明
realtime 1,2,3,...,n; //实型时间变量声明
参考文献
1.《FPGA自学笔记——设计与验证》
2.《可编程逻辑电路设计基础教程》
3.《Verilog HDL与FPGA数字系统设计》
4.《Verilog HDL入门》