1

我有一个 2048 位的数组,我想将 0 到 2047 的输入位按位升序存储,因为它在时钟周期的每个上升沿进入 FPGA。

例如:

array[0] <= 1st bit
array[1] <= 2nd bit
...
..
array[2047] <= 2048 th bit.

我知道它可以通过数组索引在 VHDL 中完成

array(index) <= incoming_bit.

但是,有没有其他更好的方法,比如使用按位运算(移位)来实现这一点。(没有数组索引方法),从而最终降低了FPGA中的布线复杂度。

4

3 回答 3

3

块 RAM

在您描述的情况下,克服路由问题的最有效方法可能是将位存储在块 RAM 中。

如果您将描述的数组与以正确方式编写的代码一起使用,那么它可能已经是合成器为您推断的内容。

但是,如果您在代码中使用了重置来加载全为“0”的数组,那么合成器将无法推断出 BlockRAM,从而产生可能不会那么有效的东西。

先进先出

如果您总是一个接一个地使用这些位,并且在那之后不使用它,您可以使用 FIFO(这可能会由合成器使用 BlockRAM 实现)。

这些位将在进入时存储在 FIFO 中,并且只有最旧的尚未处理的位将在 FIFO 的输出中呈现给您。

如果位的位置很重要,您可以有一个 11 位计数器,每次您从 fifo 读取一个位时都会递增,因此它将始终反映您从 FIFO 中取出的位的位置。

希望这可以帮助。

于 2014-01-04T20:28:45.273 回答
1

桶式移位器

如果在加载 2048 完成之前不需要访问数据,那么在 verilog 中您可以暗示一个桶形移位器。每个时钟周期,数据都会下移 1 个位置。在 2048 位结束时,每件事都会在正确的位置。

reg [2048-1:0] arr;

always @( posedge clk or negedge rst_n) begin
  if (~rst_n) begin
    arr <= 'b0;
  end
  else begin
    arr[2048-1:0] <= {data_in, arr[2048-1:1]} 
  end
end

内存

如果在加载完整的 2048 位之前需要访问第一位,则 RAM 是理想的选择。RAM 通常不能在 1 个时钟周期内初始化,也不能异步复位。因此,您只能从已写入的位置读取数据。您可以为 FPGA 指定初始条件,我相信 FPGA 启动路由可以为您初始化它。但是一旦运行就没有简单的方法来清除它。

input            data_in;
input [10:0]     wr_addr;
reg   [2048-1:0] arr;

always @( posedge clk ) begin
  arr[wr_addr] <= data_in; 
end

// Optional FPGA initialisation
integer i;
initial begin
  for(i=0; i<2048; i=i+1) begin
    arr[i] <= 'b0;
  end
end
于 2014-01-03T13:43:29.073 回答
0

从根本上说,如果您需要一次访问所有位,那么您对路由复杂性无能为力 - 输入和输出都必须始终存在。

如果(另一方面)您一次获取一个输入位(或一次只需要访问一个),那么您可以将它们存储在一个内存块中,这将减少资源使用。

于 2014-01-06T21:50:03.367 回答