2017-08-07 4 views
1

Ich versuche, ein Modul mit einem asynchronen FIFO zu verbinden, der vom Xilinx CORE Generator erzeugt wird. Ich habe jedoch beobachtet, dass die am Eingang von AFIFO gelieferten Daten (obwohl sie korrekt sind) nach einer Wartezeit von 6-7 Taktzyklen auf dout erscheinen. Ist das zu erwarten? Oder mache ich etwas falsch? Was ich tue, ist, dass der write_enable-Pin von AFIFO aktiviert wird, die Eingabedaten bereitgestellt werden und dann der read_enable-Pin beim nächsten Zyklus aktiviert wird. Aber immer noch besteht das Problem der Latenz. Jede Hilfe wird geschätzt.Lesen nach Schreiblatenz im asynchronen FIFO?

EDIT: Ich füge einen Teil meines Codes an.

always @ (posedge clk1, posedge rst)//faster clock domain 
begin 
    if (rst) 
     wr_en<= 1'b 0; 

    else 
     begin 
      if (data_wrt) 
       begin 
       wr_en<= 1'b 1;       
       end 
      else 
       wr_en<= 1'b 0; 
     end 
end 
always @ (negedge clk2, posedge rst)//slower clock domain 
    begin 
     if (rst) 
      rd_en<= 1'b 0; 

     else 
      begin 
       if (wr_en) 
        begin 
        rd_en<= 1'b 1;        
        end 
       else 
        rd_en<= 1'b 0;    
      end 

    end 
AFIFO AFIFO1(//AFIFO module instantiation 
    .din(data_in), 
    .rd_clk(clk2), 
    .rd_en(rd_en), 
    .rst(reset), 
    .wr_clk(clk1), 
    .wr_en(wr_en), 
    .dout(data_out), 
    .empty(empty), 
    .full(full) 
    ); 

AFIFO Input Output

AFIFO2

+1

ein beliebiges Codefragment? – Serge

+0

Wenn Ihr 'clk2' langsamer als' clk1' ist, fehlen Ihrem 'rd_en' Flipflop möglicherweise einige der Freigabesignale (im' if (wr_en) 'Block). –

+0

Was soll ich dann tun? – Candy

Antwort

2

Was die Uhr Beziehung ist? Angenommen, Sie sehen die Latenz in 6-7 clk1 (schnelle Clock) Zyklen, scheint das etwas zu sein, was Sie erwarten würden, abhängig von der Clock-Beziehung clk1/clk2.

Das heißt, der Punkt eines asynchronen FIFO ist normalerweise, als ein Synchronisierer von einer Taktdomäne zur anderen zu fungieren. Die schreibende Taktdomäne (clk1) schreibt Daten in das AFIFO, solange es nicht voll ist. Die Lese-Taktdomäne (clk2) liest neue Daten, solange das AFIFO nicht leer ist. Was Sie hier tun, ist diese Nutzung zu brechen.

Sie verwenden wr_en, die von clk1 generiert wird, um rd_en zu steuern, die von clk2 getaktet wird. So wird jetzt wr_en in beiden Uhr-Domänen verwendet und wird metastability verursachen.

Kurz gesagt, Sie verwenden AFIFO nicht korrekt. Versuchen Sie stattdessen, Ihre CLK2-Logik immer auf rd_en zu setzen, wenn AFIFO !empty ist.

+0

Ich habe einen Screenshot meiner Simulationen mit AFIFO hochgeladen. – Candy

+0

Einige Dinge sehen in diesem Bild ein wenig seltsam aus.Zuerst würde ich sagen, dass die Verzögerung, die Sie sehen, viel größer ist als das, was ich erwarten würde. Sechs langsame Taktzyklen erscheinen übermäßig. Dies kann etwas sein, das in dem FIFO-Generator steuerbar ist. Zweitens scheinen 'empty' und' data_out' nicht synchron zu clk2 zu sein, sondern sind um 1/4 Zyklus verzögert. Dies kann jedoch eine simulierte Verzögerung und auch ein Teil des FIFO-Generators sein. Schließlich aktivieren Sie noch 'rd_en', wenn es nicht aktiviert werden sollte. 'rd_en' sollte niemals hoch sein, solange 'leer' hoch ist. – Hida

+0

Ich habe auch den zweiten Screenshot hochgeladen, in dem rd_en aktiviert ist, wenn AFIFO! Leer ist. Jetzt bekomme ich einen falschen ersten Wert bei data_out !! Zusammen mit den folgenden Warnungen, wenn ich simuliere: Fehler: C: /Xilinx/verilog/src/simprims/X_RAMB16_S36_S36.v (2655): $ setup (pagedge DIA [1] &&& dia_enable: 127784 ps, posedge CLKA: 127972 ps, 484 ps); # Zeit: 127972 ps Iteration: 3 Instanz: /tb/uut/\AFIFO1/BU2/U0/grf.rf/mem/gbm.gbmg.gbmga.gecc.bmg/blk_mem_generator/valid.cstr/ramloop[0]. ram.r/v2_noinit.ram/dp36x36.ram \ – Candy

2

Ich denke, Sie möchten einige Daten synchron zu CLK1 zu synchron zu CLK2 von einem asynchronen FIFO transformieren.

Zuerst müssen Sie kein Signal synchron zu clk1 von clk2 direkt abfragen.Wie wr_en verwenden, das von clk1 erzeugt wird, um rd_en zu steuern, das von clk2 getaktet wird. Es wird Metastabilität verursachen. FIFO wird immer zur Lösung verwendet das Problem der Metastabilität.So keine Notwendigkeit zu tun, wie die zweite immer blockieren.

So ist Problem, asynchrones FIFO richtig zu verwenden. Sie sollten Xilinx FIFO-Generator-Produktführer wie PG057 lesen. Sie sollten FIFOs Theorie und Verwendungsmethode wissen. Andernfalls haben Sie eine Menge Schmerz, wenn Sie FIFO verwenden.

Mein Rat ist unten. Für den Schreibvorgang müssen Sie sowohl fast_full als auch das volle Signal verwenden, um einen Überlauf zu vermeiden. Sie können es in PG057 Abbildung 3-2 sehen. Sie müssen fast_full verwenden, denn wenn wr_en kontinuierlich ist, ist das volle Signal 1 Takt langsamer als ein Überlauf . Für den Lesevorgang müssen Sie aus dem gleichen Grund sowohl fast_empty als auch das leere Signal verwenden. Dann können Sie den Taktbereich korrekt transformieren.

Verzeihen Sie mein Englisch.

Verwandte Themen