Forum: FPGA, VHDL & Co. Welchen Zustand hat Bus wenn alle Teilnehmer tristate sind?


von Tom (Gast)


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

von Falk B. (falk)


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

von Tom (Gast)


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

von Morin (Gast)


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

von Sym (Gast)


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.

von Martin K. (mkohler)


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?

von Sym (Gast)


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;

von Martin K. (mkohler)


Angehängte Dateien:

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?

von Gast (Gast)


Lesenswert?

Der outbus wird immer beschrieben, der ist ja schliesslich 
unidirektional.
Zum unterscheiden nach adresse eben multiplexen.

von Martin K. (mkohler)


Lesenswert?

Gast wrote:
> Der outbus wird immer beschrieben, der ist ja schliesslich
> unidirektional.

Und was ist bei mehreren Registern?
Dann wird der Outbus mehrfach "immer beschrieben"? Wohl kaum.

Das "eben multiplexen": wie sieht das jetzt konkret aus?

von Gast (Gast)


Lesenswert?

outbus <= reg_ausgangsvektor[reg_addr];

im einfachsten Fall, ansonsten mit case.

von Gast (Gast)


Lesenswert?

runde Klammern, falsche Sprache

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.