超前进位加法以及对应FPGA Carry Logic进位链的理解

本文介绍了加法器的基本概念,包括半加器和全加器的工作原理,并详细阐述了超前进位的概念,解释了其能提前确定进位输入的原因。在Xilinx FPGA的7系列芯片中,超前进位逻辑被用于加速加法和减法运算,通过进位生成和进位传送函数实现。文章还探讨了在实现加法和减法时如何利用超前进位,以及FPGA中的进位链结构和信号处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 加法器

1.1 半加器

两个二进制数,不考虑进位输入。

真值表:

ABOCO
0000
0110
1010
1101

{O=A‾B+AB‾=A⨁BCO=AB\left\{ \begin{aligned} O &=& \overline{A}B+A\overline{B}&= A \bigoplus B \\ CO &=& AB & \end{aligned} \right.OCO==AB+ABAB=AB

在这里插入图片描述

1.2 全加器

考虑进位输入。

真值表:

CIABOCO
00000
00110
01010
01101
10010
10101
11001
11111

{O=A⨁B⨁CICO=AB+CI(A⨁B)\left\{ \begin{aligned} O & = A\bigoplus B \bigoplus CI \\ CO & = AB + CI(A\bigoplus B) \end{aligned} \right.OCO=ABCI=AB+CI(AB)

1 超前进位原理

为什么要超前进位?
进位信号逐级传递很耗时间,超前进位在相加运算之前就知道加法器的进位输入。

第i位的进位一定是两个加数中小于i的位数决定的。所以进位一定可以通过加数唯一确定。

由全加器进位 COi=AiBi+CIi(Ai⨁Bi)CO_i = A_iB_i + CI_i(A_i \bigoplus B_i)COi=AiBi+CIi(AiBi) 知,两种情况产生进位:

  • AiBiA_iB_iAiBi=1
  • Ai⨁BiA_i \bigoplus B_iAiBi=1 以及 CI_i=1

所以这里的+是逻辑

令:
{进位生成(generate)函数DIi=AiBi进位传送(propagate)函数Si=Ai⨁Bi\left\{ \begin{aligned} 进位生成(generate)函数 DI_i &= A_iB_i \\ 进位传送(propagate)函数 S_i &= A_i \bigoplus B_i \end{aligned} \right. (generate)DIi(propagate)Si=AiBi=AiBi

即:

COi=DIi+SiCIiCO_i = DI_i + S_i CI_iCOi=DIi+SiCIi

将上式展开:

COi=DIi+SiCIi=DIi+Si(DIi−1+Si−1CIi−1)=...=DIi+SiDIi−1+SiDIi−1DIi−2+...+SiSi−1...S1DI0+SiSi−1...S0CI0 \begin{aligned} CO_i &= DI_i + S_i CI_i \\ &= DI_i + S_i(DI_{i-1} + S_{i-1} CI_{i-1}) \\ &= ...\\ &= DI_i + S_iDI_{i-1} + S_iDI_{i-1}DI_{i-2} + ... +S_iS_{i-1}...S_1DI0 + S_iS_{i-1}...S_0CI_0 \\ \end{aligned} COi=DIi+SiCIi=DIi+Si(DIi1+Si1CIi1)=...=DIi+SiDIi1+SiDIi1DIi2+...+SiSi1...S1DI0+SiSi1...S0CI0

2 Xilinx fpga的超前进位逻辑

7系列FPGA的CLB有两个分离的进位链(每个slice各一个),进位链可级联形成更宽的加减逻辑。

进位链向上运行,每各slice高度为4位。对于每一位,都有一个进位数据选择器(MUXCY)和一个专用的异或门,用于用选定的进位位加/减操作数。专用进位路径和进位数据选择器(MUXCY)也可用于级联函数生成器,以实现更广泛的逻辑函数。

Device视图的SLICEL:
在这里插入图片描述

SLICEL示意图:

在这里插入图片描述

Carry Logic示意图:
在这里插入图片描述

输入:

  • 进位链的DI0-DI3输入对应进位生成函数DIiDI_iDIi

    • 来源于LUT6的O6输出
  • S0-S4输入对应进位传送函数SiS_iSi

    • 来源于LUT6的O5输出
    • 或来源于DILICE的BYSADI输入
  • CYINIT

    • 进位链的第一位输入
      • 0 :代表加
      • 1 :代表减
      • AX:动态控制
  • CIN:

    • 级联中的上一级输入

输出:

  • O0-O3:
    • 运算结果
  • CO0-CO3:
    • 每位的进位输出
    • 级联中本级的输出

1 加

假设这是第一级,则进位链的第一位由CYINIT输入,当实现加法时,CYINIT = 0。

FSDIA实现超前进位的时候:使用前级的LUT6实现进位生成函数进位传送函数

结果输出:
{Oi=Si⨁COi−1=(Ai⨁Bi)⨁COi−1i=1,2,3O0=S0⨁0=A0⨁B0 \left\{ \begin{aligned} O_i &= S_i \bigoplus CO_{i-1} &= &(A_i \bigoplus B_i)\bigoplus CO_{i-1}\quad i=1,2,3 \\ O_0 &= S_0 \bigoplus 0 &= &A_0 \bigoplus B_0 \\ \end{aligned} \right. OiO0=SiCOi1=S00==(AiBi)COi1i=1,2,3A0B0

进位输出:

首先,看看DI和S所有的情况:

AB-DI=ABS=A+B
00-00
01-01
10-01
11-10

可以看到,只有三种取值,且DI与S不会同时取1。

所以,根据公式CO=DI+SCICO=DI+S CICO=DI+SCI。可将S作为选择信号:
{CO=DI,S=0CO=CI,S=1DI与CI不同时取1 \left\{ \begin{aligned} CO = DI \quad,S=0 \\ CO = CI \quad,S=1 \\ DI与CI不同时取1 \end{aligned} \right. CO=DI,S=0CO=CI,S=1DICI1
当S=0,选择DI输出,当S=1,选择CI输出。因为DI与S不会同时取1,是可以实现表达式的。

真值表:

CIDISCO=DI+S CI
00 00
00 10
01 01
10 00
10 11
11 01

2 减

当实现减法时,运算为补码加。

CYINIT = 1,运算前逻辑取反之后加一,即取补码。

修改记录

20220322修订,更改了 + 映射成 | 或者 ⨁\bigoplus 模糊的问题。

为了深入理解并实现4位超前进位加法器,建议参考《超前进位4位加法器74LS283的VHDL程序实现》这份资料。这份资料将为你提供关于超前进位加法原理和VHDL实现的详尽知识,直接关联到你的问题。 参考资源链接:[超前进位4位加法器74LS283的VHDL程序实现](https://wenku.youkuaiyun.com/doc/6412b48fbe7fbd1778d40041?spm=1055.2569.3001.10343) 超前进位加法器是数字电路中的一个基本组件,它能够显著提高多比特数相加的速度。在VHDL中设计4位超前进位加法器,首先需要了解其基本工作原理,即每一位的和输出不仅依赖于该位的输入,还依赖于低位的进位输出。这样的设计避免了逐级等待进位的情况,因此大幅提高了计算速度。 实现VHDL代码时,需要定义一个4位的输入向量(例如A和B),以及对应的输出向量(例如Sum和CarryOut)。每一位的进位可以通过逻辑运算来确定,例如: ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity CLA4 is Port ( A : in STD_LOGIC_VECTOR (3 downto 0); B : in STD_LOGIC_VECTOR (3 downto 0); Cin : in STD_LOGIC; Sum : out STD_LOGIC_VECTOR (3 downto 0); Cout : out STD_LOGIC); end CLA4; architecture Behavioral of CLA4 is signal G, P, C : STD_LOGIC_VECTOR (3 downto 0); begin G <= A and B; -- Generate terms P <= A or B; -- Propagate terms C(0) <= Cin; for i in 0 to 2 loop C(i+1) <= G(i) or (P(i) and C(i)); end loop; Sum <= A xor B xor C; Cout <= G(3) or (P(3) and C(3)); end Behavioral; ``` 在这个例子中,`G`表示生成进位,`P`表示传播进位,`C`表示每一位的进位信号。进位信号由最低位向最高位逐位计算,而不需要等待低位的进位。最后,每一位的和(Sum)是输入向量A和B的逐位异或结果,进位输出(Cout)是最高位的进位信号。 在编写VHDL程序之后,可以使用EDA软件将设计下载到FPGA或 CPLD中,使用74LS283芯片进行验证。确保将74LS283芯片正确配置,并将VHDL程序中的输入输出信号与74LS283芯片的相应引脚连接。 通过这种方法,你可以验证VHDL程序设计的4位超前进位加法器是否能够正确执行加法运算。如果对VHDL编程或硬件验证还有更多疑问,可以查阅《超前进位4位加法器74LS283的VHDL程序实现》一书,以获得更深入的了解和实践指导。 参考资源链接:[超前进位4位加法器74LS283的VHDL程序实现](https://wenku.youkuaiyun.com/doc/6412b48fbe7fbd1778d40041?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ChipWeaver

觉得有用的话点个赞吧 :)

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

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

打赏作者

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

抵扣说明:

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

余额充值