Vhdl 将std_逻辑位按升序存储到大型阵列中

Vhdl 将std_逻辑位按升序存储到大型阵列中,vhdl,verilog,fpga,synthesis,asic,Vhdl,Verilog,Fpga,Synthesis,Asic,我有一个2048位的数组,我想存储 从0到2047的输入位在每个时钟周期上升沿的FPGA中按升序排列 例如: 阵列[0]桶形移位器 如果在加载2048完成之前不需要访问数据,那么在verilog中,您可以暗示一个桶移位器。每个时钟周期,数据向下移动1个位置。在2048位结束时,所有东西都将位于正确的位置 reg [2048-1:0] arr; always @( posedge clk or negedge rst_n) begin if (~rst_n) begin arr &l

我有一个2048位的数组,我想存储 从0到2047的输入位在每个时钟周期上升沿的FPGA中按升序排列

例如:

阵列[0]桶形移位器
如果在加载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
reg[2048-1:0]arr;
始终@(posedge clk或negedge rst_n)开始
如果开始
桶形移位器
如果在加载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
reg[2048-1:0]arr;
始终@(posedge clk或negedge rst_n)开始
如果开始

arr块RAM

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

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

但是,如果您在代码中使用重置来加载所有“0”的数组,合成器将无法推断出块内存,从而产生可能没有那么有效的东西

FIFO

如果您总是一个接一个地使用这些位,然后再不使用,那么您可以使用FIFO(这可能由合成器使用块RAM实现)

这些位进入时将存储在FIFO中,在FIFO输出时,只有最旧的尚未处理的位会显示给您

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


希望这有帮助。

阻塞RAM

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

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

但是,如果您在代码中使用重置来加载所有“0”的数组,合成器将无法推断出块内存,从而产生可能没有那么有效的东西

FIFO

如果您总是一个接一个地使用这些位,然后再不使用,那么您可以使用FIFO(这可能由合成器使用块RAM实现)

这些位进入时将存储在FIFO中,在FIFO输出时,只有最旧的尚未处理的位会显示给您

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


希望这能有所帮助。

基本上,如果您需要同时访问所有位,那么对于路由复杂性,您无能为力——输入和输出都必须始终存在


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

基本上,如果您需要一次访问所有位,对于路由的复杂性,您无能为力——输入和输出都必须始终存在


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

不可能等待2048个时钟周期,因为这些位并行用于其他一些计算。因此,位应始终处于正确的位置。在首次填充阵列的初始2048周期之后,答案将始终以升序显示阵列中最新的2048位。请详细说明如果无法等待2048个周期,您希望如何获得初始2048位的问题?它基本上类似于一个流水线过程,当我在第一个位置获得位时,另一个过程使用该位并执行一些计算。当它完成计算时,可能会有2个或更多位被塞进数组中。所以钻头的位置非常重要。像第一个周期[----0]、第二个周期[----10]、第三个周期[----110]等等。@powernest:这是否意味着您实际上不需要同时使用所有2048位,而只需要最后几位?或者您会使用上一个(传输)周期中的数据吗?是的,我不需要同时使用所有2048位,但正如我前面提到的,位位置非常重要。比特流应该以[----0]、----10]、----010]、----1010]……等形式出现。该位应按该顺序从0添加到2047。不可能等待2048个时钟周期,因为这些位并行用于其他一些计算。因此,位应始终处于正确的位置。在首次填充阵列的初始2048周期之后,答案将始终以升序显示阵列中最新的2048位。请详细说明如果无法等待2048个周期,您希望如何获得初始2048位的问题?它基本上类似于一个流水线过程,当我在第一个位置获得位时,另一个过程使用该位并执行一些计算。当它完成计算时,可能会有2个或更多位被塞进数组中。所以位的位置是qui
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
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