Hallo Zusammen, möchte einen Datenbus in VHDL implementieren, der von mehreren Komponenten (Slaves) verwendet werden kann. Im System gibt es einen Master welcher die Slaves adressiert, die Slaves senden die Antwort über einen Bus vom type std_logic_vecor an den Master zurück. Um nicht für jeden Slave einzeln einen Bus an den Master verdrahten zu müssen, möchte ich diesen Bus gerne "sharen". Bis jetzt habe ich den Bus im entity als inout definiert. Wurde ein Slave adressiert legte er die Antwort auf den Bus sonst 'Z'. Dies konnte mit Quartus synthetisiert werden und lieferte auch gute Ergebnisse. Beim neuen Design möchte ich die Signale gerne mittels record bündeln, somit kann ich inout nicht mehr verwenden. Gib es dennoch die Möglichkeit die Slaves an einen Bus zu hängen oder muss ich für jeden Slave einen separaten implementieren? Gruss sam
sam schrieb: > Hallo Zusammen, > > möchte einen Datenbus in VHDL implementieren, der von mehreren > Komponenten (Slaves) verwendet werden kann. Im System gibt es einen > Master welcher die Slaves adressiert, die Slaves senden die Antwort über > einen Bus vom type std_logic_vecor an den Master zurück. Um nicht für > jeden Slave einzeln einen Bus an den Master verdrahten zu müssen, möchte > ich diesen Bus gerne "sharen". > > Bis jetzt habe ich den Bus im entity als inout definiert. Wurde ein > Slave adressiert legte er die Antwort auf den Bus sonst 'Z'. Dies konnte > mit Quartus synthetisiert werden und lieferte auch gute Ergebnisse. > > Beim neuen Design möchte ich die Signale gerne mittels record bündeln, > somit kann ich inout nicht mehr verwenden. Gib es dennoch die > Möglichkeit die Slaves an einen Bus zu hängen oder muss ich für jeden > Slave einen separaten implementieren? Die Slaves entwirfst du alle selbst, bzw. hast die Möglichkeit, diese an deine Bedürfnisse anzupassen (d.h. sie liegen als editierbare Sourcen vor)? Falls ja, würde ich die Slaves "dumm" implementieren, was den Bus angeht. Das bedeutet, das Interface der Slaves geht davon aus, dass eine Punkt-zu-Punkt Verbindung zu einem Master besteht. Die Adress-Intelligenz besteht dann aus einem Multiplexer, welcher je nach Adresse den entsprechenden Slave mit dem Master verbindet. Somit kannst du alle Signale als Records ausführen, benötigst keine Beschreibung mit High Impedance-Zuständen im FPGA (welche die Synthese vermutlich sowieso in einen Mux gewandelt hat) und kannst an einer zentralen Stelle (beim Multiplexer) die Slave-Adressen verwalten, ohne bei Änderungen jeden Slave einzeln anfassen zu müssen.
sam schrieb: > Beim neuen Design möchte ich die Signale gerne mittels record bündeln, > somit kann ich inout nicht mehr verwenden. Warum schließt das Eine das Andere aus? Davon abgesehen: im Inneren eines FPGAs gibt es keine Tristatetreiber oder -busse. Deshalb muss der Synthesizer für diese Signale jeweils zusätzlich zur Adressdecodierung noch einen Multiplexer für die Richtungsumschaltung dieses Busses einbauen. Das macht das Design prinzipiell und tendenziell langsamer... Sinnvoller im Sinne von Resourcenverbrauch und Geschwindigkeit wäre es, nur mit unidirektionalen Signalen zu arbeiten.
vielen Dank für die rasche Antwort. Was die Synthese aus einen inout Signal macht ist mir schon Klar. Es ist halt praktisch, wenn man die Signal von den Slaves nicht manuell an den Mux verdrahten muss. Ich werden wie vorgeschlagen die Schnittstelle der Slaves für eine Punkt-zu-Punkt Verbindung auslegen. Um die Anzahl der Leitungen zu minimieren werde ich diese in jeder übergeordneten Komponenten mittels Mux zusammenfassen.
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.