全加器设计思路

在电子学中,加法器(adder)是一种用于执行加法运算的数位电路部件,是构成电子计算机核心微处理器中算术逻辑单元的基础。在这些电子系统中,加法器主要负责计算地址、索引等数据。除此之外,加法器也是其他一些硬件,例如二进制数的乘法器的重要组成部分。尽管可以为不同计数系统设计专门的加法器,但是由于数位电路通常以二进制为基础,因此二进制加法器在实际应用中最为普遍。[1]

构造一个全加器

全加器

全加器(full adder)将两个一位二进制数相加,并根据接收到的低位进位信号,输出和、进位输出。全加器的三个输入信号为两个加数A、B和低位进位 C i n C_{in} Cin。全加器的真值表为:

A A A B B B C i n C_{in} Cin C o u t C_{out} Cout S S S
00000
10001
01001
11010
00101
10110
01110
11111

如上所示,为1位的全加器,如果将一个1位全加器的 C o u t C_{out} Cout端接入另一个全加器的 C i n C_{in} Cin端,n个1位全加器串联,就可以得到一个n位的全加器。

从半加器开始

要想构造一个全加器,可以先不用考虑进位的情况,即没有 C i n C_{in} Cin端口。此时,这个加法器为一个半加器。半加器的真值表如下:

A A A B B B C o u t C_{out} Cout S S S
0000
0101
1001
1110

根据半加器的真值表,我们可以很轻松地画出逻辑门电路。
在这里插入图片描述

加入进位

在计算加法时,相同位上的数相加后,还要加上从低位进上来的数。
因此,下一步就是将半加器中的 S S S C i n C_{in} Cin在经过一个半加器。
在这里插入图片描述

处理进位

最后一步就是处理连续的两个半加器所产生的两个进位。只要任意一个 C o u t C_{out} Cout输出1,最终结果就是该位一定向高位产生一个进位。因此只需要用一个或门将两个 C o u t C_{out} Cout相连。
实际上,细心观察不难发现,不可能出现两个 C o u t C_{out} Cout同时输出1的情况出现。因此,将或门替换为异或门也可以取得同样的效果。
在这里插入图片描述

至此,一个全加器就构建完成了。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
该Verilog模块实现了一个简单的4位加法器,设计思路如下: 1. 模块输入输出口 该模块有三个输入口和一个输出口。其中,a和b分别为要相加的两个4位数,cin进位信号;sum为相加的结果。 ```verilog module adder4(a, b, cin, sum); input [3:0] a; input [3:0] b; input cin; output [3:0] sum; ``` 2. 定义内部变量 定义一个内部变量carry,用于保存进位信号。 ```verilog reg carry; ``` 3. 实现加法器 根据4位数相加的原理,我们需要使用4个全加器来实现。在每个全加器中,分别对应相加的每一位。其中,第一个全加器进位信号为外部输入进位信号cin,其他的全加器进位信号为前一位的进位信号carry。 ```verilog // 第一位全加器 full_adder fa1(a[0], b[0], cin, sum[0], carry); // 第二位全加器 full_adder fa2(a[1], b[1], carry, sum[1], carry); // 第三位全加器 full_adder fa3(a[2], b[2], carry, sum[2], carry); // 第四位全加器 full_adder fa4(a[3], b[3], carry, sum[3], carry); ``` 4. 调用全加器模块 我们需要调用一个全加器模块,用于实现每一位的相加,并且更新进位信号。 ```verilog // 全加器定义 module full_adder(a, b, cin, sum, cout); input a, b, cin; output sum, cout; wire w1, w2, w3; assign w1 = a ^ b; assign w2 = w1 & cin; assign w3 = a & b; assign sum = w1 ^ cin; assign cout = w2 | w3; endmodule ``` 5. 总体结构 将上述步骤整合起来,得到完整的adder4模块。 ```verilog module adder4(a, b, cin, sum); input [3:0] a; input [3:0] b; input cin; output [3:0] sum; reg carry; full_adder fa1(a[0], b[0], cin, sum[0], carry); full_adder fa2(a[1], b[1], carry, sum[1], carry); full_adder fa3(a[2], b[2], carry, sum[2], carry); full_adder fa4(a[3], b[3], carry, sum[3], carry); endmodule module full_adder(a, b, cin, sum, cout); input a, b, cin; output sum, cout; wire w1, w2, w3; assign w1 = a ^ b; assign w2 = w1 & cin; assign w3 = a & b; assign sum = w1 ^ cin; assign cout = w2 | w3; endmodule ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弄曲幽篁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值