从今天开始新的一章-Circuits,包括基本逻辑电路、时序电路、组合电路等。
今天更新整个算术电路-加法器一小节题目,包括半加器,全加器等各种加法器。
半加器和全加器的区别
半加器
半加器是由一个异或门和一个与门连接而成的组合逻辑电路。半加器电路有两个输入:A 和 B,它们将两个输入数字相加并产生一个进位和一个和。
异或门的输出是两个数的和,而与门的输出是进位。进位加法不会转发,因为没有逻辑门来处理它。因此,这被称为半加器电路。
逻辑表达式:
Sum=AXORB Carry=AANDB
真值表:
全加器
全加器是由两个异或门、两个与门和一个或门组成的电路。全加器是将三个输入相加并产生两个输出的加法器,前两个输入是 A 和 B,第三个输入是进位C-IN 的输入。输出进位指定为 C-OUT,正常输出指定为 S,即 SUM。
异或门得到的方程是二进制数字的和。而AND门得到的输出是加法得到的进位。
真值表:
逻辑表达式:
SUM=(AXORB)XORCin=(A⊕B)⊕Cin CARRY-OUT=AANDBORCin(AXORB)=A.B+Cin(A⊕B)
半加器和全加器的区别:
姓名 | 参数 | 半加器 | 全加器 |
---|---|---|---|
1 | 描述 | 半加法器是一个组合逻辑电路,将两个 1 位数字相加。半加器产生两个输入的和。 | 全加器是一种组合逻辑电路,它对三个一位二进制数执行加法运算。全加器产生三个输入和进位值的总和。 |
2 | 上一次进位 | 不使用前一个进位。 | 使用前一个进位。 |
3 | 输入 | 在半加器中,有两个输入位(A,B)。 | 在全加器中,有三个输入位(A、B、C-in)。 |
4 | 输出 | 输出是两位和 和Carry 。 | 输出是 2 位的和和 3 位输入的Carry。 |
5 | 用作 | 半加器电路不能以与全加器电路相同的方式使用。 | 可以使用全加器电路代替半加器电路。 |
6 | 特征 | 它简单易行 | 全加器的设计并不像半加器那么简单。 |
7 | 逻辑表达式 | 半加器的逻辑表达式为: S=a⊕b ; C=a*b。 | 全加器的逻辑表达式为:S=a⊕b⊕Cin;Cout=(ab)+(Cin(a⊕b))。 |
8 | 逻辑门 | 由一个异或门和一个与门组成。 | 由两个异或门、两个 AND 门和一个 OR 门组成。 |
9 | 应用 | 用于计算器,计算机,数字测量设备等。 | 用于多位加法,数字处理器等。 |
下面开始我们的题目,对于加法器有个更深刻的认识~
Problem 65-Hadd
题目说明
创建一个半加法器。半加器将两位相加(没有进位)并产生和和进位(sum and carry-out)。
模块端口声明
moduletop_module( inputa,b, outputcout,sum);
题目解析
根据半加器的逻辑表达式处理即可。
moduletop_module( inputlogica,b, outputlogiccout,sum ); assigncout=a&b; assignsum=a^b; endmodule
点击Submit,等待一会就能看到下图结果:
注意图中无参考波形。
这一题就结束了。
Problem 66-Fadd
题目说明
创建一个全加器。全加器将三位相加(包括进位)并产生和和进位。
模块端口声明
moduletop_module( inputa,b,cin, outputcout,sum);
题目解析
根据全加器的逻辑表达式处理即可。
简单解答
moduletop_module( inputlogica,b,cin, outputlogiccout,sum); assignsum=a^b^cin; assigncout=a&b|cin&(a^b); endmodule
点击Submit,等待一会就能看到下图结果:
注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
Problem 67-Adder3
题目说明
现在已经知道如何构建一个全加器,例化 3 个实例来创建一个 3 位二进制波纹进位加法器(ripple-carry adder)。加法器将两个 3 位数字和一个进位相加产生一个 3 位和和进位。为了鼓励例化全加器,还要输出纹波进位加法器中每个全加器的进位。cout[2] 是最后一个全加器的最终进位,也是通常看到的进位。
模块端口声明
moduletop_module( input[2:0]a,b, inputcin, output[2:0]cout, output[2:0]sum);
题目解析
例化正常的全加器,然后处理好进位关系即可,这种波纹进位加法器的特点需要理解,最后注意我们要把上一题写的全加器附在后面。
moduletop_module( inputlogic[2:0]a,b, inputlogiccin, outputlogic[2:0]cout, outputlogic[2:0]sum ); full_adderf_adder_u1(.a(a[0]), .b(b[0]), .cin(cin), .cout(cout[0]), .sum(sum[0]) ); full_adderf_adder_u2(.a(a[1]), .b(b[1]), .cin(cout[0]), .cout(cout[1]), .sum(sum[1]) ); full_adderf_adder_u3(.a(a[2]), .b(b[2]), .cin(cout[1]), .cout(cout[2]), .sum(sum[2]) ); endmodule modulefull_adder(inputlogica, inputlogicb, inputlogiccin, outputlogiccout, outputlogicsum ); assignsum=a^b^cin; assigncout=a&b|cin&(a^b); endmodule
点击Submit,等待一会就能看到下图结果:
注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
Problem 68-Exams/m2014 q4j
题目说明
实现下面电路:
FA代表全加器。
模块端口声明
moduletop_module( input[3:0]x, input[3:0]y, output[4:0]sum);
题目解析
这一题和上一题类似,看懂图片即可,将X[0]+Y[0]结果作为SUM[0],进位输入到下一级,以此类推。
moduletop_module( inputlogic[3:0]x, inputlogic[3:0]y, outputlogic[4:0]sum ); wirelogic[3:0]cout; full_adderf_adder_u1(.a(x[0]), .b(y[0]), .cin(1'd0), .cout(cout[0]), .sum(sum[0]) ); full_adderf_adder_u2(.a(x[1]), .b(y[1]), .cin(cout[0]), .cout(cout[1]), .sum(sum[1]) ); full_adderf_adder_u3(.a(x[2]), .b(y[2]), .cin(cout[1]), .cout(cout[2]), .sum(sum[2]) ); full_adderf_adder_u4(.a(x[3]), .b(y[3]), .cin(cout[2]), .cout(cout[3]), .sum(sum[3]) ); assignsum[4]=cout[3]; endmodule modulefull_adder(inputa,inputb,inputcin,outputcout,outputsum); assignsum=a^b^cin; assigncout=a&b|cin&(a^b); endmodule
点击Submit,等待一会就能看到下图结果:
注意图中无波形。
这一题就结束了。
Problem 69-Exams/ece241 2014 q1c
题目说明
假设有两个 2 进制 8bit 有符号数-a[7:0] 和 b[7:0]。这些数字相加产生 s[7:0]。还要计算是否发生了(有符号的)溢出。
模块端口声明
moduletop_module( input[7:0]a, input[7:0]b, output[7:0]s, outputoverflow );
题目解析
当两个正数相加产生负结果或两个负数相加产生正结果时,会发生有符号溢出。有几种检测溢出的方法:可以通过比较输入和输出数的符号来计算,或者从位 n 和 n-1 的进位推导出。简单说就是一是正正相加,产生正溢出;另一种情况是负负相减,产生负溢出。所以在代码中需要分别考虑这两种情况,将这两种情况取或判断溢出。
moduletop_module( inputlogic[7:0]a, inputlogic[7:0]b, outputlogic[7:0]s, outputlogicoverflow ); assigns=a+b; assignoverflow=a[7]&b[7]&~s[7]|~a[7]&~b[7]&s[7]; endmodule
点击Submit,等待一会就能看到下图结果:
注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
Problem 70-Adder100
题目说明
题目要求我们创建一个100bit的二进制的加法器,该电路共包含两个100bit的输入和一个cin, 输出产生sum和cout。
模块端口声明
moduletop_module( input[99:0]a,b, inputcin, outputcout, output[99:0]sum);
题目解析
没什么难度,就是位数多一点,其他没区别。
moduletop_module( inputlogic[99:0]a,b, inputlogiccin, outputlogiccout, outputlogic[99:0]sum ); assign{cout,sum}=a+b+cin; endmodule
点击Submit,等待一会就能看到下图结果:
注意图中无波形。
这一题就结束了。
Problem 71-Bcdadd4
题目说明
题目给我们提供了一个BCD加法器名字为bcd_fadd, 输入为两个4bitBCD码,一个cin,产生输出为sum和cout。
modulebcd_fadd{ input[3:0]a, input[3:0]b, inputcin, outputcout, output[3:0]sum);
且题目也说明需要我们例化4次bcd_fadd来得到一个16-bit的BCD加法器(共16bit), 同样产生sum和cout。
模块端口声明
moduletop_module( input[15:0]a,b, inputcin, outputcout, output[15:0]sum);
题目解析
这个题目难度不大,主要考察例化语法,但是我们需要看下BCD加法器结构。
moduletop_module( inputlogic[15:0]a,b, inputlogiccin, outputlogiccout, outputlogic[15:0]sum); wirelogic[2:0]cout_temp; bcd_faddu1_bcd_fadd( .a(a[3:0]), .b(b[3:0]), .cin(cin), .cout(cout_temp[0]), .sum(sum[3:0]) ); bcd_faddu2_bcd_fadd( .a(a[7:4]), .b(b[7:4]), .cin(cout_temp[0]), .cout(cout_temp[1]), .sum(sum[7:4]) ); bcd_faddu3_bcd_fadd( .a(a[11:8]), .b(b[11:8]), .cin(cout_temp[1]), .cout(cout_temp[2]), .sum(sum[11:8]) ); bcd_faddu4_bcd_fadd( .a(a[15:12]), .b(b[15:12]), .cin(cout_temp[2]), .cout(cout), .sum(sum[15:12]) ); endmodule
点击Submit,等待一会就能看到下图结果:
注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
总结
今天的几道题就结束了,整体比较简单,没有复杂的代码,没有复杂的设计思路,主要在于加法器的设计。
最后我这边做题的代码也是个人理解使用,有错误欢迎大家批评指正,祝大家学习愉快~
审核编辑:刘清
-
Verilog
+关注
关注
28文章
1351浏览量
110078 -
HDL
+关注
关注
8文章
327浏览量
47379 -
加法器
+关注
关注
6文章
183浏览量
30119
原文标题:HDLBits: 在线学习 SystemVerilog(十二)-Problem 65-71(加法器)
文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论