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
@ 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
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
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).
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.
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?
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;
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?
Der outbus wird immer beschrieben, der ist ja schliesslich unidirektional. Zum unterscheiden nach adresse eben multiplexen.
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?
outbus <= reg_ausgangsvektor[reg_addr]; im einfachsten Fall, ansonsten mit case.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.