超前进位链(CARRY)常用于加减法运算。
超前进位链公式:
设:
FPGA中有专用的实现进位链的硬件模块CARRY4,其结构如下:
接口:
S[3:0]:“propagate”信号输入。输入信号为A^B。
DI[3:0]:“generate”信号输入。输入信号为A或B,结果都一样。
CYINIT:初始化输入。当做减法时,减数需要取反加1将减法操作转为加法操作。CYINIT=1时相当于加1操作。可动态赋值。
CIN:用于级联slices生产一个更大的进位链 。
O[3:0]:等于Sum[3:0]。
CO[3:0]:等于A+B每位的进位。
COUT:等于CO[3],用于与其他CARRY4的CIN级联生成更大的进位链。
在FPGA中实现加法操作时,当数据位宽小于8bit时会直接用LUT生成,想调用CARRY4需要用原语
module CARRY4_test #(
parameter w = 4
)
(
input [w-1:0] a,
input [w-1:0] b,
input CI,
output wire[w-1:0] O,
output wire[w-1:0] CO
);
wire [3:0] S;
assign S = a^b;
CARRY4 u1 (
.CO(CO), // 4-bit carry out
.O(O), // 4-bit carry chain XOR data out
.CI(0), // 1-bit carry cascade input
.CYINIT(0), // 1-bit carry initialization
.DI(a), // 4-bit carry-MUX data in
.S(S) // 4-bit carry-MUX select input
);
仿真文件
module tb_CARRY4;
wire [3:0] Sum;
wire [3:0] CO;
CARRY4_test #(
.w(4)
)
u1
(
.a(4'hB),
.b(4'h9),
.CI(),
.O(Sum),
.CO(CO)
);
仿真结果
结果为{CO[3],O[3:0]} = 20