2013-03-22 10 views
5

Ich weiß nicht, was auf dem folgenden Code nicht funktioniert, aber es wird nicht synthetisieren: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 

Ich habe versucht, die FIFO andere Weise zu indizieren, aber nichts funktioniert. Ich habe dieses Thema in einem Xilinx-Forum gefunden, aber ich kann einfach nicht herausfinden, was er damit sagen wollte. Hier ist der Link:

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

dank

Antwort

4

Sie haben eine Chance vertan zu verstehen, wie verpackten und unverpackten Arrays arbeiten. Ich empfehle Ihnen, den Abschnitt IEEE1800-2012 7.4.1, 7.4.2, 7.4.4, & 7.4.5 zu lesen. Technisch ist IEEE1800 für SystemVerilog, das ein Super-Satz von Verilog ist. Die beiden sind die gleichen für Arrays mit statischen Größen und ich finde, IEEE1800 hat eine bessere Erklärung und Beispiele als die IEEE1364.

Wenn Sie nicht bereits über eine Kopie des LRM haben, dann können Sie es kostenlos auf der ieee.org Website herunterladen: IEEE Std 1800-2012

Für den Code zur Verfügung gestellt, können Sie nicht jedes Element in einem entpackten Array zuweisen auf diese Weise. Sie haben zwei Möglichkeiten: Verwenden Sie eine for-Schleife, um den entpackten Teil des Arrays zuzuordnen, oder machen Sie Ihr Array doppelt gepackt.

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

Vielen Dank, Sie haben meinen Tag gerettet :). Ich kannte den Unterschied zwischen gepackten und nicht gepackten Arrays wirklich nicht. Ich habe auch versucht, es formell mit for-Schleife zu implementieren, aber ich habe Genvar verwendet. Danke auch für den Downloadlink. Ich werde jetzt das LRM nachschlagen, bevor ich frage :). – zsidanyi

1

das Folgende wird auch funktionieren. Es funktioniert, ob FIFO ein entpacktes Array von gepackten (reg [7: 0] FIFO [0: 8]) oder ein gepacktes Array von gepackten (reg [7: 0] [0: 8] FIFO) ist.

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