0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

OpenFPGA 来源:OpenFPGA 作者:碎碎思 2022-10-26 08:58 次阅读

从今天开始新的一章-Circuits,包括基本逻辑电路、时序电路、组合电路等。

今天更新整个算术电路-加法器一小节题目,包括半加器,全加器等各种加法器。

半加器和全加器的区别

半加器

半加器是由一个异或门和一个与门连接而成的组合逻辑电路。半加器电路有两个输入:A 和 B,它们将两个输入数字相加并产生一个进位和一个和。

poYBAGNYhoiAAEdfAABe64Ig858591.jpg


异或门的输出是两个数的和,而与门的输出是进位。进位加法不会转发,因为没有逻辑门来处理它。因此,这被称为半加器电路。

逻辑表达式:

Sum=AXORB
Carry=AANDB

真值表:

pYYBAGNYhpuASa5cAACZFReVYzU488.jpg

全加器

全加器是由两个异或门、两个与门和一个或门组成的电路。全加器是将三个输入相加并产生两个输出的加法器,前两个输入是 A 和 B,第三个输入是进位C-IN 的输入。输出进位指定为 C-OUT,正常输出指定为 S,即 SUM。

poYBAGNYhq-AUqvRAACA6KkBHdo524.jpg

异或门得到的方程是二进制数字的和。而AND门得到的输出是加法得到的进位。

真值表:

poYBAGNYhr6AKE_SAADK4RzPR3E259.jpg

逻辑表达式:

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

pYYBAGNYhtOAS1UGAACM_82lcWs549.jpg

点击Submit,等待一会就能看到下图结果:

pYYBAGNYhuKAReJSAAB9M3Y3C70956.jpg

注意图中无参考波形。

这一题就结束了。

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

pYYBAGNYhv-AEByDAACRJ8ms-Iw358.jpg

点击Submit,等待一会就能看到下图结果:

poYBAGNYhweANqhTAAFOpwYKImA254.jpg

注意图中的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

poYBAGNYhymAO9BtAAEEoBxRh9o316.jpg

点击Submit,等待一会就能看到下图结果:

poYBAGNYhzGADo9rAAExg6fGaQo788.jpg

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 68-Exams/m2014 q4j

题目说明

实现下面电路:

poYBAGNYh0eAfofwAACDS5ogSXs013.jpg

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

poYBAGNYh2OAfmbXAAENMStxyQ4727.jpg

点击Submit,等待一会就能看到下图结果:

poYBAGNYh2uAIngVAACGcQxQnGk340.jpg

注意图中无波形。

这一题就结束了。

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

poYBAGNYh4aAQr_7AACkjRKVwbU954.jpg

点击Submit,等待一会就能看到下图结果:

poYBAGNYh42APoH4AAFqBamcqaE437.jpg

注意图中的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

poYBAGNYh5-AeLIjAACZ9Zs_s8A170.jpg

点击Submit,等待一会就能看到下图结果:

poYBAGNYh7CARngWAACLNGWH0Sk932.jpg

注意图中无波形。

这一题就结束了。

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

poYBAGNYh8eAaDMaAAEJ-xuQ_gU870.jpg

点击Submit,等待一会就能看到下图结果:

poYBAGNYh9qAEe22AAF_t3wutT8682.jpg

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

总结

今天的几道题就结束了,整体比较简单,没有复杂的代码,没有复杂的设计思路,主要在于加法器的设计。

最后我这边做题的代码也是个人理解使用,有错误欢迎大家批评指正,祝大家学习愉快~






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1326

    浏览量

    109302
  • HDL
    HDL
    +关注

    关注

    8

    文章

    323

    浏览量

    47104
  • 加法器
    +关注

    关注

    6

    文章

    174

    浏览量

    29732

原文标题:HDLBits: 在线学习 SystemVerilog(十二)-Problem 65-71(加法器)

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Verilog HDL硬件描述语言

    Verilog HDL硬件描述语言
    发表于 01-13 14:40

    两个4位加法器级联构成一个8位加法器 verilog怎么写啊?!!

    小弟是初学者,刚把verilog基本语法看完,只会写简单的四位或者八位的加法器,但是两个4位加法器级联构成一个8位加法器不会写啊,应该是顶层调用两个四位的,但不知道具体怎么写,求大神指
    发表于 12-03 11:51

    加法器

    请问下大家,,进位选择加法器和进位跳跃加法器的区别是啥啊?我用Verilog实现16位他们的加法器有什么样的不同啊?还请知道的大神告诉我一下。。
    发表于 10-20 20:23

    什么是加法器加法器的原理是什么 ?

    什么是加法器加法器的原理是什么 反相加法器等效原理图解析
    发表于 03-11 06:30

    加法器,加法器是什么意思

    加法器,加法器是什么意思 加法器 :  加法器是为了实现加法的。  即是产生数的和的装置。加数和被加数为输入,和数与
    发表于 03-08 16:48 5159次阅读

    verilog硬件描述语言课程讲义

    verilog硬件描述语言课程讲义
    发表于 05-21 15:01 33次下载
    <b class='flag-5'>verilog</b><b class='flag-5'>硬件</b><b class='flag-5'>描述语言</b>课程讲义

    Verilog硬件描述语言参考手册

    Verilog硬件描述语言参考手册,Verilog语法内容介绍
    发表于 11-12 17:20 0次下载

    Verilog HDL硬件描述语言

    Verilog HDL硬件描述语言 有需要的下来看看
    发表于 12-29 15:31 0次下载

    Verilog硬件描述语言

    VHDL语言编程学习Verilog硬件描述语言
    发表于 09-01 15:27 0次下载

    Verilog HDL硬件描述语言

    Verilog HDL硬件描述语言,感兴趣的小伙伴们可以瞧一瞧。
    发表于 11-11 11:20 11次下载

    基于Verilog硬件描述语言的IEEE标准硬件描述语言资料合集免费下载

    本文档的主要内容详细介绍的是基于Verilog硬件描述语言的IEEE标准硬件描述语言资料合集免费下载:1995、2001、2005;Syst
    发表于 06-18 08:00 10次下载

    加法器是如何实现的

     verilog实现加法器,从底层的门级电路级到行为级,本文对其做出了相应的阐述。
    发表于 02-18 14:53 5753次阅读
    <b class='flag-5'>加法器</b>是如何实现的

    加法器设计代码参考

    介绍各种加法器Verilog代码和testbench。
    发表于 05-31 09:23 19次下载

    使用Verilog/SystemVerilog硬件描述语言练习数字硬件设计

    HDLBits 是一组小型电路设计习题集,使用 Verilog/SystemVerilog 硬件描述语言 (HDL) 练习数字硬件设计~
    的头像 发表于 08-31 09:06 1209次阅读

    加法器的原理及采用加法器的原因

    有关加法器的知识,加法器是用来做什么的,故名思义,加法器是为了实现加法的,它是一种产生数的和的装置,那么加法器的工作原理是什么,为什么要采用
    的头像 发表于 06-09 18:04 3846次阅读