使用生成块/循环制作纹波进位加法器

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 的文件可能会解决您的问题。

Xilinx Installation and troubleshooting

您的代码是正确的。经过细化模拟树应该是这样的:

RCA8
  make_fadder[0]
    fa
  make_fadder[1]
    fa
  .
  .
  .
  make_fadder[7]
    fa    

我已经使用 Vivado 模拟器和 Aldec Riviera-PRO 对其进行了检查。