2013-03-22 16 views
5

Non so che cosa non funziona sul seguente codice, ma non lo sintetizzo:Shifting matrice 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 

ho cercato di indicizzare i FIFO altri modi, ma non funziona niente. Ho trovato questo argomento su un forum Xilinx ma non riesco a capire cosa volesse dire con questo. Ecco il link:

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

grazie

risposta

4

Hai una miss comprensione di come imballato e gli array non imballati lavoro. Vi consiglio di leggere la sezione IEEE1800-2012 7.4.1, 7.4.2, 7.4.4, & 7.4.5. Tecnicamente IEEE1800 è per SystemVerilog che è un super set di Verilog. I due sono gli stessi per gli array con dimensioni statiche e trovo che IEEE1800 abbia una spiegazione migliore e esempi di IEEE1364.

Se non si dispone già di una copia della LRM, quindi è possibile scaricarlo gratuitamente dal sito ieee.org: IEEE Std 1800-2012

Per il codice fornito, non è possibile assegnare ogni elemento di un array scompattato in questo modo Hai due possibilità: usa un ciclo for per assegnare la parte scompattata dell'array, oppure raddoppiare il tuo array.

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

Grazie, hai salvato la mia giornata :). Non sapevo davvero la differenza tra gli array compressi e quelli decompressi. Ho anche provato formarmente a implementarlo con il ciclo for, ma ho usato genvar. Grazie anche per il link di download, ora cercherò LRM prima di chiedere :). – zsidanyi

1

funziona anche quanto segue. Funziona indipendentemente dal fatto che FIFO sia un array decompresso di FIFO [0: 8] (reg [7: 0]) o una serie di pacchetti compresso (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