www.mikrocontroller.net

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


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Morin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Sym (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sym (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Martin Kohler (mkohler)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ext_bus <= out_bus when (oe = '1') else 'Z';
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:
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?

Autor: Gast (Gast)
Datum:

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

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
outbus <= reg_ausgangsvektor[reg_addr];

im einfachsten Fall, ansonsten mit case.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
runde Klammern, falsche Sprache

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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