使用生成块/循环来制作波纹携带加法器

时间:2016-09-11 03:49:37

标签: loops for-loop verilog xilinx-ise

我已经在这里完成了搜索并找到了一些见解,但是有些使用这种循环的概念让我感到不舒服。以下是Half-Adder和Full-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)运行。当我检查语法时它可以工作,但是当我尝试生成一个编程文件时它失败了,当我运行Mapping时它会返回一堆警告。 iSim说错误861:未能链接设计。没有映射与此有关吗?

我真正理解的一件事是,在实现和/或模拟视图中,它只在RCA的下拉树中显示一个fullAdder模块。它应该显示8吗?或者这不是如何工作的?

我真的想做这项工作,因为替代方法是手工制作8个fadders(如作业所示......),而不是学习如何使用这个有用的工具。

其他细节:Windows 10,使用32位Project Navigator Xilinx 14.7

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

查看此链接。重命名名为collect2.exe的文件可能会解决您的问题。

Xilinx Installation and troubleshooting

答案 1 :(得分:0)

您的代码是正确的。在详细说明之后,模拟树应该如下所示:

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

我用Vivado模拟器和Aldec Riviera-PRO检查了它。