Hallo Forum,
ich versuche gerade einen UART auf meine DE2-115 Board zu
implementieren. Receiver und Transmitter laufen. Daten kann ich senden
und auch empfangen.
Ich möchte in meinem Design einen Dual Port Ram einsetzen um das
folgende Verarbeiten unabhänig vom empfangen zu halten. Das heißt wenn
Daten empfangen werden, werden diese direkt in den RAM geschrieben. Der
Process sieht dafür folgender Maßen aus:
Im ersten Teil wird in den RAM geschrieben auf die entsprechende Adresse
(sig_addr_counter). Bei weiteren empfangenen Daten wird immer wieder
erhöht bis das ende des RAMs erreicht ist. Dann fängt der von vorne an.
Bereits vorhandene Daten werden gelöscht. (ist gewollt) Im folgenden
Teil wird ausgelesen von der übergebenen Adresse.
Hierfür habe ich in einem weiteren Process eine Statemachine
geschrieben, womit die Signallaufzeiten,(verfügbarkeit) berücksichtigt
werden sollen.
das Signal sig_doa ist der Ausgang vom RAM und der Wert von der
abgefragten Adresse soll in das Signal memory_global abgelegt werden.
Der Process ist so ausgelegt, das dies solange gemacht wird bis der FiFo
leer ist. Das funktioniert auch alles, allerdings wird mir immer eine
Null zurück gegeben. Und da liegt mein Problem. Irgendwas mit der
Berechnung und der Parallelität mit Signalen und dem FPGA habe ich
wahrscheinlich übersehen. Hat jemand eventuell eine Idee was ich noch
anders machen kann oder noch ergänzen.
zur vollständigkeit hier noch der RAM. da bin ich mir aber sicher, das
dieser funktioniert.
Vielen Dank, Gruß Michael
Michael schrieb:> Das funktioniert auch alles, allerdings wird mir immer eine> Null zurück gegeben. Und da liegt mein Problem. Irgendwas mit der> Berechnung und der Parallelität mit Signalen und dem FPGA habe ich> wahrscheinlich übersehen.
Warum machst Du keine Simulation?
Duke
Michael schrieb:> Der Process sieht dafür folgender Maßen aus:
Verwende doch bitte die [ vhdl ] und [ /vhdl ] Tags um deinen Code
(ohne die Leerzeichen in den eckigen Klammern).
> shared variable
Wofür brauchst du sowas?
> da bin ich mir aber sicher, das dieser funktioniert.
Du hast das RAM also simuliert und nachvollzogen, dass es das macht, was
du willst?
BTW: du brauchst für diese Aufgabe mit 99,999% Wahrscheinlichkeit kein
DPRAM. Denn die SIO ist so unglaublich viel langsamer als deine
Taktfrequenz, dass du locker ein stinknormales RAM lesen und schreiben
kannst...
Ein DP-RAM wird hier nicht nur nicht benötigt, sondern ist auch noch
kontraproduktiv. Wenn es asynchron beschrieben wird, dann liegt ein
elend langer Schreibvorgang an, während dem nichts (vernüftiges) gelesen
werden kann und folglich nicht darf. Wenn man es aber synchron
beschreibt, um einen kurzen Schreibvorgang im Massstab des Systemtaktes
zu haben, muss man die IOs zwangsläufig einsynchronisieren, landet
indirekt bei der konventionellen Lösung und kann wie schon angedeutet,
das DPRAM direkt weglassen.
Was hier gebraucht wird, ist bestenfalls ein FIFO.