[HDLBits做题]Combinational Logic --- Arithmetic Circuits

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]
问题描述

建立下图电路:
image

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上的原题,借助翻译器和自己的理解简单组织了一下语言,如有问题欢迎批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值