Verilog的语言要素
assign Cla = Pla & Sla;
. . .
assign Cla = Pla ^ Sla;
在这个实例中,Cla有两个驱动源。两个驱动源的值(右侧表达式的值)用于在上表中索引,以便决定Cla的有效值。由于Cla是一个向量,每位的计算是相关的。例如,如果第一个右侧表达式的值为01x, 并且第二个右测表达式的值为11z,那么Cla 的有效值是x1x (第一位0和1在表中索引到x, 第二位1和1在表中索引到1,第三位x 和z在表中索引到x)。
2. wor和trior线网
线或指如果某个驱动源为1,那么线网的值也为1。线或和三态线或(trior)在语法和功能上是一致的。
wor [MSB:LSB] Art;
trior [MAX-1: MIN-1] Rdx, Sdx, Bdx;
如果多个驱动源驱动这类网,网的有效值由下表决定。
wor (或 trior) 0 1 x z
0 0 1 x 0
1 1 1 1 1
x x 1 x x
z 0 1 x z
3. wand和triand线网
线与(wand)网指如果某个驱动源为0,那么线网的值为0。线与和三态线与(triand)网在语法和功能上是一致的。
wand [-7 : 0] Dbus;
triand Reset, Clk;
如果这类线网存在多个驱动源,线网的有效值由下表决定。
wand (或 triand) 0 1 x z
0 0 0 0 0
1 0 1 x 1
x 0 x x x
z 0 1 x z
4. trireg线网
此线网存储数值(类似于寄存器),并且用于电容节点的建模。当三态寄存器(trireg)的所有驱动源都处于高阻态,也就是说,值为z时,三态寄存器线网保存作用在线网上的最后一个值。此外,三态寄存器线网的缺省初始值为x。
trireg [1:8] Dbus, Abus;
5. tri0和tri1线网
这类线网可用于线逻辑的建模,即线网有多于一个驱动源。tri0(tri1)线网的特征是,若无驱动源驱动,它的值为0(tri1的值为1)。
tri0 [-3:3] GndBus;
tri1 [0:-5] OtBus, ItBus;
下表显示在多个驱动源情况下tri0或tri1网的有效值。
tri0 (tri1) 0 1 x z
0 0 x x 0
1 x 1 x 1
x x x x x
z 0 1 x 0(1)
6. supply0和supply1线网
supply0用于对"地"建模,即低电平0;supply1网用于对电源建模,即高电平1;例如:
supply0 Gnd, ClkGnd;
supply1 [2:0] Vcc;
3.7.2 未说明的线网
在Verilog HDL中,有可能不必声明某种线网类型。在这样的情况下,缺省线网类型为1位线网。
可以使用`default_nettype编译器指令改变这一隐式线网说明方式。使用方法如下:
`default_nettype net_kind
例如,带有下列编译器指令:
`default_nettype wand
任何未被说明的网缺省为1位线与网。
3.7.3 向量和标量线网
在定义向量线网时可选用关键词scalared 或vectored。如果一个线网定义时使用了关键词vectored, 那么就不允许位选择和部分选择该线网。换句话说,必须对线网整体赋值(位选择和部分选择在下一章中讲解)。例如:
wire vectored [3:1] Grb;
//不允许位选择Grb[2]和部分选择Grb [3:2]
wor scalared [4:0] Best;
//与wor [4:0] Best相同,允许位选择Best [2]和部分选择Best [3:1]。
如果没有定义关键词,缺省值为标量。
3.7.4 寄存器类型
有5种不同的寄存器类型。
* reg
* integer
* time
* real
* realtime
1. reg寄存器类型
寄存器数据类型reg是最常见的数据类型。reg类型使用保留字reg加以说明,形式如下:
reg [ msb: lsb] reg1, reg2, . . . regN;
msb和lsb 定义了范围,并且均为常数值表达式。范围定义是可选的;如果没有定义范围,缺省值为1位寄存器。例如:
reg [3:0] Sat; //Sat为4 位寄存器。
reg Cnt; //1位寄存器。
reg [1:32] Kisp, Pisp, Lisp;
寄存器可以取任意长度。寄存器中的值通常被解释为无符号数, 例如:
reg [1:4] Comb;
. . .
Comb = -2; //Comb 的值为14(1110),1110是2的补码。
Comb = 5; //Comb的值为15(0101)。
2. 存储器
存储器是一个寄存器数组。存储器使用如下方式说明:
reg [ msb: 1sb] memory1 [ upper1: lower1],
memory2 [upper2: lower2],. . . ;
例如:
reg [0:3 ] MyMem [0:63]
//MyMem为64个4位寄存器的数组。
reg Bog [1:5]
//Bog为5个1位寄存器的数组。
MyMem和Bog都是存储器。数组的维数不能大于2。注意存储器属于寄存器数组类型。线网数据类型没有相应的存储器类型。
单个寄存器说明既能够用于说明寄存器类型,也可以用于说明存储器类型。
parameter ADDR_SIZE = 16 , WORD_SIZE = 8;
reg [1: WORD_SIZE] RamPar [ ADDR_SIZE-1 : 0], DataReg;
RamPar是存储器,是16个8位寄存器数组,而DataReg是8位寄存器。
在赋值语句中需要注意如下区别:存储器赋值不能在一条赋值语句中完成,但是寄存器可以。因此在存储器被赋值时,需要定义一个索引。下例说明它们之间的不同。
- 基于MC8051 IP核和FPGA的频率计设计(11-24)
- 赛灵思FPGA DIY系列(2):数字存储扫频仪(11-06)
- 基于Verilog FPGA 流水灯设计(07-09)
- 基于Verilog计算精度可调的整数除法器的设计(04-24)
- Verilog HDL语言的文件调用问题:include使用方法介绍(02-24)
- FPGA工程师手记:FPGA系统设计黄金法则(06-17)