进位链 carry 使用相关

本文详细介绍了FPGA中的CARRY8模块,包括其配置选项、输入输出信号以及工作原理。CARRY8用于实现8位或4位双进位加法/减法操作,其S信号选择数据输入,DI信号提供加法或减法数据,CYINIT用于设定加法或减法操作。文章还讨论了不同输入到CO7的延迟,并提供了实测的延时数据。此外,对比了Altera和Xilinx FPGA逻辑单元的差异,强调Altera的LE单元内置lut和reg,可直接形成级联的进位链。

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

   CARRY8 #(
      .CARRY_TYPE("SINGLE_CY8")  // 8-bit or dual 4-bit carry (DUAL_CY4, SINGLE_CY8)
   )
   CARRY8_inst (
      .CO(CO),         // 8-bit output: Carry-out
      .O(O),           // 8-bit output: Carry chain XOR data out
      .CI(CI),         // 1-bit input: Lower Carry-In
      .CI_TOP(CI_TOP), // 1-bit input: Upper Carry-In
      .DI(DI),         // 8-bit input: Carry-MUX data in
      .S(S)            // 8-bit input: Carry-mux select
   );

 上图的原理图在ug547 的 p23,

S[3:0]:为二选一逻辑MUXCY的选择信号0选左边,1选进位结果S的值为A^B
DI[3:0]:即原理图O5或者AX(对应下图dev 的 DI或者AX)二选一,值为A或B,结果都一样。
CYINIT:加时为0,减时为1。即当做减法时,减数需要取反加1将减法操作转为加法操作。CYINIT=1时相当于加1操作。可用AX动态赋值。
CIN:用于级联slices生产一个更大的进位链 。
O[3:0]:即AMUX/AQ--HMUX/HQ 为实际计算结果
CO[3:0]:即AQ-HQ 为每一位的进位结果
COUT:等于CO[3],用于与其他CARRY4的CIN级联生成更大的进位链

图中类似于 O5与 AX的 等腰梯形 为或逻辑

在位宽小于8bit时,fpga算法会直接用lut生成,除非用原语

下图中 device中的实际引脚,AX-HX 即原理图中的 AX-HX,DI0-DI7 即为 O5 From LUTA-H

O5与 AX 每次只有一路有效,且只有 O5 与O6 的逻辑能公用同一个 LUT 时,才会从 O5 (DI)走,如下图中红线 O5 与蓝线 O6(S0)来自同一个LUT


 

以下为carry不同入口到 CO7 的延时,

inportcarry dlyinportcarry dlyinportcarry dlycin-co70.019
s00.35ax0.364din00.346co7-cin0.027/0.040(跨bank中间)
s10.343bx0.341din1   
s20.344cx0.342din2   
s30.324dx0.342din3   
s40.255ex0.19din4   
s50.253fx0.182din5   
s60.181gx0.162din6   
s70.176hx0.143din7   

静态时序分析给的每个carry链的分辨率为0.019+0.027 ns = 46ps(互联线+carry本身),

实测下来 ku040 在 37±5℃ 时,每级的延时如下表所示,每级的延时在5-70ps之间,(包括不同的每级reg到carry链之间的固化的类似走线误差引入),21级的延时在750-820ps之间, 即平均 每级 37 ± 2 ps,

altera 的 逻辑单元 与 xilinx 的逻辑单元 完全不一样

 altera 的每个 LE 单元有 8 个相同的小单元,每个小单元里面有左边的1个 lut单元和右侧的1个 reg单元,没有专门的carry 链,

左侧 lut 单元可以例化成2位全加器,carry链等,有carry_in  和 carry_out 接口,可以直接形成级联

可以参考  https://blog.youkuaiyun.com/qq_40483920/article/details/108082789

其中有 lut 的内部结构

官方原文档 2. Logic Elements and Logic Array Blocks
in Cyclone IV Devices (CYIV-51002-1.0)

### 减少FPGA设计中Carry8组件使用的策略 在FPGA设计过程中,减少`Carry8`组件的使用可以优化资源利用率和提高性能。以下是几种有效的方法和技术: #### 1. 使用分布式算术操作 通过利用查找表(LUTs)来实现简单的加法或减法运算,而不是依赖于专用的进位链路结构如`Carry8`。这种方法适用于较小规模的操作数宽度。 ```verilog // 示例:使用LUT实现简单加法器 module small_adder ( input wire [3:0] a, input wire [3:0] b, output reg [4:0] sum ); always @(*) begin sum = a + b; end endmodule ``` #### 2. 启用流水线技术 当面对较大位宽的数据路径时,在适当位置插入寄存器级联形成流水线阶段,这不仅能够降低组合逻辑延迟还可能间接减少了对连续进位链的需求[^4]。 ```verilog // 示例:带流水线的大位宽加法器 module pipelined_adder #( parameter WIDTH=32 )( input wire clk, input wire rst_n, input wire [WIDTH-1:0] a, input wire [WIDTH-1:0] b, output reg [WIDTH:0] sum ); reg [WIDTH/2-1:0] mid_sum; assign {sum[WIDTH],mid_sum} = {{(WIDTH/2){1'b0}},a[WIDTH-1:WIDTH/2]} + {{(WIDTH/2){1'b0}},b[WIDTH-1:WIDTH/2]}; always @(posedge clk or negedge rst_n) begin if (!rst_n) sum <= 'd0; else sum[WIDTH-1:0] <= {mid_sum,a[WIDTH/2-1:0]+b[WIDTH/2-1:0]}; end endmodule ``` #### 3. 利用IP核特性 对于复杂且频繁使用的功能模块,考虑采用供应商提供的硬宏(Hard Macro) IP核解决方案。这类预构建好的硬件单元通常已经过优化以最小化内部互联开销并最大化吞吐量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值