Board logo

标题: Verilog HDL基础j教程之:程序基本结构 [打印本页]

作者: forsuccess    时间: 2013-8-28 19:11     标题: Verilog HDL基础j教程之:程序基本结构

Verilog HDL是一种用于数字逻辑电路设计的语言。用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型。Verilog HDL既是一种行为描述的语言,也是一种结构描述的语言。也就是说,既可以用电路的功能描述,也可以用元器件和它们之间的连接来建立所设计电路的Verilog HDL模型。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们对应的模型类型共有以下5种。

一个复杂电路系统的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块交互的现存电路或激励信号源。利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。
Verilog HDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计。这种行为描述语言具有以下功能。


Verilog HDL的构造性语句可以精确地建立信号的模型。这是因为在Verilog HDL中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型。信号值可以有不同的强度,可以通过设定宽范围的模糊值来降低不确定条件的影响。
Verilog HDL作为一种高级的硬件描述编程语言,有着类似C语言的风格。其中if语句、case语句等和C语言中的对应语句十分相似。如果读者已经掌握C语言编程的基础,那么学习Verilog HDL并不困难,只要对Verilog HDL某些语句的特殊方面着重理解,并加强上机练习就能很好地掌握它,利用它的强大功能来设计复杂的数字逻辑电路。下面将介绍Verilog HDL中的基本结构和语法。
Verilog HDL程序入门
首先来看几个Verilog HDL程序,然后从中分析Verilog HDL程序的特性。

例1:加法器。
module adder ( count,sum,a,b,cin ); //加法器模块端口声明
input [2:0] a,b; //端口说明
input cin;
output count;
output [2:0] sum;
assign {count,sum} = a + b + cin; //加法器算法实现
endmodule

这个例子通过连续赋值语句描述了一个名为adder的三位加法器可以根据两个三比特数a、b和进位(cin)计算出和(sum)和进位(count)。从例子中可以看出整个Verilog HDL程序是嵌套在module和endmodule声明语句里的。

例2:比较器。
module compare ( equal,a,b ); //比较器模块端口声明
output equal; //输出信号equal
input [1:0] a,b; //输入信号a、b
assign equal=(a==b)?1:0; //如果a、b 两个输入信号相等,输出为1,否则为0
endmodule

这个程序通过连续赋值语句描述了一个名为compare的比较器。对两比特数a、b进行比较,如a与b相等,则输出equal为高电平,否则为低电平。在这个程序中,“/*........*/”和“//.........”表示注释部分,注释只是为了方便程序员理解程序,对编译是不起作用的。

例3:使用原语的三态驱动器。
module trist2(out,in,enable); //三态启动器模块端口声明
output out; //端口说明
input in, enable;
bufif1 mybuf(out,in,enable); //实例化宏模块bufif1
endmodule

这个例子描述了一个名为trist2的三态驱动器。程序通过调用一个在Verilog语言库中现存的三态驱动器实例元件bufif1来实现其功能。

例4:自行设计的三态驱动器。
module trist1(out,in,enable); //三态启动器模块端口声明
output out; //端口说明
input in, enable;
mytri tri_inst(out,in,enable);//实例化由mytri模块定义的实例元件tri_inst
endmodule
module mytri(out,in,enable); //三态启动器模块端口声明
output out; //端口说明
input in, enable;
assign out = enable? in : 'bz; //三态启动器算法描述
endmodule

这个例子通过另一种方法描述了一个三态门。在这个例子中存在着两个模块。模块trist1调用由模块mytri定义的实例元件tri_inst。模块trist1是顶层模块。模块mytri则被称为子模块。
通过上面的例子可以看到。
模块的框架模块的内容包括I/O声明、I/O说明、内部信号声明和功能定义。
1.I/O声明模块的端口声明了模块的输入输出端口,其格式如下:
Module 模块名(端口1,端口2,端口3,端口4, …);

2.I/O说明I/O说明的格式如下:

输入口:input 端口名1,端口名2,…,端口名i; //(共有i个输入口)
输出口:output 端口名1,端口名2,…,端口名j; //(共有j个输出口)

I/O说明也可以写在端口声明语句里,其格式如下:

module module_name(input port1,input port2,…,output port1,output port2… )

3.内部信号声明在模块内用到的和与端口有关的wire和reg变量的声明,如下所示:

reg [width-1 : 0] R变量1,R变量2 …;
wire [width-1 : 0] W变量1,W变量2 …;

4.功能定义模块中最重要的部分是逻辑功能定义部分,有3种方法可在模块中产生逻辑。
(1)用“assign”声明语句。
assign a = b & c;
这种方法的句法很简单,只需写一个“assign”,后面再加一个方程式即可。例子中的方程式描述了一个有两个输入的与门。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0