Verilog HDL数字系统设计及实践
上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位二进制全加器结构图