Хранить std_logic биты в порядке возрастания в большом массиве

У меня есть массив из 2048 битов, и я хотел бы хранить входящие биты от 0 до 2047 в порядке возрастания битов, как это происходит в FPGA на каждом переднем фронте тактового цикла.

Например:

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

я знаю, что это может быть сделано в VHDL путем индексации массива, как

array(index) <= incoming_bit.

Тем не менее, есть ли другой лучший подход, как использование побитовых операций (сдвиг) для достижения этой цели. (без метода индексации массива), так что это в конечном итоге уменьшает сложность маршрутизации в FPGA.

3 ответа

Решение

Блок оперативной памяти

Наиболее эффективный способ преодоления проблемы маршрутизации в описываемом вами случае, вероятно, заключается в хранении бита в оперативной памяти блока.

Если вы используете массив, который вы описываете, с кодом, написанным правильно, то это, вероятно, уже то, что синтезатор сделал для вас.

Но если вы использовали сброс в своем коде для загрузки массива со всеми '0', синтезатор не сможет вывести Block RAM, создавая что-то, что, вероятно, будет не столь эффективным.

ФИФО

Если вы всегда используете биты один за другим и не используете их после этого, вы можете использовать FIFO (который, вероятно, будет реализован с помощью Block RAM синтезатором).

Биты будут храниться в FIFO по мере их поступления, и на выходе FIFO будет представлен только самый старый еще не обработанный бит.

Если положение бита имеет значение, вы можете иметь счетчик 11 битов, который увеличивается каждый раз, когда вы читаете бит из fifo, таким образом, он всегда будет отражать положение бита, который вы извлекаете из FIFO.

Надеюсь это поможет.

Ствол Шифтер

Если доступ к данным не требуется до завершения загрузки 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 обычно не может быть инициализирован за 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

По сути, если вам нужен доступ ко всем битам одновременно, вы ничего не можете поделать со сложностью маршрутизации - все входы и выходы должны присутствовать постоянно.

Если (с другой стороны) вы получаете входные биты по одному за раз (или вам нужен только доступ к ним по одному), то вы можете сохранить их в блоке памяти, что сократит использование ресурсов.

Другие вопросы по тегам