www.mikrocontroller.net

Forum: FPGA, VHDL & Co. UART selbst bauen


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, das kenne ich nicht.

Was ist das?

Gruß, Martin

Autor: TobiFlex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo TobiFlex!

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

Hab leider keine Ahnung.

Tschüss

Martin

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

Habs schon kapiert.

Tschüss, Martin

Autor: Dirk Bxxxxx (dirk-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.alse-fr.com/English/ALSE_UART_us.pdf

vielleicht ist das eine Hilfe.

Gruß,
Dirk

Autor: Thomas (Gast)
Datum:

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

Gruß Thomas

Autor: Daniel R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super!

Danke für diese großartigen Links.

Tschüss, Martin

Autor: Martin (Gast)
Datum:

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

Tschüss, Martin

Autor: Daniel R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: T.M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Franz Lorenz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.