Forum: FPGA, VHDL & Co. UART selbst bauen


von Martin (Gast)


Lesenswert?

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

von FPGA-User (Gast)


Lesenswert?

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 ?

von Martin (Gast)


Lesenswert?

Nein, das kenne ich nicht.

Was ist das?

Gruß, Martin

von TobiFlex (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

Hallo TobiFlex!

Kannst du mir bitte erklären was eine Statemachine (FSM) ist?

Hab leider keine Ahnung.

Tschüss

Martin

von Martin (Gast)


Lesenswert?

Danke!

Habs schon kapiert.

Tschüss, Martin

von Dirk B. (dirk-)


Lesenswert?

http://www.alse-fr.com/English/ALSE_UART_us.pdf

vielleicht ist das eine Hilfe.

Gruß,
Dirk

von Thomas (Gast)


Lesenswert?

Schau doch mal bei http://www.fpga4fun.com/SerialInterface.html
da wird sowas vorgeführt...

Gruß Thomas

von Daniel R. (Gast)


Lesenswert?

@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

von Martin (Gast)


Lesenswert?

Super!

Danke für diese großartigen Links.

Tschüss, Martin

von Martin (Gast)


Lesenswert?

@Daniel R.
Wie heisst es dann, statt Aktivierung?
In dem VHDL-Buch, dass ich habe steht das so drinnen.

Tschüss, Martin

von Daniel R. (Gast)


Lesenswert?

<<"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

von T.M. (Gast)


Lesenswert?

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.

von Franz Lorenz (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.