下面先介绍几个简单的Verilog HDL程序,然后从中分析Verilog HDL程序的特性。
例[3.1.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 声明语句里的。
例[3.1.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.1.3]:module trist2(out,in,enable);
output out;
input in, enable;
bufif1 mybuf(out,in,enable);
endmodule
这个程序描述了一个名为trist2的三态驱动器。程序通过调用一个在Verilog语言库中现存的三态驱动器实例元件bufif1来实现其功能。
例[3.1.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则被称为子模块。
通过上面的例子可以看到:
• Verilog HDL程序是由模块构成的。每个模块的内容都是嵌在module和endmodule两个
语句之间。每个模块实现特定的功能。模块是可以进行层次嵌套的。正因为如此,才可
以将大型的数字电路设计分割成不同的小模块来实现特定的功能,最后通过顶层模块
调用子模块来实现整体功能。
• 每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。
• Verilog HDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。
• 除了endmodule语句外,每个语句和数据定义的最后必须有分号。
• 可以用/*.....*/和//.......对Verilog HDL程序的任何部分作注释。一个好的,有使
用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。
|