Dual Clock FIFO in VHDL

#5797376
Lesenswert?

Hallo,

ich möchte den Dual Clock FIFO (Template) von Quartus Prime nutzen. 
Zuerst möchte ich ihn testen. Dafür schreibe ich 512 Bytes mit 25MHz 
drin und ich lesen diese aber mit 1MHz. Beim Testen stelle ich leider 
fest, dass die Daten außer das erste Byte immer ein Takt später ankommen 
. Kann jmd mir bitte sagen, was ich falsch tue.

Vielen Dank!

Anbei findet ihr die VHDL-Dateien und ein Screenshot der Simulation.
Angehängte Dateien:
Gast #5797407
Lesenswert?

Yann B. schrieb:
> Kann jmd mir bitte sagen, was ich falsch tue.

Überlege dir , zu welchem Zeitpunkt (bei welcher Taktflanke) die 
Read-Adresse von deinem RAM übernommen wird. Die Datenausgänge des RAM 
reagieren genau nach dieser Taktflanke. Die Read-Adresse 0 liegt zwei 
Takte lang an, also kommen die zugehörigen Daten auch zwei Takte lang 
aus dem RAM.
#5797417
Lesenswert?

Achim S. schrieb:
> Yann B. schrieb:
>> Kann jmd mir bitte sagen, was ich falsch tue.
>
> Überlege dir , zu welchem Zeitpunkt (bei welcher Taktflanke) die
> Read-Adresse von deinem RAM übernommen wird. Die Datenausgänge des RAM
> reagieren genau nach dieser Taktflanke. Die Read-Adresse 0 liegt zwei
> Takte lang an, also kommen die zugehörigen Daten auch zwei Takte lang
> aus dem RAM.

Hi Achim,

ich lese oder ich möchte jede Adresse bei steigender Taktflanke lesen 
und das dazugehörige Byte gleichzeitig lesen (siehe sdp_RAM_tb.vhd). 
Leider tut das Programm Etwas Anderes.
Gast #5797427
Lesenswert?

Du erzeugst deine Read-Adresse (in der Testbench) mit der steigenden 
Taktflanke. D.h. die neue Read-Adresse liegt jeweils erst nach der 
steigenden Taktflanke an, das RAM "sieht" bei der steigenden Taktflanke 
noch die alte Adresse.

Daher frägst du sowohl mit der ersten steigenden Flanke als auch mit der 
zweiten steigenden Flanke jeweils die Adresse 0 ab - und erhältst als 
Reaktion die Daten zu Adresse 0. Das RAM reagiert also genau, wie es 
reagieren muss: sobald die neue Adresse angelegt wird und die nächste 
Taktflanke kommt, liefert es nach der Taktflanke die neuen Daten. So 
funktionieren alle synchronen Designs.

Vielleicht wäre es für dein Verständnis einfacher, wenn du in der 
Testbench deutlicher machen würdest, wann sich die Adresse eigentlich 
ändert. Mach aus deinem

raddr_tb <= k;

mal ein

raddr_tb <= k after 200 ns;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren