数字逻辑 初识Verilog
数字逻辑 初识Verilog
一、Verilog HDL 模块及端口
1. Verilog HDL 模块声明
模块声明从关键字 module
开始,到关键字 endmodule
结束。
模块的端口列表描述这个模块的输入和输出端口。
模块内部的5个组成部分:变量声明、数据流语句、低层模块实例、行为语句块以及任务和函数。
module <模块名> (<模块端口列表>)
···
<模块的内容>
···
···
endmodule
以一个与门的Verilog模块为例,代码如下:
module andDemo(a, b, c);
input a, b;
output c;
wire a, b;
wire c;
assign c = a & b
endmodule
2. Verilog HDL 端口声明
Verilog中端口有以下三种类型:
(1)input
:模块从外界发送数据的接口,在模块内可以不写。
(2)output
:模块往外界发送数据的接口,在模块内可以不写。
(3)inout
:可读取数据,也可以送出数据,数据双向流动。
以全加器为例,代码如下:
module fullAdder(a, b, cin, sum, cout);
// 端口声明的开始
input a, b, cin;
output sum, cout;
// 端口声明的结束
wire a, b, cin;
wire sum, cout;
assign sum = (a ^ b) ^ c;
assign cout = cin & (a ^ b) | (a & b);
endmodule
端口的默认数据类型是wire
型,如果希望端口能保存数据 ,则声明为reg
型,即寄存器类型(\(\texttt {register}\))。
3. Verilog HDL 数据类型声明
-
wire
型wire
型数据常用来表示以assign
关键字指定的逻辑信号。Verilog程序模块中的输入、输出信号类型默认为wire
型。wire
型信号可以用作方程式的输入,也可以用作assign
语句或者实例元件的输出。定义格式如下:
wire [n-1 : 0] 数据名1, 数据名2, ···, 数据名N;
这里,总共定义了 \(N\) 条线,每条线的位宽为 \(n\) 。例如:
wire [2 : 0] a, b, c;
-
reg
型reg
型是寄存器数据类型变量的关键字。reg
型数据常用来表示always
模块内的指定信号,代表触发器。在
always
模块内被赋值的每一个信号都定义为reg
型,即赋值操作符的有效变量必须是reg
型。定义格式如下:
reg [n-1 : 0] 数据名1, 数据名2, ···, 数据名N;
这里,总共定义了 \(N\) 条线,每条线的位宽为 \(n\) 。例如:
reg [2 : 0] a, b, c; reg d;
reg
型和wire
型不同在于reg
型保持最新一次的赋值,而wire
型需要持续的驱动。 -
memmory
型Verilog通过对
reg
型变量建立数组来对存储器建模,可以描述RAM、ROM存储器和寄存器数组。数组中每一个单元通过一个整数索引进行寻址。
定义格式如下:
reg [n-1 : 0] 存储器名 [m-1 : 0]; // reg [n-1 : 0]定义了存储单元是一个n位位宽的寄存器
存储器后面的
[m-1 : 0]
定义了存储单元的数量,例如:reg [15 : 0] ROMA [7 : 0]; // 这个例子定义了一个存储位宽为16位,存储深度为8的存储器 // 该存储器的地址范围是0~7
reg
型和memory
型的区别:reg [n-1 : 0] rega; //一个n位的寄存器 reg memb [n-1 : 0]; //一个由n个1位寄存器构成的存储器组 rega = 0; //合法 memb = 0; //非法
如果要对
memory
读写,必须指定地址。例如:memb[0] = 1; reg [3 : 0] rom [4 : 1]; rom[0] = 4^h0; rom[1] = 4^h1; rom[2] = 4^h2; rom[3] = 4^h3;
-
parameter
型在Verilog里用
parameter
来定义常量,即用parameter
来定义一个标识符表示一个常数。采用该类型可以提高程序的可读性与可维护性。
定义格式如下:
parameter 参数名1 = 数据名1;
例如:
parameter a1 = 1; parameter [3 : 0] s0 = 4^h0; s1 = 4^h1; s2 = 4^h2; s3 = 4^h3;
-
其他类型
integer
:整型变量。
real
:声明为real
型的变量是双精度浮点数。
realtime
:与real
变量相同,但是是以实数形式存储时间的值。
wand
:表示线和线网,由集电极开路逻辑实现。
wor
:表示线或线网,由发射极耦合逻辑实现。
scalared
:声明一个线性变量,这个变量的比特可以单独选中或部分选中。
time
:64位无符号数的形式存储仿真时间。