Welchen Zustand hat Bus wenn alle Teilnehmer tristate sind?

Gast #791239
Lesenswert?

Hallo,

Wenn ich mit VHDL ein System mit Bus und Busteilnehmern entwerfe und es 
eine Bedingung gibt bei der ich alle Teilnehmer in tristate schalte. 
Welchen Zustand hat dann der interne Bus? Was macht die Synthese daraus?

In einer normalen Schaltung gäbe es dafür sicher pull ups zum definieren 
des Buszustandes für den Fall das kein Teilnehmer den Bus treibt aber 
was passiert wenn der Bus intern im FPGA existiert und alle treibenden 
Teilnehmer in 'Z' geschaltet werden? Ist der Bus dann undefiniert? Muss 
man das bei der "Programmierung" selber irgendwie festlegen?

Danke für eure Tipps

Tom
#791283
Lesenswert?

@ Tom (Gast)

>Wenn ich mit VHDL ein System mit Bus und Busteilnehmern entwerfe und es
>eine Bedingung gibt bei der ich alle Teilnehmer in tristate schalte.
>Welchen Zustand hat dann der interne Bus? Was macht die Synthese daraus?

Moderne FPGAs haben keine internen Tristatebusse mehr. Das wird alles in 
normale Logik mit Multiplexern umgewandelt.

Sowas entwirft man nicht (mehr). FPGA intern nutzt man nur 
unidirektionale Busse.

MFg
Falk
Gast #792926
Lesenswert?

Hallo,

Es ist ein Virtex 5 also gehe ich davon aus das es intern kein Tristate 
gibt sondern das ganze über Multiplexer realisiert wird.

Was ich nicht verstehe ist was Du mit unidirektional meinst. Das ist 
doch nur die Datenrichtung, dann können doch an einem Bus trotzdem 
mehrere Teilnehmer hängen wovon immer nur einer senden darf oder?

Ich hab in der VHDL-Beschreibung einfach immer den Rest in tristate also 
auf Z gestezt. Intern wird das mit Multiplexern realisiert -> soweit OK

Was ist aber wenn kein Busteilnehmer aktiv ist also alle auf Z gesetzt 
sind, wird der Bus dann irgendwie in einen definierten Zustand gebracht? 
Floatet er vor sich hin? Wie wird sowas gehandhabt?

Tom
Gast #793013
Lesenswert?

Floaten kann er ja nicht, weil es ja "in Wirklichkeit" keinen internen 
Tristate-Bus gibt. Ich hab es jetzt konkret nicht ausprobiert, aber die 
beiden Möglichkeiten die mir sofort einfallen sind entweder "Fehler beim 
Synthetisieren" oder "don't care statt Z" (letzteres bedeutet, dass zu 
jeder Zeit ein definierter Pegel rauskommt, aber der Synthesizer 
entscheidet durch welche Logik der erzeugt wird).
Gast #793954
Lesenswert?

Man verwendet im FPGA einfach keinen bidirektionalen Bus und fertig. Das 
ist einfach fehlerfreier und stabiler.

Für externe Beschaltung kann man einen Pull-Up Widerstand in der 
Ausgangszelle des FPGAs konfigurieren oder es ist einer am PCB.
#793996
Lesenswert?

Sym wrote:
> Man verwendet im FPGA einfach keinen bidirektionalen Bus und fertig. Das
> ist einfach fehlerfreier und stabiler.

Dann kann jetzt sicher einer dem Tom sagen, wie es denn in der korrekten 
Form mit separatem Bus gemacht wird. (ich würde übrigens auch sehr 
interessiert mitlesen ;-) )

Konkret:
Wie binde ich einen uC über Adress-, Daten- und Controlbus an und 
steuere damit sagen wir mal 5 Registerblöcke im FPGA?

Spätestens beim Übergang auf den FPGA-externen uC-Bus muss das ganze 
wieder auf den bidirektionalen Bus passen.

Hat da einer ein Beispiel dafür?
Gast #794287
Lesenswert?

Man wählt ein anderes Interface. Am ähnlichsten zum Bus ist da noch die 
Multiplexerstruktur. Die Wahl des geeigneten Interfaces hängt aber stark 
vom Aufgabengebiet ab.

Konkrekt: 1 Bidirektionale Leitung wird intern als drei Signale 
gehandhabt: Ein Output, ein Input und ein Output enable.

Die Ausgangszelle wird dann so beschrieben:
sw_b <= sw_o when (sw_oe = '1') else 'Z';
sw_i <= sw_b;
#794368
Lesenswert?

1
ext_bus <= out_bus when (oe = '1') else 'Z';
2
in_bus <= ext_bus;
Der Übergang von bidirektional (rot, extern) auf den zweifachen Bus 
(blau/grün, intern) wäre damit geklärt.

Unklar ist jedoch noch die Anbindung der einzelnen Registerblöcke.
Das Schreiben der Register ist klar, da wird dem Registersignal der 
Inhalt von INT_IN zugewiesen, sobald die Adresse stimmt und write enable 
eintrifft.

Beim Lesen würde ich nun aber irgend etwas in der Art implementieren:
1
out_bus <= reg_xy when (oe = '1') and adrr = reg_xy_adr else 'Z';

Hier haben wir nun aber wieder die Tristate-Zuweisung. Wie werde ich die 
los?
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren