mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL: 2 Uarts intern miteinander verbinden


Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich habe ein Anfänger Problem mit VHDL. Und zwar habe ich auf einer PCIe 
Tranceiver Karte einen lauffähigen UART-Ausgang, der sich per Treiber 
ansprechen lässt (Design nicht von mir). Nun habe ich im Design noch 
einen Softcore (f32c) hinzugefügt. Es lässt sich auch alles 
synthetisieren und ich sehe an den LEDs, dass der Softcore läuft. Der 
Softcore hat auch einen UART. Nun wollte ich gerne zwecks Test den 
externen UART von den PINs "abklemmen" und intern an den Softcore 
verbinden. Also so:

UART_EXT_RX <= UART_SOFTCORE_TX
UART_SOFTCORE_RX <= UART_EXT_TX

So dass ich dann Putty aufmachen kann und automatisch immer mit dem 
Softcore verbunden bin. Die Pin Verbindung habe ich getrennt (neue RX TX 
Variablen, die nicht verbunden sind). Leider bekomme ich es aber nicht 
gebacken :-/ Hier mal mein Auszug wie ich es probiert habe.
entity qsys_system_wrapper is
        port (
...

uart_sc_rx        : inout std_logic;
uart_sc_tx        : inout std_logic;
uart_ext_rx       : inout std_logic := 'X';
uart_ext_tx       : inout std_logic;                                          
        
uart_sc_to_ext    : inout std_logic;
uart_ext_to_sc    : inout std_logic
        );
END qsys_system_wrapper;


Dann sind die RX und TX Leitungen ganz normal an die entsprechenden 
ports gemappt. Und anschliessend probiere ich die Verbindung wie folgt 
herzustellen:
process(clk_50) 
begin     
    if ( rising_edge(clk_50) ) then         
        uart_ext_to_sc <= uart_ext_tx;
        uart_sc_to_ext <= uart_sc_tx;
    elsif ( falling_edge(clk_50) ) then  
        uart_sc_rx <= uart_ext_to_sc;
        uart_ext_rx <= uart_sc_to_ext;
    end if;
end process;

Ist vielleicht jemand so nett und hilft mir VHDL Noob etwas auf die 
Sprünge? Mir ist klar, dass ich das irgendwie puffern muss, aber wie??

Vielen Dank!

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, ich hatte zunächst probiert ohne Umwege

UART_EXT_RX <= UART_SOFTCORE_TX
UART_SOFTCORE_RX <= UART_EXT_TX

zu verbinden, aber das hatte nicht funktioniert. Frage mich aber, warum 
eigentlich nicht. Ich hatte die RX als "in" und die TX als "inout". Wenn 
ich ne Drahtbrücke von RX an TX lege, bekomme ich ja auch ein Echo.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco schrieb:
> Leider bekomme ich es aber nicht gebacken :-/ Hier mal mein Auszug wie
> ich es probiert habe.
Mit welchem Ergebnis?

Marco schrieb:
 if ( rising_edge(clk_50) ) then
    ...
 elsif ( falling_edge(clk_50) ) then
    ...
 end if;
In manchen Betrieben wäre das ein Kündigungsgrund...
Hast du so etwas schon mal woanders gesehen? Nein, denn es ist eine 
schlechte Idee, in einem Prozess auf mehrere Takte zu reagieren. Und 
zudem ist es auch eine schlechte Idee beide Flanken eines Signals als 
Takt zu verwenden. Denn dadurch halbierst du die verfügabare Laufzeit 
zwischen den Flipflops oder andersrum: du forsderst von der Toolchain 
ein doppelt so schnelles Design.

Marco schrieb:
> Und anschliessend probiere ich die Verbindung wie folgt herzustellen:
Probiers doch einfach so, wie du es im "richtigen" Leben auch machen 
würdest: mit einer direkten Verbindung und ganz ohne Prozess:
    uart_sc_rx  <= uart_ext_tx;
    uart_ext_rx <= uart_sc_tx;

Marco schrieb:
> uart_sc_rx        : inout std_logic;
> uart_sc_tx        : inout std_logic;
> uart_ext_rx       : inout std_logic := 'X';
> uart_ext_tx       : inout std_logic;
Wieso inout?
Ein RX Signal ist KEIN Ausgang, sondern nur und ausschließlich Eingang. 
Und deshalb solltest du es auch in diesem Sinne verwenden.

: Bearbeitet durch Moderator
Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Lothar!

Vielen Dank! Nicht ohne Grund verdiene ich mein Geld nicht mit VHDL ;-) 
Habe ich auch nicht vor.

Das mit dem INOUT musste ich machen, damit ich auf die "PufferVariablen" 
schreiben konnte und auch davon lesen. Bzgl. dem offensichtlichen Weg 
siehe bitte meinen 2. Post, das hat leider nicht geklappt. Da musste ich 
dann aber die TX von OUT auf INOUT ändern, damit ich den Wert auch 
zurück lesen kann.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco schrieb:
> zu verbinden, aber das hatte nicht funktioniert.
WAS hatte nicht funktioniert? WIE hast du das festgestellt?

Marco schrieb:
> Das mit dem INOUT musste ich machen, damit ich auf die "PufferVariablen"
> schreiben konnte und auch davon lesen
Warum dann nicht gleich "buffer"?

> Das mit dem INOUT musste ich machen
Neinein, das "musstest" du wegen der Schreibfaulheit machen. Führe 
lokale Signale ein und nehme nur Ports mit definierter Richtung IN oder 
OUT.

: Bearbeitet durch Moderator
Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Normalerweise sollte bei einem Return ja das prompt kommen, kam aber 
nicht. Ich glaube mittlerweile, dass ich den Wald vor lauter Bäumen 
nicht mehr gesehen habe und die falsche Baudrate hatte schäm. Das mit 
dem f32c hat wohl zu komplikationslos geklappt, dass ich mir selbst 
Probleme gemacht habe.

Dennoch vielen Dank!! Thema geschlossen und bitte schnell vergessen ;-)

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar, vielen Dank für diese Grundlagen! Ich werde es mir zu Herzen 
nehmen.

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.

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