Forum: FPGA, VHDL & Co. VHDL: Inout Signal nach Quelle durch Multiplexer, geht das?


von Mat (Gast)


Lesenswert?

Hallo Zusammen,

ich habe eine kurze Frage zur Implementierung des folgenden Konstrukts:

Ich habe einen FPGA und einen anderen Baustein die mit Signalleitungen 
verbunden sind, darunter inputs, outputs und bidirectionals (inout).

Im normalen Betrieb sind diese Signale alle in Betrieb. Manche diskrete 
Leitungen, manche teil von seriellen und parallelen Bussen.
Bei einem Sonderfall soll der FPGA all seine Ausgangssignale (asynchron) 
auf '0' drücken.

Soweit so gut. Ist ja recht einfach zu lösen im FPGA indem ich z.B. alle 
Ausgangssignale erst auf interne Signale lege und sie dann durch einen 
Multiplexer jage:
1
OUT_A <= OUT_A_internal WHEN switch = '1' ELSE '0';

Hat den Vorteil, dass ich diese Multiplexer alle Zusammen in eine 
Komponente schmeissen kann und nicht überall verteilt im Design diese 
Bedingung einbauen muss, etwa so:

[FPGA Treibende Komponente] ->- internes Signal ->- [FPGA Muxer] ->- 
externes Signal ->- [ext. Bauteil Senke]

Wie aber gehe ich bei bidirektionalen Signalen um?
Ein solches Konstrukt erzeugt mir doch einen Multiplexer, der ja den 
Signalfluss auf eine Richtung begrenzt, oder?
Komme ich bei inout Signalen irgendwie drum rum, diese Bedingung direkt 
in den Signaltreiber zu bauen? Also:

[FPGA bidir Komponente mit Signalunterdrückung] -<->- [ext. Bauteil 
bidir Komponente]


Wisst ihr da mehr? Hoffe mich gut ausgedrückt zu haben.


Grüße

Mat

von Fpgakuechle K. (Gast)


Lesenswert?

Mat schrieb:
> Komme ich bei inout Signalen irgendwie drum rum, diese Bedingung direkt
> in den Signaltreiber zu bauen? Also:

Es gibt keine inout-Signale, nur ports können inout sein.

Elektrische Leitungen im FPGA sind immer unidirectional, der Übergang 
bidirectionaler Signalfluß zu unidirectional IN und unidirectional OUT 
geschieht am FPGA-IO-PAD.


MfG,

von Fpgakuechle K. (Gast)


Lesenswert?

Mat schrieb:
> Im normalen Betrieb sind diese Signale alle in Betrieb. Manche diskrete
> Leitungen, manche teil von seriellen und parallelen Bussen.
> Bei einem Sonderfall soll der FPGA all seine Ausgangssignale (asynchron)
> auf '0' drücken.
>
> Soweit so gut. Ist ja recht einfach zu lösen im FPGA indem ich z.B. alle
> Ausgangssignale erst auf interne Signale lege und sie dann durch einen
> Multiplexer jage:
>
>
1
OUT_A <= OUT_A_internal WHEN switch = '1' ELSE '0';
>

Ausgangsports sollten immer gebuffert sein, also von einem getakten FF 
getrieben werden. Dann verwendet man keinen Multiplexer sondern hält das 
D-FF am Ausgang im Reset. Falls du auf asynchrons auf '0' setzen 
bestehst, da solltest du das in der Kombinatorik zur Erzeugung von 
OUT_A_internal beschreiben.

MfG,

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


Lesenswert?

Mat schrieb:
> Soweit so gut. Ist ja recht einfach zu lösen im FPGA indem ich z.B. alle
> Ausgangssignale erst auf interne Signale lege und sie dann durch einen
> Multiplexer jage:
> OUT_A <= OUT_A_internal WHEN switch = '1' ELSE '0';
> Wie aber gehe ich bei bidirektionalen Signalen um?
Wie sieht denn deine Beschreibung der bidirektionalen Signale aus?

Weil ein FPGA wie schon erwähnt ausser an den IO-Pins eh' keine 
Bidirektionalität kann, muss der Syntheizer jede Bidirektionalität un 
Multiplexer auflösen oder dir eine Fehlermeldung im Sinne von "multpile 
Source" um die Ohren klatschen.

> Wie aber gehe ich bei bidirektionalen Signalen um?
Irgendwo dürfte da ja sowas ähnliches stehen:
1
OUT_A <= OUT_A_internal WHEN outputenable='1' ELSE 'Z';
Und diesen Tristate-Treiber kannst du einfach ein wenig erweitern:
1
OUT_A <= '0'            WHEN reset='1'        ELSE 
2
         OUT_A_internal WHEN outputenable='1' ELSE 
3
         'Z';

: Bearbeitet durch Moderator
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.