HDLBits答案9-Arithmetic Circuits

1. Half adder

创建半加法器。半加法器将两位加起来(没有进位),产生和和进位。

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

2. Full adder

创建完整的加法器。全加法器加三位(包括进位),产生和和进位。

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

3. 3-bit binary adder

现在你知道如何构建一个完整的加法器,使它的3个实例来创建一个3位二进制波纹进位加法器。加法器将两个3位数字和一个进位相加,产生一个3位的和和进位。为了鼓励您实际实例化全加法器,还可以在波纹进位加法器中输出每个全加法器的进位。Cout[2]是最后一个完整加法器的最后一个外接项,也是您通常看到的外接项。

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

4. Adder

在这里插入图片描述

module top_module (
    input [3:0] x,
    input [3:0] y, 
    output [4:0] sum);
	assign sum = x+y;
endmodule

5. Signed addition overflow

假设您有两个8位2的补数,a[7:0]和b[7:0]。这些数字加起来就是s[7:0]。还要计算是否发生了(有符号的)溢出
加法的溢出问题:
1.x y皆为正数时,若x+y<0则说明发生了溢出
2.x y 皆为负数时,若x+y>=0则说明发生了溢出

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

6. 100-bit binary adder

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

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

7. 4-digit BCD adder

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

实例化4个bcd_fadd副本以创建一个4位BCD纹波进位加法器。您的加法器应该将两个4位BCD数字(打包成16位向量)和一个进位相加,以产生一个4位的和并进行运算。

module top_module( 
    input [15:0] a, b,
    input cin,
    output cout,
    output [15:0] sum );
    wire [2:0] cout_temp;
    bcd_fadd bcd_1(a[3:0],b[3:0],cin,cout_temp[0],sum[3:0]);
    bcd_fadd bcd_2(a[7:4],b[7:4],cout_temp[0],cout_temp[1],sum[7:4]);
    bcd_fadd bcd_3(a[11:8],b[11:8],cout_temp[1],cout_temp[2],sum[11:8]);
    bcd_fadd bcd_4(a[15:12],b[15:12],cout_temp[2],cout,sum[15:12]);
endmodule
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值