进位链 carry 使用相关

   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.csdn.net/qq_40483920/article/details/108082789

其中有 lut 的内部结构

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

使用进位实现TDC,需要先了解全加器的基本结构和进位传递原理。全加器是一种用于实现数字加法的电路,它接受三个输入信号:两个加数和上一位的进位信息,输出两个信号:本位的和和下一位的进位信息。全加器的进位传递原理是将上一位的进位信息与当前位的加数相加,如果和大于等于进位门的输入门限,则产生进位信号,否则不产生进位信号。 具体实现TDC进位的步骤如下: 1. 将多个全加器级联起来,组成进位。 2. 对于每个全加器,将上一位的进位信息与当前位的加数相加,得到一个中间和。 3. 将中间和输入到一个比较器中,与进位门的输入门限进行比较,如果中间和大于等于进位门的输入门限,则输出进位信号,否则不输出进位信号。 4. 将进位信号传递到下一位的全加器中,作为下一位的上一位进位信息。 5. 重复步骤2到4,直到所有位的进位信息都传递完成。 下面是一个示例的TDC进位的MATLAB代码实现: ```matlab % 定义进位门的输入门限 threshold = 2; % 定义加数和进位信息 A = [1 0 1 0]; B = [1 1 0 1]; C_in = 0; % 定义输出变量 S = zeros(size(A)); C_out = 0; % 定义全加器的进位传递函数 carry_propagate = @(a,b,c_in) (a+b+c_in >= threshold); % 实现TDC进位 for i = 1:length(A) % 计算中间和 S(i) = xor(xor(A(i),B(i)),C_in); C_in = carry_propagate(A(i),B(i),C_in); C_out = C_out + C_in; end % 输出结果 disp(['加数A:', num2str(A)]); disp(['加数B:', num2str(B)]); disp(['和S:', num2str(S)]); disp(['进位C_out:', num2str(C_out)]); ``` 请注意,这只是一个简单的示例代码,实际应用中需要考虑更多的细节和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值