Forum: FPGA, VHDL & Co. UART-Informationen auswerten


von VHDL-Beginner (Gast)


Lesenswert?

ich benütze einen UART, der mir einen Empfangenen Byte mit einem
Byte_Empfangen Signal signalisiert. Daraufhin kann ich dieses Byte
abholen und den UART neu initialisieren mit Init_UART. Wie kann man auf
praktische Weise jeweils 3 Byte hintereinander auslesen, diese zu 24-Bit
zusammensetzen nach größe auswerten und vier verschiedene
Ausgangssignale erstellen?

Ich versuche die 3 byte in ein Register zu schreiben, und diese dann
auszuwerten. D.h. wenn die Empfangenen Byte größer als Zahl1 sind soll
Ausgangssignal_1 auf High gehen. Wenn die Empfangenen Bytes größer als
Zahl2 sind soll Ausgangssignal_2 auf High gehen u.s.w.

Der UART wird ständig abgehört und das Register immer wieder mit 3
neuen bytes aufgefüllt.

Bei der praktischen Umsetzung habe ich Schwierigkeiten, nach jedem
dritten Byte, die ich auslese den Registerinhalt komplett zu löschen.

Anfängerproblem :(

Auf eure Ratschläge und Tips würde ich mich sehr freuen.

von Sebastian (Gast)


Lesenswert?

Ich habe so was ähnliches in einer Statemachine realisiert. Nach 3
empfangenen Bytes einfache ein DataReadyFlg setzen, die Daten abholen.
Und Statemachine rücksetzen....

Sebastian

von VHDL-Beginner (Gast)


Lesenswert?

der UART liest nur 8 Bit

von VHDL-Beginner (Gast)


Lesenswert?

Hi Sebastian,

könntest du vielleicht den Code deiner Statemachine posten? Würde mir
bei Lösung meines Problems bestimmt helfen.
Thanks!

von VHDL-Beginner (Gast)


Lesenswert?

kann mir hier vielleicht jemand weiterhelfen einen VHDL Code zu
schreiben, der einen Zähler realisieren soll.
Der Zähler soll angeregt von einem Eingangssignal von 1..3 zählen, bei
3 ein externes Signal ausgeben und wieder auf 1 zurückgehen. Gezählt
soll das Eingangssignal, wenn es sich ändert L-->H
Der Zähler soll sich selbst resetten, wenn es bis 3 hochgezählt hat.


Ich scheitere an den Versuchen, dies zu schreiben, so simpel dies auch
erscheinen mag :(

von VHDL-Beginner (Gast)


Lesenswert?

Was stimmt in diesem Code nicht?


ENTITY zaehler IS
  PORT
  (
    Eingangssignal:  IN STD_LOGIC;
    Ausgangssignal:  OUT std_logic
  );
END zaehler;


ARCHITECTURE Verhalten OF zaehler IS
signal A: integer range 0 to 2;
BEGIN

  PROCESS (Eingangssignal)
  BEGIN
    IF (Eingangssignal'event AND Eingangssignal = '1') THEN

     case A is

        when 0 =>   Ausgangssignal  <=   '0';
                      A <= 1;

        when 1 =>   Ausgangssignal  <=   '0';
                    A <= 2;

        when 2 =>   Ausgangssignal  <=   '1';
                    A <= 0;

    end case;

    END IF;

  END PROCESS;

END Verhalten;

von Xenu (Gast)


Lesenswert?

>Was stimmt in diesem Code nicht?

VHDL-mäßig prinzipiell korrekt. Was genau funktioniert denn nicht?
Wenn "Eingangssignal" kombinatorisch generiert wird, kannst Du
Probleme bekommen, weil das Signal dann durch Gatterlaufzeiten erzeugte
Störimpulse ("Glitches") besitzen kann. Das heisst dann wieder das Du
Flanken hasst, wo Du vielleicht keine erwartest.
Wie wird "Eingangssignal" erzeugt?

von VHDL-Beginner (Gast)


Lesenswert?

Das Eingangssignal kommt aus einem UART-Modul. DIeser geht auf High,
wenn der UART ein neu empfangenes Byte zur Verfügung hat.

Mit dem oberen Code möchte ich aus dem UART 3 Bytes hintereinander
abholen können um diese weiter auszuwerten.

von MikeH (Gast)


Lesenswert?

Hallo,

Ich hätte eine Frage:

Ist es so in Ordnung, dass man hier keinen Initialisierungswert für A
benützen muss, d.h. zu Anfang des Programmes A:=0 setzen muss?

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.