2010年学习FPGA编程时候,写的读书笔记。 搬运到这里。
什么是verilog HDL?
verilog是一种硬件描述语言,可以在算法级、门级到开关级的多种抽象设计层次上对数字系统建模。它可以描述设计的行为特性、数据流特性、结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。此外,verilog提供了编程语言接口,通过该接口用户可以在模拟、验证期间从外部访问设计,包括模拟的具体控制和运行。
verilog不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用verilog仿真器进行验证。verilog从C语言中继承了多种操作符和结构,所以从结构上看两者有很多相似之处。
设计流程:功能设计-->用verilog描述电路-->软件模拟与仿真-->考察结果--->逻辑综合-->代码下载到硬件电路--->完成。
1. 基本机构
1.1 模块
模块(module)是verilog最基本的概念,也是v设计中的基本单元。每个v设计的系统都是由若干模块组成的。
A:模块在语言形式上是以关键词module开始,以关键词endmodule结束的一段程序。
B:模块的实际意义是代表硬件电路上的逻辑实体。
C:每个模块都实现特定的功能。
D:模块的描述方式有行为建模和结构建模之分。
E:模块之间是并行运行的。
F:模块是分层的,高层模块通过调用、连接低层模块的实例来实现复杂的功能。
G:各模块连接完成整个系统需要一个顶层模块(Top-module)。
无论多么复杂的系统,总能划分成多个小的功能模块。因此系统的设计可以按照下面三个步骤进行:
(1)把系统划分成模块;
(2)规划各模块的接口;
(3)对模块编程并连接各模块完成系统设计。
模块的结构是这样的:
module <模块名>(<端口列表>);
<定义>
<模块条目>
endmodule
其中:
模块名是模块唯一的标识符;
端口列表是输入、输出和双向端口的列表,这些端口用来与其他模块进行连接。
定义 则是一段程序,用来指定数据对象为寄存器型、存储器型、线型以及过程块,诸如函数块和任务块;
模块条目 也是一段程序,将上面定义的东东和端口组合起来,是说明这个模块要做什么的语句;
标识模块结束的endmodule之后没有分号。
需要注释时,用//即可,这和c语言一样。
1.2 模块的调用
在做模块划分时,通常会出现这种情形:某个大的模块中包含了一个或多个功能子模块。verilog是通过模块调用或称为模块实例化的方式来实现这些子模块与高层模块的连接的。下面是通过两个NAND门实现一个与门的代码:
module AND(in1, in2, out);
input in1, in2;
output out;
wire w1; //一个模块内部连线
NAND NAND1(in1, in2, w1); //调用(实例化)一个NAND子模块
NAND NAND2(w1, w1, out); //调用(实例化)一个NAND子模块
endmodule //AND模块结束
调用模块实例的一般形式为:
<模块名><参数列表><实例名>(<端口列表>);
其中参数列表是传递到子模块的参数值,参数传递的典型应用是定义门级时延。
1.3 测试模块
2. 程序设计基础
Verilog其实是最容易学会的一种编程语言,因为它的结构和语法都比较简单而且和C语言相似。
2.1 参数声明
程序中经常多次出现某些数字,如延迟时间或变量的宽度,有时可能要改变这些值,这种情况下经常要用到参数。参数一经声明,就视其为一个常量,在整个仿真过程中不再改变。
parameter LINELENGTH = 132, ALL_X_S = 16'bx;
parameter BIT = 1, BYTE = 8, PI = 3.14;
parameter STROBE_DELAY = (BYTE+BIT)/2;
使用参数可以提高程序的可读性,也利于修改。
2.2 预处理指令
和C相似,V也有预处理指令,不过它的预处理指令以反引号“`”开头。
(1)`define和`undef :前者相当于C中的#define,后者取消`define所做的定义。
(2)`ifdef、`else和`endif :这三个编译器指令通常一起出现,和普通的if-else结构类似,这些编译器指令用于条件编译。
(3)`include
这个`include要注意一下,它用于嵌入“内嵌文件”的内容,这里的内嵌文件通常也是verilog文件。如下所示,在文件adder.v中有如下内容:
`include "../../halfaddr.v"
module adder;
...........
endmodule
在编译时,adder.v中的`include这一行将由halfadder的内容代替。
(4)`timescale
在Verilog模型中,所有时延都用单位时间表示。`timescale编译器指令定义时延单位和时延精度,其格式为:
`timescale time_unit / time_precision
其中,time_unit和time_precision由值1、10和100以及单位s、ms、us、ns、ps和fs组成。前者定义了时延单位,后者定义了时延精度。
当设计中多个模块带有自身的`timescale编译指令时会发生什么呢?在这种情况下,模拟器总是定位在所有模块的最小时延精度上,并且所有时延都相应的换算成最小的时延精度。
小结一下:
这一章比较简单,其实verilog与C语言有许多相通之处,所以学习并掌握这种语言应该不是特别困难。