0

我是 Verilog、ISE、FPGA 的新手。我正在尝试在 FPGA 中实现一个简单的设计,但整个设计正在被优化掉。它基本上是一个具有一些任意值的二维数组。这是代码:

module top(
    output reg out
);

integer i;
integer j;
reg [5:0] array [0:99][0:31];

initial begin
    for(i=0;i<100;i=i+1) begin
            for(j=0;j<32;j=j+1) begin
                    array[i][j] = j;
                    out = array[i][j];
            end
    end
end

endmodule

它很好地通过了 XST 综合,但在实施过程中未能通过 MAP。给出了两个错误:

错误:地图:116 - 设计为空。不会进行任何处理。
ERROR:Map:52 - 处理 RPM 时遇到问题。

整个代码都在 XST 中进行了优化。为什么?我究竟做错了什么?

4

1 回答 1

2

你的设计被综合掉的原因是你没有在你的模块中描述任何逻辑。

您设计中的唯一模块是一个initial通常不用于综合的模块,除非在有限的情况下;该结构主要用于模拟中的测试平台(通过 ModelSim 或其他模拟器运行 Verilog)。

您想要的是使用always块或assign语句来描述 XST 的逻辑,以合成为 FPGA 进行仿真的网表。由于您提供的模块没有这些结构,因此无法生成网表,因此没有合成!

在您的情况下,尚不完全清楚您要描述的模块结果的逻辑将始终out等于 31。如果要out在值 0 到 31 之间循环,则需要添加一些顺序逻辑实施。在网上搜索一些关于数字设计的教程,这样你就掌握了基础知识(组合逻辑、门、寄存器等)。然后,考虑您希望设计做什么并将其映射到这些组件。然后,编写描述该设计的 Verilog。

根据评论进行编辑:

报告中没有使用 LUT/FF 的原因是 FPGA 不需要使用任何资源(或不需要这些资源)来实现您的模块。由于out绑定到常数 31,它的值始终为 1,因此 FPGA 只需绑定out到 Vdd(注意out不是 31,因为它只是一个 1 位寄存器)。其他数组值从不使用也不访问,因此 FPGA 将它们综合掉(即,不输出需要知道array[0][1]as的值out是一个常数,并且设计中不存在其他端口)。为了保留数组,您只需要使用它来以某种方式驱动一些输出。这是一个向您展示的基本示例:

module top( input [6:0] i_in, // Used to index the array like i
            input [4:0] j_in, // Used to index the array like j
            output reg [5:0] out // Note, out is now big enough to store all the bits in array
          );

  integer i;
  integer j;
  reg [5:0] array[0:99][0:31];

  always @(*) begin
    // Set up the array, not necessarily optimal, but it works
    for (i = 0; i < 100; i = i + 1) begin
      for (j = 0; j < 32; j = j + 1) begin
        array[i][j] = j;
      end
    end

    // Assign the output to value in the array at position i_in, j_in
    out = array[i_in][j_in];
  end

endmodule

如果您将输入i_inj_in开关或其他东西连接out到 6 个 LED,您应该能够使用开关对阵列进行索引并获得 LED 上的输出以确认您的设计。

于 2015-05-05T00:18:30.563 回答