使用Verilog硬件描述语言练习加法器设计

从今天开始新的一章-circuits,包括基本逻辑电路、时序电路、组合电路等。
今天更新整个算术电路-加法器一小节题目,包括半加器,全加器等各种加法器。
半加器和全加器的区别
半加器
半加器是由一个异或门和一个与门连接而成的组合逻辑电路。半加器电路有两个输入:a 和 b,它们将两个输入数字相加并产生一个进位和一个和。
异或门的输出是两个数的和,而与门的输出是进位。进位加法不会转发,因为没有逻辑门来处理它。因此,这被称为半加器电路。
逻辑表达式:
sum = a xor bcarry = a and b   
真值表:
全加器
全加器是由两个异或门、两个与门和一个或门组成的电路。全加器是将三个输入相加并产生两个输出的加法器,前两个输入是 a 和 b,第三个输入是进位c-in 的输入。输出进位指定为 c-out,正常输出指定为 s,即 sum。
异或门得到的方程是二进制数字的和。而and门得到的输出是加法得到的进位。
真值表:
逻辑表达式:
sum = (a xor b) xor cin = (a ⊕ b) ⊕ cincarry-out = a and b or cin(a xor b) = 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)。
模块端口声明
module top_module(     input a, b,    output cout, sum );  
题目解析
根据半加器的逻辑表达式处理即可。
module top_module(     input logic a, b,    output logic cout, sum     );    assign cout = a & b;    assign sum = a ^ b;endmodule  
点击submit,等待一会就能看到下图结果:
注意图中无参考波形。
这一题就结束了。
problem 66-fadd
题目说明
创建一个全加器。全加器将三位相加(包括进位)并产生和和进位。
模块端口声明
module top_module(     input a, b, cin,    output cout, sum );  
题目解析
根据全加器的逻辑表达式处理即可。
简单解答
module top_module(     input logic a, b, cin,    output logic cout, sum );    assign sum = a^b^cin ;    assign cout = a&b | cin&(a^b) ;endmodule
点击submit,等待一会就能看到下图结果:
注意图中的ref是参考波形,yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
problem 67-adder3
题目说明
现在已经知道如何构建一个全加器,例化 3 个实例来创建一个 3 位二进制波纹进位加法器(ripple-carry adder)。加法器将两个 3 位数字和一个进位相加产生一个 3 位和和进位。为了鼓励例化全加器,还要输出纹波进位加法器中每个全加器的进位。cout[2] 是最后一个全加器的最终进位,也是通常看到的进位。
模块端口声明
module top_module(     input [2:0] a, b,    input cin,    output [2:0] cout,    output [2:0] sum );  
题目解析
例化正常的全加器,然后处理好进位关系即可,这种波纹进位加法器的特点需要理解,最后注意我们要把上一题写的全加器附在后面。
module top_module(     input logic [2:0] a, b,    input logic cin,    output logic [2:0] cout,    output logic [2:0] sum     );        full_adder f_adder_u1 (.a(a[0]),                      .b(b[0]),                       .cin(cin),                      .cout(cout[0]),                       .sum(sum[0])                     );         full_adder f_adder_u2 (.a(a[1]),                          .b(b[1]),                           .cin(cout[0]),                           .cout(cout[1]),                           .sum(sum[1])                          );         full_adder f_adder_u3 (.a(a[2]),                           .b(b[2]),                           .cin(cout[1]),                           .cout(cout[2]),                           .sum(sum[2])                          );     endmodulemodule full_adder( input logic a,                    input logic b,                    input logic cin,                    output logic cout,                    output logic sum                   );     assign sum = a ^ b ^ cin;     assign cout= a & b | cin&(a^b);   endmodule  
点击submit,等待一会就能看到下图结果:
注意图中的ref是参考波形,yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
problem 68-exams/m2014 q4j
题目说明
实现下面电路:
fa代表全加器。
模块端口声明
module top_module (    input [3:0] x,    input [3:0] y,     output [4:0] sum);  
题目解析
这一题和上一题类似,看懂图片即可,将x[0]+y[0]结果作为sum[0],进位输入到下一级,以此类推。
module top_module (    input logic [3:0] x,    input logic [3:0] y,     output logic [4:0] sum    );        wire logic [3:0]cout ;    full_adder f_adder_u1 (.a(x[0]),                          .b(y[0]),                           .cin(1'd0),                          .cout(cout[0]),                           .sum(sum[0])                           );         full_adder f_adder_u2 (.a(x[1]),                          .b(y[1]),                           .cin(cout[0]),                           .cout(cout[1]),                           .sum(sum[1])                           );         full_adder f_adder_u3 (.a(x[2]),                            .b(y[2]),                            .cin(cout[1]),                            .cout(cout[2]),                            .sum(sum[2])                           );     full_adder f_adder_u4 (.a(x[3]),                            .b(y[3]),                            .cin(cout[2]),                            .cout(cout[3]),                            .sum(sum[3])                            );        assign sum[4] = cout[3] ;endmodulemodule full_adder( input a, input b, input cin, output cout, output sum);     assign sum = a ^ b ^ cin;     assign cout= a & b | cin&(a^b);  endmodule
点击submit,等待一会就能看到下图结果:
注意图中无波形。
这一题就结束了。
problem 69-exams/ece241 2014 q1c
题目说明
假设有两个 2 进制 8bit 有符号数-a[7:0] 和 b[7:0]。这些数字相加产生 s[7:0]。还要计算是否发生了(有符号的)溢出。
模块端口声明
module top_module (    input [7:0] a,    input [7:0] b,    output [7:0] s,    output overflow);   
题目解析
当两个正数相加产生负结果或两个负数相加产生正结果时,会发生有符号溢出。有几种检测溢出的方法:可以通过比较输入和输出数的符号来计算,或者从位 n 和 n-1 的进位推导出。简单说就是一是正正相加,产生正溢出;另一种情况是负负相减,产生负溢出。所以在代码中需要分别考虑这两种情况,将这两种情况取或判断溢出。
module top_module (    input logic [7:0] a,    input logic [7:0] b,    output logic [7:0] s,    output logic overflow    );      assign s = a+b ;    assign overflow = a[7]&b[7]& ~s[7] | ~a[7] & ~b[7] & s[7] ;endmodule
点击submit,等待一会就能看到下图结果:
注意图中的ref是参考波形,yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
problem 70-adder100
题目说明
题目要求我们创建一个100bit的二进制的加法器,该电路共包含两个100bit的输入和一个cin, 输出产生sum和cout。
模块端口声明
module top_module(     input [99:0] a, b,    input cin,    output cout,    output [99:0] sum );  
题目解析
没什么难度,就是位数多一点,其他没区别。
module top_module(     input logic [99:0] a, b,    input logic cin,    output logic cout,    output logic [99:0] sum     );    assign {cout, sum} = a + b  + cin;endmodule
点击submit,等待一会就能看到下图结果:
注意图中无波形。
这一题就结束了。
problem 71-bcdadd4
题目说明
题目给我们提供了一个bcd加法器名字为bcd_fadd, 输入为两个4bitbcd码,一个cin,产生输出为sum和cout。
module bcd_fadd {    input [3:0] a,    input [3:0] b,    input     cin,    output   cout,    output [3:0] sum );  
且题目也说明需要我们例化4次bcd_fadd来得到一个16-bit的bcd加法器(共16bit), 同样产生sum和cout。
模块端口声明
module top_module (     input [15:0] a, b,    input cin,    output cout,    output [15:0] sum );  
题目解析
这个题目难度不大,主要考察例化语法,但是我们需要看下bcd加法器结构。
module top_module(     input logic [15:0] a, b,    input logic cin,    output logic cout,    output logic [15:0] sum );        wire logic [2:0] cout_temp;        bcd_fadd u1_bcd_fadd(        .a      (a[3:0]  ),        .b      (b[3:0]  ),        .cin (cin  ),        .cout (cout_temp[0] ),        .sum (sum[3:0] )    );    bcd_fadd u2_bcd_fadd(        .a      (a[7:4]  ),        .b      (b[7:4]  ),        .cin (cout_temp[0] ),        .cout (cout_temp[1] ),        .sum (sum[7:4] )    );    bcd_fadd u3_bcd_fadd(        .a      (a[11:8] ),        .b      (b[11:8] ),        .cin (cout_temp[1] ),        .cout (cout_temp[2] ),        .sum (sum[11:8] )    );    bcd_fadd u4_bcd_fadd(        .a      (a[15:12] ),        .b      (b[15:12] ),        .cin (cout_temp[2] ),        .cout (cout  ),        .sum (sum[15:12] )    );endmodule
点击submit,等待一会就能看到下图结果:
注意图中的ref是参考波形,yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
总结
今天的几道题就结束了,整体比较简单,没有复杂的代码,没有复杂的设计思路,主要在于加法器的设计。
最后我这边做题的代码也是个人理解使用,有错误欢迎大家批评指正,祝大家学习愉快~


土壤水分检测仪是什么,它的测量是否足够精准
RC滤波电路图
iPhone8设计图大曝光:史上设计最美苹果手机!
拓维信息构建智慧交通领域软硬一体化解决方案
VASS标准里的AAutoVR自动释放设备
使用Verilog硬件描述语言练习加法器设计
AI技术助力安防实现对视图数据的理解,AR技术实现安防行业的极致体验
高智能土壤多参数测试系统的特点
人社部拟新增3D打印设备操作员等10个职业
植入式医疗器械或将造就“体联网”时代
华为mate9和华为p10对比评测!两款神机你怎么选
红外线温度计使用方法及注意事项
CES 2023看点 Bianchi借助Ansys技术将自行车物理原型开发量削减70%
TLK3134 具有集成时钟抖动清除器的高灵活性四通道Ser
5通道(3路+V和2路-V)热插拔参考设计
为什么需要电压基准部件?电压基准对A/D和D/A转换影响
Nexperia的锗化硅整流器问市,兼具高效、稳定于一身
FPGA、ASIC有望在机器学习领域中崛起
七夕送男朋友什么礼物?他是不是缺头戴式蓝牙耳机?
开发TV端默认界面和视频播放界面以及手机遥控端默认界面