使用生成块/循环制作纹波进位加法器
Using Generate Block/ Loop to Make a Ripple Carry Adder
我已经在这里进行了搜索并找到了一些见解,但是关于使用这种循环的一些概念让我难以理解。这是我的半加器和全加器模块:
module HalfAdder( A, B, Cout, S );
input A, B;
output Cout, S;
assign Cout = A & B;
assign S = A ^ B;
endmodule
module FullAdder(FA_A, FA_B, Cin, FA_S, Cout);
input FA_A, FA_B, Cin;
output FA_S, Cout;
wire ha0_S, ha0_C, ha1_C;
HalfAdder ha0( .A( FA_A ),
.B( FA_B ),
.Cout(ha0_C ),
.S( ha0_S )
);
HalfAdder ha1( .A( Cin ),
.B( ha0_S ),
.Cout(ha1_C ),
.S( FA_S )
);
assign Cout = ha0_C | ha1_C;
endmodule
这是我的 RCA 代码:
module RCA8(A_8, B_8, Cin, Cout, S_8);
input [7:0] A_8, B_8;
input Cin;
output Cout;
output [7:0] S_8;
wire [8:0] c;
assign c[0] = Cin;
genvar i;
generate
for (i = 0; i < 8; i=i+1)
begin : make_fadders
FullAdder fa( .FA_A( A_8[i] ),
.FA_B( B_8[i] ),
.Cin( c[i] ),
.FA_S( S_8[i] ),
.Cout( c[i+1] )
);
end
endgenerate
assign Cout = c[8];
endmodule
我正在尝试让模拟器 (iSim) 达到 运行。当我检查语法时它有效,但是当我尝试生成一个编程文件时它失败了,当我 运行 映射它时 returns 一堆警告。 iSim 显示错误 861:link 设计失败。映射与此无关吗?
我不太明白的一件事是,在实现 and/or 模拟视图中,它只在 RCA 的下拉树中显示一个 fullAdder 模块。它应该显示8吗?还是这不是它的工作原理?
我真的很想做这个,因为替代方法是手工制作 8 个推子(如作业所示...),而不是学习如何使用这个有用的工具。
其他细节:Windows10,使用32位Project Navigator Xilinx 14.7
感谢您的帮助!
看看这个 link。重命名名为 collect2.exe 的文件可能会解决您的问题。
您的代码是正确的。经过细化模拟树应该是这样的:
RCA8
make_fadder[0]
fa
make_fadder[1]
fa
.
.
.
make_fadder[7]
fa
我已经使用 Vivado 模拟器和 Aldec Riviera-PRO 对其进行了检查。
我已经在这里进行了搜索并找到了一些见解,但是关于使用这种循环的一些概念让我难以理解。这是我的半加器和全加器模块:
module HalfAdder( A, B, Cout, S );
input A, B;
output Cout, S;
assign Cout = A & B;
assign S = A ^ B;
endmodule
module FullAdder(FA_A, FA_B, Cin, FA_S, Cout);
input FA_A, FA_B, Cin;
output FA_S, Cout;
wire ha0_S, ha0_C, ha1_C;
HalfAdder ha0( .A( FA_A ),
.B( FA_B ),
.Cout(ha0_C ),
.S( ha0_S )
);
HalfAdder ha1( .A( Cin ),
.B( ha0_S ),
.Cout(ha1_C ),
.S( FA_S )
);
assign Cout = ha0_C | ha1_C;
endmodule
这是我的 RCA 代码:
module RCA8(A_8, B_8, Cin, Cout, S_8);
input [7:0] A_8, B_8;
input Cin;
output Cout;
output [7:0] S_8;
wire [8:0] c;
assign c[0] = Cin;
genvar i;
generate
for (i = 0; i < 8; i=i+1)
begin : make_fadders
FullAdder fa( .FA_A( A_8[i] ),
.FA_B( B_8[i] ),
.Cin( c[i] ),
.FA_S( S_8[i] ),
.Cout( c[i+1] )
);
end
endgenerate
assign Cout = c[8];
endmodule
我正在尝试让模拟器 (iSim) 达到 运行。当我检查语法时它有效,但是当我尝试生成一个编程文件时它失败了,当我 运行 映射它时 returns 一堆警告。 iSim 显示错误 861:link 设计失败。映射与此无关吗?
我不太明白的一件事是,在实现 and/or 模拟视图中,它只在 RCA 的下拉树中显示一个 fullAdder 模块。它应该显示8吗?还是这不是它的工作原理?
我真的很想做这个,因为替代方法是手工制作 8 个推子(如作业所示...),而不是学习如何使用这个有用的工具。
其他细节:Windows10,使用32位Project Navigator Xilinx 14.7
感谢您的帮助!
看看这个 link。重命名名为 collect2.exe 的文件可能会解决您的问题。
您的代码是正确的。经过细化模拟树应该是这样的:
RCA8
make_fadder[0]
fa
make_fadder[1]
fa
.
.
.
make_fadder[7]
fa
我已经使用 Vivado 模拟器和 Aldec Riviera-PRO 对其进行了检查。