HDLBits刷题合集—9 Arithmetic Circuits

HDLBits刷题合集—9 Arithmetic Circuits

HDLBits-66 Hadd

Problem Statement
创建一个半加器。半加器将两个输入(不带低位的进位)相加产生和和向高位的进位。

代码如下:

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

HDLBits-67 Fadd

Problem Statement
创建一个全加器。一个全加器加有3个输入(包括低位的进位)并产生一个和和向高位的进位。

代码如下:

module top_module( 
    input a, b, cin,
    output cout, sum );
	//assign sum  = a ^ b ^ cin;
    //assign cout = a & b | a & cin | b & cin;
    assign {cout,sum} = a + b + cin;
    
endmodule

HDLBits-68 Adder3

Problem Statement
现在你已经知道如何建立一个一位全加器,实例化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 u0 (.a(a[0]), .b(b[0]), .cin(cin), .cout(cout[0]), .sum(sum[0]));
    adder u1 (.a(a[1]), .b(b[1]), .cin(cout[0]), .cout(cout[1]), .sum(sum[1]));
    adder u2 (.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

HDLBits-69 Exams/m2014 q4j

Problem Statement
实现下面的电路:

在这里插入图片描述
代码如下:

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

HDLBits-70 Exams/ece241 2014 q1c

Problem Statement
假设有2个8位二进制数a[7:0]和b[7:0]。他们相加得到s[7:0]。判断是否发生了(有符号的)溢出。

这里参考格林课堂
有符号数溢出有两种情况:一是正正相加,产生正溢出;另一种情况是负负相减,产生负溢出。所以就分别考虑了这两种情况,将这两种情况取或判断溢出。

a[7] && b[7] && ~s[7]:
正数相加产生一个负数,判断溢出。
~a[7] && ~b[7] && s[7]:
负数相减(补码相加)产生正数,判断溢出。

代码如下:

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

HDLBits-71 Adder100

Problem Statement
创建一个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

HDLBits-72 Bcdadd4

Problem Statement
给定一个名为bcd_fadd的BCD码加法器,它可以实现两个BCD码和一个低位的进位相加,产生一个和和一个向高位的进位。

实例化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 [3:0] cout_temp;
    
    bcd_fadd ins0 (.a(a[3:0]), .b(b[3:0]), .cin(cin), .cout(cout_temp[0]), .sum(sum[3:0]));
    bcd_fadd ins1 (.a(a[7:4]), .b(b[7:4]), .cin(cout_temp[0]), .cout(cout_temp[1]), .sum(sum[7:4]));
    bcd_fadd ins2 (.a(a[11:8]), .b(b[11:8]), .cin(cout_temp[1]), .cout(cout_temp[2]), .sum(sum[11:8]));
    bcd_fadd ins3 (.a(a[15:12]), .b(b[15:12]), .cin(cout_temp[2]), .cout(cout_temp[3]), .sum(sum[15:12]));
    
    assign cout = cout_temp[3];
    
endmodule

Note
新手一枚,主要分享博客,记录学习过程,后期参考大佬代码或思想会一一列出。欢迎大家批评指正!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值