Verilog 综述:
类C,并行,自顶向下,硬件描述语言,VHDL,Verilog HDL。
VHDL,Verilog HDL,两种不同描述语言。
Verilog语言(并行,硬件)类似C语言(串行,软件)。
基础知识:
1.Verilog的四值逻辑系统
0低电平
1高电平
X不确定
Z高阻态
2.Verilog的数据类型
寄存器数据类型
表示一个抽象的数据存储单元,只能在always语句和initial语句等过程语句中被赋值。
在实际的数字电路中,
描述的是时序逻辑,变量对应为寄存器;
描述的是组合逻辑,变量对应为硬件连线;
描述的是不完全组合逻辑,变量也可以对应为锁存器。
寄存器变量不一定综合为寄存器。缺省值为x。
类型有reg(最常用),integer,real等。
线网数据类型
表示物理连线,值有驱动元件的值决定,例如连续赋值与门的输出。
如果没有驱动元件连接到线网那个,线网的缺省值为z。
类型有tri,wand和wire(最常用)。
参数数据类型
一个常量,通常出现在module内部,常被用于定义状态机的状态,数据位宽和延迟大小等,由于它可以再编译时修改参数的值,因此它又常被用于一些参数可调的模块中,实例化模块时,可以根据需要配参数。定义参数时,可以一次定义多个,之间用逗号隔开。
3.Verilog的基本运算符
算术运算符
-
- * / %
关系运算符
> < >= <=
逻辑运算符
! && ||
相等运算符
== !=
条件运算符
?:
位运算符
~ & | ^ ~^ ^~
移位运算符
<< >>
拼接运算符
{}
{{}} //{a{b}} 把b重复a次
Verilog的基础语法
可综合语句
能被转换成实实在在的电路,描述硬件电路。
不可综合语句
不能被转换成实实在在的电路,描述仿真功能。
Verilog关键字
太多......
module(开头)和endmodule(结尾)成对使用,模块是设计最基本单元,module紧跟着模块名。
input(入),output(出),inout(入同时出) 用于端口定义。
wire,reg 声明数据类型(线网和寄存器)。
parameter声明参数类型。
always过程赋值语句,一般描述时序逻辑。
assigh连续赋值语句,一般描述对线网赋值。
if和else成对。
begin和end相当于C的{}。
case和endcase成对使用,类C的switch。
posedge(上升沿触发),negedge(下降沿触发),posedge or negedge(都有)和always联合使用。
Verilog的基本程序框架
程序由模块组成。
每个模块要进行端口定义,说明输入输出端口,对模块功能进行逻辑描述。
书写格式自由。
语句末尾加分号(除endmodule)。
Verilog关键问题解惑
Verilog HDL的抽象级别
系统级,算法级,RTL级,门级,开关级。(级别由高到低)
结构化描述方式:级别最低,最接近实际硬件描述。
数据流描述方式:抽象级别高一点。
行为化描述方式:抽象级别最高。
Verilog HDL的模块化设计
自顶向下。
模块分成若干子模块。
如何给端口选择正确的数据类型
输入端口只能是net,但输入端口可以由net/register驱动。
输出端口可以时net/register类型,但输出端口只能驱动net。
Verilog语言中latch的产生
锁存器。
原因:组合逻辑电路中条件不完整。
解决:把所有情况尽可能考虑完整。
组合逻辑反馈环
电路存在不确定性。
变成时序解决问题。
阻塞赋值与非阻塞赋值的不同
阻塞赋值block(=)执行有先后
非阻塞赋值no_block(<=)并行执行
FPGA的灵魂,状态机
通俗的讲是时序逻辑电路里的状态转换图,分为米里型(取决于当前状态和输入)和摩尔型(仅取决于当前状态)。
一个有序状态机通常包括组合逻辑(分为次态逻辑【确定有限状态机的下一个状态】和输出逻辑【确定有限状态机的输出】和时序逻辑(由一组触发器组成,用来记忆当前状态)。
状态机的设计:
1.根据需要确定用摩尔型还是米里型状态机。
2.根据实际分析并列出状态机所有状态,每个状态进行编码。
3.根据状态转移关系和输出函数画出状态图。
4.根据状态图,描述状态机。
状态机的状态编码
通常用参数定义语句parameter指定状态编码。
通过不同编码值区别不同状态。三种状态编码:递增二进制编码,格雷编码,one-hot编码。
状态机的描述方法:
一段式状态机:所有逻辑都写在一个always模块,可读性差。
二段式状态机:组合逻辑和时序逻辑分开,组合逻辑容易出现毛刺等问题。
三段式状态机:具有两段式的优点,还对状态输出进行了寄存,有效滤除毛刺。