上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.1 一个简单的例子—— 4位全加器的设计
首先来看一个简单的Verilog HDL设计的例子。
【例1.1】利用Verilog HDL语言和层次化设计方法来设计一个4位全加器电路。
// example_1_1: full adder // 4位全加器由4个1位全加器构成。 module fadder_4 ( i_A, i_B, i_Cin, o_S, o_Cout ); input [3:0] i_A, i_B; // 输入端口i_A, i_B input i_Cin; // 输入端口i_Cin output [3:0] o_S; // 输出端口o_S output o_Cout; // 输出端口o_Cout wire Cout_1, Cout_2, Cout_3; // wire型数据Cout_1, Cout_2, Cout_3 // 实例化4个1位全加器 fadder_1 u_fadder_1_1 ( .i_A(i_A[0]), .i_B(i_B[0]), .i_Cin(i_Cin), .o_S(o_S[0]), .o_Cout(Cout_1) ); fadder_1 u_fadder_1_2 ( .i_A(i_A[1]), .i_B(i_B[1]), .i_Cin(Cout_1), .o_S(o_S[1]), .o_Cout(Cout_2) ); fadder_1 u_fadder_1_3 ( .i_A(i_A[2]), .i_B(i_B[2]), .i_Cin(Cout_2), .o_S(o_S[2]), .o_Cout(Cout_3) ); fadder_1 u_fadder_1_4 ( .i_A(i_A[3]), .i_B(i_B[3]), .i_Cin(Cout_3), .o_S(o_S[3]), .o_Cout(o_Cout) ); endmodule // 定义1个1位全加器 module fadder_1 ( i_A, i_B, i_Cin, o_S, o_Cout ); input i_A, i_B; //输入端口i_A, i_B input i_Cin; //输入端口i_Cin output o_S, o_Cout; //输出端口o_S, o_Cout // 计算结果值: o_S = i_A⊕i_B⊕i_Cin assign o_S = i_A ^ i_B ^ i_Cin; // 计算进位值: o_Cout = (i_A⊕i_B)i_Cin + (i_A)(i_B) assign o_Cout = (i_A ^ i_B) & i_Cin | i_A & i_B; endmodule
该例描述了1个4位二进制全加器,模块名为fadder_4。而此四位全加器是由4个1位全加器串联而成的。例子的后半部分描述的是1位全加器子模块,模块名为fadder_1。fadder_1中所表示的逻辑为o_S = i_A⊕i_B⊕i_Cin,o_Cout = (i_A⊕i_B)i_Cin + (i_A)(i_B),其中o_S为全加器的和,o_Cout为全加器的进位。
提示:注释符号
在Verilog HDL语言中,可以使用符号//进行单行注释,也可以使用/*和*/进行多行注释。Verilog HDL的注释方式与C++和Java语言的注释方式相同。
利用Verilog HDL进行层次化设计,其描述的电路结构与真实的电路结构很相近,因此通常可以直接画出电路的结构图。用结构图来表示这个四位全加器,如图1.1所示。
图1.1 4位二进制全加器结构图