2013-03-22 6 views
5

Я не знаю, что оленья кожа работа на следующий код, но он не будет синтезировать:Shifting 2D массив Verilog

reg [7:0] FIFO [0:8]; 

[email protected](posedge clk) begin 
    if(wr & !rd & !full) begin 
     FIFO[0:8] <= {data_in, FIFO[1:8]}; 
    end 
end 

Я попытался проиндексировать FIFO другие способы тоже, но ничего не работает. Нашел эту тему на форуме Xilinx, но я просто не могу понять, что он хотел сказать. Вот ссылка:

http://forums.xilinx.com/t5/General-Technical-Discussion/2-dimensional-array-problem-in-Verilog/td-p/42368

благодарит

ответ

4

У вас есть промах понимание того, как упакованные и распакованные массивы работы. Я рекомендую вам ознакомиться с разделом 7.4.1, 7.4.2, 7.4.4, & IEEE1800-2012. 7.4.5. Технически IEEE1800 предназначен для SystemVerilog, который является супер-набором Verilog. Они одинаковы для массивов со статическими размерами, и я считаю, что IEEE1800 имеет более подробное объяснение и примеры, чем IEEE1364.

Если вы уже не имеете копии LRM, то вы можете скачать ее бесплатно на сайте ieee.org: IEEE Std 1800-2012

Для предоставленного кода, вы не можете присвоить каждый элемент в распакованном виде массива таким образом. У вас есть два варианта: используйте for-loop, чтобы назначить распакованную часть массива или сделать массив массивным.

/* Using for-loop */ 
reg [7:0] FIFO [0:8]; 
integer i; 
[email protected](posedge clk) begin 
    if(wr & !rd & !full) begin 
     for(i = 8; i > 0; i=i-i) begin 
      FIFO[i] <= FIFO[i-1]; 
     end 
     FIFO[0] <= data_in; 
    end 
end 

/* Using double packed array */ 
reg [0:8] [7:0] FIFO; // NOTE: format and usage explained in IEEE1800-2012 7.4.5 
[email protected](posedge clk) begin 
    if(wr & !rd & !full) begin 
     FIFO[0:8] <= {data_in,FIFO[0:7]}; 
    end 
end 
+1

Благодарю вас, вы спасли мой день :). Я действительно не знал разницы между упакованными и распакованными массивами. Я также старался реализовать его с помощью цикла for, но я использовал genvar. Спасибо за ссылку на скачивание, я сейчас же посмотрю LRM, прежде чем спрашивать :). – zsidanyi

1

следующее также будет работать. Он работает независимо от того, является ли FIFO распакованным массивом упакованных (reg [7: 0] FIFO [0: 8]) или упакованным массивом упакованных (reg [7: 0] [0: 8] FIFO).

reg [7:0] FIFO [0:8]; 

[email protected](posedge clk) begin 
    if(wr & !rd & !full) begin 
     FIFO[0] <= data_in; 
     FIFO[1:8] <= FIFO[0:7]; 
    end 
end 
Смежные вопросы