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.
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.
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)
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.