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


von Marco (Gast)


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.
1
entity qsys_system_wrapper is
2
        port (
3
...
4
5
uart_sc_rx        : inout std_logic;
6
uart_sc_tx        : inout std_logic;
7
uart_ext_rx       : inout std_logic := 'X';
8
uart_ext_tx       : inout std_logic;                                          
9
        
10
uart_sc_to_ext    : inout std_logic;
11
uart_ext_to_sc    : inout std_logic
12
        );
13
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:
1
process(clk_50) 
2
begin     
3
    if ( rising_edge(clk_50) ) then         
4
        uart_ext_to_sc <= uart_ext_tx;
5
        uart_sc_to_ext <= uart_sc_tx;
6
    elsif ( falling_edge(clk_50) ) then  
7
        uart_sc_rx <= uart_ext_to_sc;
8
        uart_ext_rx <= uart_sc_to_ext;
9
    end if;
10
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!

von Marco (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

Marco schrieb:
1
 if ( rising_edge(clk_50) ) then
2
    ...
3
 elsif ( falling_edge(clk_50) ) then
4
    ...
5
 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:
1
    uart_sc_rx  <= uart_ext_tx;
2
    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
von Marco (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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
von Marco (Gast)


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 ;-)

von Marco (Gast)


Lesenswert?

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

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.