1.3 Arithmetic Circuits 运算电路
1.3.1 Half adder [Hadd]
问题描述
创建一个半加器,一个半加器将两个比特相加(没有进位输入)产生一个输出和进位信号。
预期答案长度在两行左右。
assign cout = a & b;
assign sum = a ^ b;
列一下真值表就OK了。也可以利用拼接方法assign {cout,sum}={a&b,a^b};
1.3.2 Full adder [Fadd]
问题描述
创建一个全加器,一个全加器将3bit(包含进位)相加并产生一个输出和进位信号。
预期答案长度在两行左右。
assign cout = ~a&b&cin | a&~b&cin | a&b&~cin | a&b&cin;
assign sum = ~a&~b&cin | ~a&b&~cin | a&~b&~cin | a&b&cin;
把符合条件的情况都列出来。也可以直接assign {cout,sum} = x + y + cin;
1.3.3 3-bit binary adder [Adder3]
问题描述
现在你已经知道了如何构建全加器,创建三个实例来创建一个3位2进制行波进位加法器。加法器将两个3位数和一个进位相加得到一个3位和一个进位输出。为了鼓励利用实例化的全加器,可以输出行波进位加法器中每个全加器输出的进位输出。cout[2]时最后一个全加器的进位,也就是你通常看到的进位输出。
module fadd(
input a,b,cin,
output sum,cout
);
assign {cout,sum} = x + y + cin;
endmodule
module top_module(
input [2:0] a, b,
input cin,
output [2:0] cout,
output [2:0] sum );
wire [3:0]c;
assign c[0] = cin;
genvar i;
generate
for (i = 0;i < 3;i = i + 1) begin : gen_add
fadd _add(.a(a[i]),.b(b[i]),.cin(c[i]),.cout(c[i+1]),.sum(sum[i]));
end
endgenerate
assign cout = c[3:1];
endmodule
利用generate生成重复使用的全加器,可以扩展更多位数,注意定义genvar和for循环begin后有一个标签名称
1.3.4 Adder [Exams/m2014 q4j]
问题描述
建立下图电路:
module fadd(
input a,b,cin,
output sum,cout
);
assign {cout,sum} = x + y + cin;
endmodule
module top_module (
input [3:0] x,
input [3:0] y,
output [4:0] sum);
wire [4:0]c;
assign c[0] = 1'b0;
genvar i;
generate
for(i = 0;i < 4;i = i + 1) begin : gen_add
fadd _add(.a(x[i]),.b(y[i]),.cin(c[i]),.cout(c[i+1]),.sum(sum[i]));
end
endgenerate
assign sum[4] = c[4];
endmodule
和上一题没什么太大差别,略微调整一下。
看了一下网上的题解可以直接assign sum = x + y;
实现。emm…
1.3.5 Signed addition overflow [Exam/ece241 2014 q1c]
问题描述
假设你有两个8比特2进制补码数,a[7:0]和b[7:0],这些数字相加得到s[7:0],同时计算是否发生了(有符号数)溢出情况。
提示
当两个整数相加产生负结果,或者两个负数相加产生正结果时会发生符号溢出。检测溢出的方法有:可以通过比较输入和输出数字的符号来计算,或者从位n和n-1的进位导出。
assign s = a + b;
assign overflow = (a[7]==b[7]) ? s[7]^a[7] : 0;
题目建议两句assign来完成,加法和的部分溢出的部分会被舍弃,进位的部分按照提示来完成即可。
1.3.6 100-bit binary adder
问题描述
创建一个100位二进制加法器。加法器将两个100位数字和一个进位相加得到一个100位和以及进位输出。
assign {cout,sum} = a + b + cin;
结合前面题目经验,直接拼接完成。
1.3.7 4-digit BCD adder [Bcdadd4]
问题描述
提供给你一个名为bcd_fadd的BCD(二进制编码的十进制)一位加法器,他将两个BCD数字和进位相加,产生一个和和进位。
实例化bcd_fadd的四个副本以创建BCD行波进位加法器。加法器应该将两个4位BCD数和一个进位相加以产生一个4位和以及进位。
提示
5位十进制数12345的BCD表示为20’h12345与14’d12345(14’h3039)表示方式不同。所以该电路结构与普通二进制行波进位加法器除了基数是10以外基本一致。
wire [2:0] c;
bcd_fadd _fadd0(.a(a[3:0]),.b(b[3:0]),.cin(cin),.cout(c[0]),.sum(sum[3:0]));
bcd_fadd _fadd1(.a(a[7:4]),.b(b[7:4]),.cin(c[0]),.cout(c[1]),.sum(sum[7:4]));
bcd_fadd _fadd2(.a(a[11:8]),.b(b[11:8]),.cin(c[1]),.cout(c[2]),.sum(sum[11:8]));
bcd_fadd _fadd3(.a(a[15:12]),.b(b[15:12]),.cin(c[2]),.cout(cout),.sum(sum[15:12]));
参照前面二进制行波进位加法器就行了,这里不想写generate了,直接拼。
这个系列主要是记录一下自己的学习过程和简单思考过程,也参考了许多其他人的思路,题目均为HDLBits上的原题,借助翻译器和自己的理解简单组织了一下语言,如有问题欢迎批评指正。