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