组合逻辑电路3:算术电路

  • 1、半加器
  • 2、全加器
  • 3、3位二进制加法器
  • 4、加法器
  • 5、有符号加法溢出
  • 6、100位二进制加法器
  • 7、4位BCD加法器


1、半加器

拓展:

半加器用于计算2个单比特二进制数a与b的和,输出结果sum(s)和进位carry(c)。在多比特数的计算中,进位c将作为下一相邻比特的加法运算中。其真值表如下所示。

glBlendFuncSeparate 混合方式计算 混合hlb计算例题_加法器


练习:

创建一个半加器,半加器将两位相加(没有进位)并产生一个和并进位。

代码实现:

module top_module( 
    input a, b,
    output cout, sum );
    
    assign {cout,sum} = a + b;

endmodule

验证结果:

glBlendFuncSeparate 混合方式计算 混合hlb计算例题_加法器_02

2、全加器

拓展:

全加器不同于半加器的地方是,全加器带有进位cin。输入为a,b,cin, 输出为sum(s)和carry*(cout),均是单比特信号。s为a,b,cin三个单比特数的和,cout为a,b,cin三个数超过2后的进位。

练习:

创建一个全加器。全加器将三位(包括进位)相加并产生和并进位。

代码实现:

module top_module( 
    input a, b, cin,
    output cout, sum );
    
    assign {cout,sum} =a + b + cin;

endmodule

验证结果:

glBlendFuncSeparate 混合方式计算 混合hlb计算例题_verilog_03

3、3位二进制加法器

拓展:

行波进位加法器:N-bit加法器可以根据1-bit全加器组合而成。每个全加器的输出进位cout作为下一个全加器的输入进位cin,这种加法器称为行波进位加法器(Ripple-carry adder,简称RCA)。

练习:
既然您知道如何构建一个全加器,那么创建它的 3 个实例来创建一个 3 位二进制行波进位加法器。加法器将两个 3 位数字和一个进位输入相加以产生 3 位总和并执行。为了鼓励您实际实例化全加器,还要输出行波进位加法器中每个全加器的进位。cout[2] 是最后一个全加器的最后进位,也是你经常看到的进位。

代码实现:

module top_module( 
    input [2:0] a, b,
    input cin,
    output [2:0] cout,
    output [2:0] sum );
    
    assign {cout[0],sum[0]} = a[0] + b[0] + cin;
    assign {cout[1],sum[1]} = a[1] + b[1] + cout[0];
    assign {cout[2],sum[2]} = a[2] + b[2] + cout[1];
    
endmodule

验证结果:

glBlendFuncSeparate 混合方式计算 混合hlb计算例题_bc_04

4、加法器

实现以下电路:

glBlendFuncSeparate 混合方式计算 混合hlb计算例题_ci_05


代码实现:

module top_module (
    input [3:0] x,
    input [3:0] y, 
    output [4:0] sum);
    
    wire [2:0] cout;
    assign {cout[0],sum[0]} = x[0] + y[0];
    assign {cout[1],sum[1]} = x[1] + y[1] + cout[0];
    assign {cout[2],sum[2]} = x[2] + y[2] + cout[1];
    assign {sum[4],sum[3]} = x[3] + y[3] + cout[2];
    
endmodule

验证结果:

glBlendFuncSeparate 混合方式计算 混合hlb计算例题_加法器_06

5、有符号加法溢出

拓展:

当两个正数相加产生一个负结果,或两个负数相加产生一个正结果时,会发生符号溢出现象。有几种检测溢出的方法:可以通过比较输入和输出数字的符号来计算溢出,或者从n位和n-1位的进位来判断是否溢出。

练习:

假设您有两个 8 位 2 的补码,a[7:0] 和 b[7:0]。这些数字相加产生 s[7:0]。还要计算是否发生了(有符号的)溢出。

代码实现:

module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
); 
 
    assign s = a + b;
    assign overflow = ( a[7] & b[7] & (~s[7]) ) | ( (~a[7]) & (~b[7]) & s[7] );

endmodule

验证结果:

glBlendFuncSeparate 混合方式计算 混合hlb计算例题_verilog_07

6、100位二进制加法器

创建一个 100 位二进制加法器。加法器将两个 100 位数字和一个进位相加,以产生 100 位总和并进位。

代码实现:

module top_module( 
    input [99:0] a, b,
    input cin,
    output cout,
    output [99:0] sum );
    
    assign {cout,sum} = a +b + cin;
    
endmodule

验证结果:

glBlendFuncSeparate 混合方式计算 混合hlb计算例题_bc_08

7、4位BCD加法器

已有一个BCD(二进制编码的十进制)数加法器,名为bcd_fadd,它将两个BCD数字和进位信号相加,生成结果和进位信号。

module bcd_fadd {
    input [3:0] a,
    input [3:0] b,
    input     cin,
    output   cout,
    output [3:0] sum );

实例化bcd_fadd的4个副本,以创建一个4位BCD行波进位加法器。

代码实现:

module top_module( 
    input [15:0] a, b,
    input cin,
    output cout,
    output [15:0] sum );
    
    wire [2:0] cout1;
    bcd_fadd U0( .a(a[3:0]), .b(b[3:0]), .cin(cin), .cout(cout1[0]), .sum(sum[3:0]) );
    bcd_fadd U1( .a(a[7:4]), .b(b[7:4]), .cin(cout1[0]), .cout(cout1[1]), .sum(sum[7:4]) );
    bcd_fadd U2( .a(a[11:8]), .b(b[11:8]), .cin(cout1[1]), .cout(cout1[2]), .sum(sum[11:8]) );
    bcd_fadd U3( .a(a[15:12]), .b(b[15:12]), .cin(cout1[2]), .cout(cout), .sum(sum[15:12]) );

endmodule

验证结果:

glBlendFuncSeparate 混合方式计算 混合hlb计算例题_加法器_09