1. Verilog
1.1 数字表示形式
例
:
多
少
位
的
什
么
进
制
数
→
4
′
d
8
(
4
位
的
十
进
制
数
8
)
例:多少位的什么进制数 \rightarrow 4'd8 (4位的十进制数8)
例:多少位的什么进制数→4′d8(4位的十进制数8)
如果将
′
'
′ 一撇读作汉字
的
的
的,Verilog的数字表示语法符合口头语言的习惯。
1.2 数据类型
Verilog作为硬件描述语言,数据类型与硬件有直接对应关系。
数据类型 | 介绍 | 符号 |
---|---|---|
寄存器 | 可以理解为一个抽象化的数据存储单元,这与其他编程语言的变量概念很相近,只是Verilog以硬件寄存器作为变量的实现载体,而高级编程语言将使用一段内存来存储变量值(或是CPU中的寄存器) | reg、integer、real |
线网 | 连接各个硬件功能单元的连线 | wire |
参数 | 有点类似于高级编程语言中的宏定义 | parameter |
1.3 运算符
1.3.1 算数运算符
种类和功能和C其他编程语言一样。
值得注意的是,乘除运算在底层实现时往往会比较消耗资源
1.3.2 拼接运算符
这个运算符是Verilog特有的运算符,作用是将两个信号绑定为一个信号,例如:
{
a
,
b
}
→
将
a
,
b
两
个
信
号
拼
接
起
来
作
为
一
个
新
信
号
\{a, b\} \rightarrow 将a, b两个信号拼接起来作为一个新信号
{a,b}→将a,b两个信号拼接起来作为一个新信号
1.3.3 赋值
符号 | = | <= |
---|---|---|
含义 | 阻塞赋值语句 | 并行赋值语句 |
介绍 | 在always块中,该赋值语句只有当前面的语句都执行完毕后才会执行,和其他顺序执行的编程语言中赋值语句功能相同 | 在always块中和其他语句并行执行,不等待上一条语句的执行结果 |
应用场景 | 1. assign语句 2. 不带时钟的always块(组合逻辑) | 带时钟的always块 |
1.3.4 其他
关系运算符; 逻辑运算符; 三目运算符 (条件运算符); 移位运算符
1.4 程序框架
model model_name (
input input_var_name
output output_var_name
...
);
parameter PAR_NAME =123
reg [:] reg_name
wire wire_name
assign wire_name = ...
always @(posedge clk) begin
if (...)
else if (...)
else
end begin
case(...)
... : ...;
... : ...;
...
default : ;
endcase
end
end
endmodule
上面的伪代码定义了Verilog一个模块,begin、end的作用与C语言中的 " { } " "\{ \}" "{}"作用相同,begin、end代码段中的语句是顺序执行的(并行赋值语句是例外)。为了保证代码的规范性,即使逻辑判断分支中仅有一条语句,也可以用begin、end打包起来。
1.5 锁存器
锁存器与寄存器的最大区别是:锁存器属于组合逻辑,输出电平变化仅与输入信号有关,不受时钟约束。
锁存器对输入脉冲敏感,容易产生毛刺,这种瞬时的不确定性在后级电路中引发的BUG难以察觉。
另外由于FPGA中没有现成的锁存器资源,消耗底层资源。
锁存器产生的原因往往是代码逻辑不完整。例如,if语句缺少else与之对应,case语句中没有default等。
1.6 状态机
1.6.1 状态机适用的场景
某项工作需要按照固定的流程或步骤来完成,工作过程中总在各个阶段之间切换。例子:升降机。
1.6.2 状态机的优势
开发人员在编写代码时不需要考虑到所有状态的排列组合,仅需要考虑各个工作状态或工作阶段之间的转换条件。例如:升降机的控制程序不需要各个楼层分别编写,而是通过状态机来完成开关门、上升下降等动作。
1.6.3 状态机的分类
状态机全称“有限状态机”。在电路实现上可以看作组合电路和时序电路的组合,状态机的各个状态往往是时序电路,而状态之间的切换和输出往往是组合逻辑实现的。根据状态机的输出是否和输入相关,状态机又分成“摩尔型状态机”和“米勒型状态机”。
状态机分类 | 介绍 |
---|---|
米勒型状态机(Mealy) | 组合逻辑的输出不仅取决于当前状态还取决于状态机的输入 |
摩尔型状态机(Moore) | 组合逻辑的输出仅取决于当前的状态 |
1.6.4 状态机在Verilog中的写法
1.6.4.1 二段式
一个always模块适用同步时序描述状态转移。
另一个always模块采用组合逻辑判断状态转移条件,以及描述状态机输出。
1.6.4.2 三段式
一个always模块使用同步时序描述状态转换
一个always模块使用组合逻辑判断状态转移条件
最后一个always模块用于描述状态机输出,可以采用时序电路,也可以使用组合电路。