Hallo Leute! Da ich gerade im Begriff bin mich mit VHDL anzufreunden, wollte ich ein kleines Projekt in Angriff nehmen. Nämlich eine UART. Zu Beginn soll sie nur senden können, 8-Bit kein Parity-Bit. Ich habe es zwar schon geschafft ein Zeichen erfolgreich hinauszuschicken, aber ich habe das Ganze relativ umständlich gelöst, da bei jedem Bitwechsel der Prozess neu aktiviert wird und bei jedem Eintreten in den Prozess relativ viele If-Abfragen notwentig sind. Jetzt bin ich gerade dabei das kleine Projekt möglichst zu vereinfachen, leider fehlt mir hier ein bißchen die Erfahrung. Ich hätte die Idde gehabt, dass der Prozess nicht bitweise aktiviert wird (also nicht nach jedem Bitwechsel), sondern, wenn ein Byte gesendet wird, dass der Prozess auch nur einmal aktiviert wird. Leider hatte ich hier einen Denkfehler, seht selbst: seroutx: process(clk,start,counter) variable counterv: integer:=0; variable sercount: integer range 0 to 7:=7; begin counterv:=0; sercount:=0; if clk'event and clk='0' then if start='0' then counterv:=counter; serout<='0'; sercount:=7; for i in 7 downto 0 loop while counter<(counterv+bitleng) loop end loop; serout<=sign(sercount); sercount:=sercount-1; counterv:=counter; end loop; while counter<(counterv+bitleng) loop end loop; serout<='1'; while counter<(counterv+bitleng) loop end loop; end if; -- start end if; -- clock end process seroutx; Kommt eine CLK-Flanke und ist ein Bestimmter Taster gedrückt, dann soll das Byte gesendet werden. In einem anderen Prozess wird das Signal Counter ensprechend hochgezählt. Die For-Schleife hätte die Aufgabe alle 8-Bit auszugeben. Leider funktioniert das nicht, da ein Signal erst nach Ablauf eines Prozesses aktualisiert wird. Aus diesem Grund passiert mit dieser jetzigen Konstruktion genau gar nichts. Nun meine Frage: Wie würdet ihr das Problem lösen? Ich freue mich über eure Antworten. Tschüss Martin
Hallo, das Problem löst man mit einer Statemachine (FSM). Diese hat mehrere Zustände, z.B. - warten bis Taster gedrückt - Start-Bit senden - Byte senden - Stop-Bit senden - zurück zum IDLE-State Hast Du schon mit FSMs gearbeitet ?
Hallo Martin, hier merkt man, daß du bisher Software geschrieben hast und noch an der sequentiellen Abarbeitung hängst: for i in 7 downto 0 loop while counter<(counterv+bitleng) loop end loop; serout<=sign(sercount); sercount:=sercount-1; counterv:=counter; end loop; Die for Anweisung hat aber nichts mit einer Schleife wie in Software zu tuen. In VHDL dient sie zum generieren von Hardware. Hier wird 8x irgendwas generiert - ich weiß nicht was. Versuche parallel zu denken, in Hardware passiert alles gleichzeitig und eine Ablaufsteuerung realisiert man wie schon oben geschrieben mit einer Statemachine (FSM). Aller Anfang ist schwer und du bist auf dem richtigen Weg. Viele Grüße TobiFlex
Hallo TobiFlex! Kannst du mir bitte erklären was eine Statemachine (FSM) ist? Hab leider keine Ahnung. Tschüss Martin
Schau doch mal bei http://www.fpga4fun.com/SerialInterface.html da wird sowas vorgeführt... Gruß Thomas
@Martin Schlag dir das mit dem Prozess aktivieren mal aus dem Kopf. Ein Prozess wird nicht aktiviert. Und außerdem ist das wurschtegal, wie viel mal sich ein Signal in den Sensivity-List ändert. Hast du Angst davor, dass sich der FPGA überarbeitet???-Nein, das tut er nicht... Daniel
@Daniel R. Wie heisst es dann, statt Aktivierung? In dem VHDL-Buch, dass ich habe steht das so drinnen. Tschüss, Martin
<<"Wie heisst es dann, statt Aktivierung?">> Nun ja...das ist eine gute Frage. Du musst parallel denken. Stell dir vor, dein FPGA oder CPLD sei eine riesige Platine voll mit Logik-ICs, welche so beschaltet sind, dass bei Änderung eines Signals z.B. irgendwas addiert wird und dann auf einem 8-Bit Ausgangs-Port liegt. Nun stell dir vor, dass sich das besagte Signal ändert und die Addition stattfindet. Hmmm, wie soll man dazu sagen? Auf jeden Fall würde kein Mensch(außer vielleicht der, der dein Buch geschrieben hat)sagen, dass die Addition aktiviert wird. Das verwirrt... Ich sage dazu: Ein Prozess wird abgearbeitet...(ob das richtiger ist??) Daniel
Wenn man nur die Simulation betrachtet kann man schon von Aktivieren reden. Und zwar wird er immer aktiviert, wenn sich ein Signal in der Sensitivitätsliste ändert. Da bei der Synthese dann alles in HW gegossen wird, kommt es dann "nur" noch drauf an, dass auch alle Signale, die benötigt werden, in der Sensitivitätsliste stehen.
Hallo Martin, benutze doch einfach ein parallel ladbares Schieberegister mit 8bit Daten + 1bit Start + 1bit Stop + 1bit logisch 1 = 11 bit. Das lädst Du dann parallel in einem Clock und schiebst es raus und schiebst eine 0 rein. Der Trick dabei ist, das Du das Schieberegister solange schiebst, bis das Schieberegister den Wert 0 hat. Dann weist Du, das alle Bits aus dem Schieberegister geschoben wurden. Du sparst Dir damit einen Bitzähler. Falls Du einen VHDL Sourcecode brauchst, kann ich Dir den auch gerne geben. Schreib mir doch eine EMail.
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.