加法器的实现

verilog实现加法器,从底层的门级电路级到行为级,本文对其做出了相应的阐述。

1、一位半加器

所谓半加器就是有两个输入,两个输出,不考虑进位。其真值表如下:

A B S C
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1

由此,我们可以得到S=A^B,C=A&B。用相应的与门、异或门来实现半加器。
对应的Verilog代码如下:

  module half_add_1(
              A,
              B,
              S,
              C);
  input A,B;
  output S,C;
  assign S=A^B;
  assign C=A&B;

  endmodule 

2、一位全加器

全加器包含三个输入,两个输出,其中包含一个进位。

2.1 实现方式一

与半加器类似画出其真值表,进一步通过画卡诺图得到相应的函数表达式。
S=A^ B^cin,co=(A&B)|(A&cin)|(B&cin)。

2.2 实现方式二

利用两个半加器和一个或门实现全加器。其电路结构图如下:


全加器.png
  module full_add_1_gate(
                    A,
                    B,
                    cin,
                    S,
                    co);

     input A,B,cin;
     output S,co;
     wire S,co;
     wire C1,C2,S1;

  half_add_1 uut1(
            .A(A),
            .B(B),
            .S(S1),
            .C(C1)
            );
  half_add_1 uut2(
            .A(cin),
            .B(S1),
            .S(S),
            .C(C2)
            );                
assign co=C1|C2;
endmodule 

3、多位加法器的实现

在数字信号处理的快速运算电路中常常用到多位数字量的加法运算,对于多位宽加法器的处理,我们以逐位进位加法器为例。
代码和电路结构框图如下:

  module full_add_8_gate(
                    A,
                    B,
                    cin,
                    S,
                    co);

  input [7:0] A,B;
  input cin;
  output [7:0] S;
 output co;
 wire [7:0] C; 

 full_add_1_gate uut0(
            .A(A[0]),
            .B(B[0]),
            .cin(cin),
            .S(S[0]),
            .co(C[0])
            );
   full_add_1_gate uut1(
            .A(A[1]),
            .B(B[1]),
            .cin(C[0]),
            .S(S[1]),
            .co(C[1])
            );
    full_add_1_gate uut2(
            .A(A[2]),
            .B(B[2]),
            .cin(C[1]),
            .S(S[2]),
            .co(C[2])
            );
    full_add_1_gate uut3(
            .A(A[3]),
            .B(B[3]),
            .cin(C[2]),
            .S(S[3]),
            .co(C[3])
            );
    full_add_1_gate uut4(
            .A(A[4]),
            .B(B[4]),
            .cin(C[3]),
            .S(S[4]),
            .co(C[4])
            );
     full_add_1_gate uut5(
            .A(A[5]),
            .B(B[5]),
            .cin(C[4]),
            .S(S[5]),
            .co(C[5])
            );
    full_add_1_gate uut6(
            .A(A[6]),
            .B(B[6]),
            .cin(C[5]),
            .S(S[6]),
            .co(C[6])
            );
          full_add_1_gate uut7(
            .A(A[7]),
            .B(B[7]),
            .cin(C[6]),
            .S(S[7]),
            .co(C[7])
            );                                                                                                              

   assign co=C[7];
   endmodule 
8位全加器.png

串行加法器限制了运行的速度,在实际应用中,我们一般用到并行加法器。大致可以分为以下几类:进位旁路加法器、线性进位选择加法器、平方根进位选择加法器、超前进位加法器、对数超前进位加法器。并行加法器比串行加法器快得多,电路结构也不太复杂,它的原理很容易理解。

3、行为级描述加法器

用Verilog HDL来描述加法器是相当容易的,只需要将运算表达式写出就可以了。
一位全加器

  module full_add_1(
              A,
              B,
              C_in,
              S,
              C_out);

  input A,B,C_in;
  output S,C_out;

   assign {C_out, S}= A + B + C_in;

    endmodule

八位加法器

module full_add_8(
              A,
              B,
              C_in,
              S,
              C_out);

 input [7:0]A,B;
 input  C_in;
 output [7:0]S;
 output C_out;

assign {C_out, S}= A + B + C_in;

 endmodule 

这样设计的加法器在行为仿真时是没有延时的。借助综合器,可以根据以上Verilog HDL源代码将其自动综合成典型的加法器电路结构。综合器有许多选项可供设计者选择,以控制自动生成电路的性能。设计者可以考虑提高电路的速度,也可以考虑节省电路元件以减少电路占用硅片的面积。在FPGA的库中或某工艺的ASIC库中,都有参数化的加法器供设计者选用。

你可能感兴趣的:(加法器的实现)