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 的延时,
inport | carry dly | inport | carry dly | inport | carry dly | cin-co7 | 0.019 | |
s0 | 0.35 | ax | 0.364 | din0 | 0.346 | co7-cin | 0.027/0.040(跨bank中间) | |
s1 | 0.343 | bx | 0.341 | din1 | ||||
s2 | 0.344 | cx | 0.342 | din2 | ||||
s3 | 0.324 | dx | 0.342 | din3 | ||||
s4 | 0.255 | ex | 0.19 | din4 | ||||
s5 | 0.253 | fx | 0.182 | din5 | ||||
s6 | 0.181 | gx | 0.162 | din6 | ||||
s7 | 0.176 | hx | 0.143 | din7 |
静态时序分析给的每个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)