2013-03-22 21 views
5

nie wiem co robi pracować na poniższym kodzie, ale to przyzwyczajenie syntezy:Shifting 2D array 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 

Próbowałem indeksu FIFO też inne sposoby, ale nic nie działa. Znalazłem ten temat na forum Xilinx, ale nie mogę po prostu powiedzieć, co chciał powiedzieć. Oto link:

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

dzięki

Odpowiedz

4

Masz zrozumienie Miss how zapakowane i rozpakowania tablic pracy. Polecam przeczytać IEEE1800-2012 rozdział 7.4.1, 7.4.2, 7.4.4, & 7.4.5. Technicznie IEEE1800 jest dla SystemVerilog, który jest super zestawem Verilog. Te dwa są takie same dla tablic o rozmiarach statycznych i uważam, że IEEE1800 ma lepsze wyjaśnienie i przykłady niż IEEE1364.

Jeżeli nie masz jeszcze kopię LRM, a następnie można go pobrać za darmo na stronie internetowej ieee.org: IEEE Std 1800-2012

Dla podanego kodu, nie można przypisać każdy element w tablicy rozpakowany w ten sposób. Masz dwie możliwości: użyj pętli for, aby przypisać rozpakowaną część tablicy lub spakuj tablicę podwójnie.

/* 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

Dziękuję, uratowałeś mój dzień :). Naprawdę nie wiedziałem, jaka jest różnica pomiędzy tablicami upakowanymi i rozpakowanymi. Próbowałem również formarly, aby zaimplementować go z pętli for, ale użyłem genvar. Dziękuję również za link do pobrania. Sprawdzę LRM teraz, zanim zapytam :). – zsidanyi

1

Poniższe będą również działać. Działa to, czy FIFO jest rozpakowaną tablicą z zapakowanymi (reg [7: 0] FIFO [0: 8]), czy zapakowaną tablicą pakowanych (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