Forum: Mikrocontroller und Digitale Elektronik Dual Clock FIFO in VHDL


von Yann B. (yann)


Angehängte Dateien:

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.

von Axel Zucker (Gast)


Lesenswert?

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

Nix.

von Yann B. (yann)


Lesenswert?

Und warum kommen die anderen Daten mit einem Clock später?

von Yann B. (yann)


Lesenswert?

Axel Zucker schrieb:
> Nix.

Und warum kommen die anderen Daten mit einem Clock später denn?

von Achim S. (Gast)


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.

von Axel Zucker (Gast)


Lesenswert?

Yann B. schrieb:

> warum kommen die anderen Daten mit einem Clock später denn?

Weil es so im Datenblatt steht: 
https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/ug_fifo.pdf

Bspw.: (28)

von Yann B. (yann)


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.

von Axel Zucker (Gast)


Lesenswert?

Yann B. schrieb:
> Leider tut das Programm Etwas Anderes.

Das ist kein Programm.

von Yann B. (yann)


Lesenswert?

Axel Zucker schrieb:
> Yann B. schrieb:
>
>> warum kommen die anderen Daten mit einem Clock später denn?
>
> Weil es so im Datenblatt steht:
> 
https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/ug_fifo.pdf
>
> Bspw.: (28)

Dke Axel für deinen Beitrag! Ich schaue mir es gleich an.

von Achim S. (Gast)


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;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.