目录

0、绪论

0.1、半加器

0.2、全加器

1、XILINX CARRY4


 

0、绪论

在聊进位逻辑之前,先准备一些预备知识关于加法器(半加器和全加器)电路;

0.1、半加器

半加器(half adder)的功能是将两个一位二进制数相加。它具有两个输入和两个输出,两个输入分别为 A、B,代表着等待相加的两个数,输出为 Sum、Carry;Sum代表加的结果,Carry 代表进位逻辑;

半加器的真值表为:

ABCarrySum
0000
1001
0101
1110

加法器电路主要的构成元件由 XOR(异或门)构成,XOR 的真值表为:

所以一个半加器可以由一个异或门和一个与门组成:

半加器的简化图为:

 

0.2、全加器

全加器(full adder)将两个一位二进制数相加,并根据接收到的低位进位信号,输出和、进位输出。全加器的三个输入信号为两个加数 A、B 和低位进位 Cin

全加器真值表为:

ABCinCoutSum
00000
10001
01001
11010
00101
10110
01110
11111

全加器的逻辑电路为:

全加器的简化图为:

 

1、XILINX CARRY4

XILINX 7 系列提供的 CLB 中的 SLICE 资源,每个 SLICE 包含了一个 CARRY4 进位逻辑:

先整理出输入输出,如下所示:

image

其中,

  • CI:是上一个 CARRY4 的进位输出,位宽为1;
  • CYINT:是进位的初始化值,位宽为1;
  • DI:是数据的输入(两个加数的任意一个),位宽为4;
  • SI是两个加数的异或,位宽为4
  • O:是加法结果输出,位宽为4;
  • CO:是进位输出,位宽为4;(为什么进位输出是4bit?后面有解释)

这里我们要先解释一下FPGA中利用Carry Chain实现加法的原理,比如两个加数分别为 a = 4'b1000和 b=4'b1100,其结果应该是 8+12=20

a = 4'b1000;
b = 4'b1100;

S = a ^ b = 4'b0100;
D = b = 4'b1100;          //D取a也可以
CIN = 0;                  //没有上一级的进位输入
CYINIT = 0;               //初始值为0
// 下面为CARRY4的计算过程,具体的算法跟上图中过程一样
S0 = 0;                  //S的第0位
O0 = S0 ^ 0 = 0 ^ 0 = 0;
CO0 = DI0 = 0;            //上图中的MUXCY,S0为0时,选择1,也就是DI0,S0为1是选择2
S1 = 0;
O1 = S1 ^ CO0 = 0 ^ 0 = 0;
CO1 = DI1 = 0;
S2 = 1;
O2 = S2 ^ CO1 = 0 ^ 1 = 1;
CO2 = CO1 = 0;
S3 = 0;
O3 = S3 ^ CO2 = 0 ^ 0 = 0;
CO3 = DI3 = 1;

加法最终的输出结果为:

a = 4'b1000;

b = 4'b1100;

{O3,O2,O1,O0}=4’b0100

{CO3,CO2,CO1,CO0}=4’b1000

最终结果:{CO3,O3,O2,O1,O0} = 5’b10100 = 20

可以看出 {O3,O2,O1,O0} 是 a+b 的半加器结果,而 {CO3,CO2,CO1,CO0} 是 a+b 的进位结果;

输出给下一级的 COUT 只是CO[3]。

 

参考文献:

https://blog.csdn.net/zhanghaijun2013/article/details/103122927

https://blog.csdn.net/qq_16184883/article/details/82918184

https://blog.csdn.net/bbs165198646/article/details/76895919

https://blog.csdn.net/vivid117/article/details/102725318

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐