加法器是非常重要的,它不仅是其它复杂算术运算的基础,也是 CPU 中 ALU 的核心部件(全加器)。两个二进制数之间的算术逻辑运算例如加减乘除,在数字计算机中都是化为若干步加法操作进行的,因此,学好数字电路,从学好加法器开始。
  加法器分为半加器和全加器。全加器和半加器相比也就多了那么一个相加的进位输入,全加器就是三位相加,半加器就是二位相加。例如,我们在做加法运算的时候,总是需要进行低位进位的判断,从而再进行下一位的计算,这就是全加器的由来。详细的也可以参考百度百科。
  说太多,还不如底层硬件代码看一看学一学记一记!!!
一、半加器的 Verilog 代码实现和 RTL 电路实现
Plaintext
module Half_Adder(
    input wire a, // 加数
    input wire b, // 加数
    output reg sum, // 和
    output reg cout // 进位输出
    );
// 行为描述
    always @(a or b) begin
        sum  = a ^ b; // 实践证明,这里 <= 和 = 的结果都一样;都是纯粹的组合逻辑;
        cout = a & b;
    end

// 数据流描述
// assign sum  = a ^ b;
// assign cout = a & b;

// 门级描述
// and(cout,a,b);
// xor(sum,a,b);

endmodule
  基于多种方式描述的一个全加器电路的 RTL 电路图如下所示:
forum.jpg
半加器的 RTL 电路实现

二、全加器的 Verilog 代码实现和 RTL 电路实现
Plaintext
module Full_Adder(
    input wire a, // 加数
    input wire b, // 加数
    input wire cin,// 进位输入
    output reg sum, // 和
    output reg cout // 进位输出
    );

// 行为描述
    always @(a or b or cin) begin
        {cout,sum} <= a + b + cin;
    end

// 行为描述
//    always @(a or b or cin) begin
//        sum  = a ^ b ^ cin; // 实践证明,这里 <= 和 = 的结果都一样;都是纯粹的组合逻辑;
//        cout = a & b | b & cin | a & cin;
//    end

// 数据流描述
// assign {cout,sum} = a + b + cin;

endmodule
  这里,“{}” 符号表示的是 “拼接位”,即先计算 a 与 b 的值,当 a 与 b 为 “0” 和 “1” 时,它们之和为 1,那么就是{01},对应 cout 和 sum ;当 a 与 b 为 “1” 和 “1” 时,它们之和为 2,那么就是转换为二进制就是{10},同样对应 cout 和 sum 等等。
  基于多种方式描述的一个全加器电路的 RTL 电路图如下所示:
forum.jpg
全加器的 RTL 电路实现