Hallo, dass man InOut Ports nicht innerhalb eines Designs nutzen soll ist klar. Aber zur Anbindung von ext. Hardware kann dies immer mal wieder auftreten (sehr beliebt I2C). Leider sehe ich immer wieder recht viele Leute die diese INOUTs mit durch die unterschiedlichsten Module schleppen. Nun habe ich in Vortragsfolien von Ronald Hecht (University of Rostock, Institute of Applied Microelectronics and Computer Engineering) eine gute Erklärung gefunden wie man dieses elegant lösen kann. Ich wollte diese Idee hier einfach mal zur Diskussion stellen.
Hubert schrieb: > dass man InOut Ports nicht innerhalb eines Designs nutzen soll ist klar. Man kann sie eigenlich auch nicht nutzen, weil es sowas im FPGA gar nicht gibt. Jeder inout Port innerhalb eines FPGAs muss daher in einen Multiplexer aufgelöst werden. Hubert schrieb: > Leider sehe ich immer wieder recht viele Leute die diese INOUTs mit > durch die unterschiedlichsten Module schleppen. Man kann einen inout-Port durchaus einfach "durchreichen" und von einem "tiefer" vergrabenen Modul aus ansteuern. Aber eben sinnvollerweise nicht von mehreren Modulen aus. Das geht zwar auch, wird aber schnell unübersichtlich... > Leider sehe ich immer wieder recht viele Leute die diese INOUTs mit > durch die unterschiedlichsten Module schleppen. Klar, weil es so oft noch in den verwendeten Büchern steht... > Ich wollte diese Idee hier einfach mal zur Diskussion stellen. Dieser Ansatz ist der einzig sinnvolle. Wo genau diese Richtungsumschaltung erfolgt, ist eigentlich egal. Es sollte aber eben nur an genau 1 Stelle passieren. Ob allerdings "driven" ein sinnvoller Name für das Output-Enable-Signal ist, möchte ich doch in Frage stellen. Oder kommt das "driven" gar von "DRIVe ENable"...
Lothar Miller schrieb: > Ob allerdings "driven" ein sinnvoller Name für das Output-Enable-Signal > ist, möchte ich doch in Frage stellen. Oder kommt das "driven" gar von > "DRIVe ENable"... da gebe ich Dir absolut Recht, Drive_en wäre sinnvoller gewesen. Genauso ist es auch Geschmackssache ob es (wie der Autor es in der Grafik beschreibt) alles über Records löst. Sicherlich sind Records eine sinnvolle Erweiterung, aber ich denke wichtige Signale wie clk, rst, wr_en, rd_en, din, dout sollten nicht über Records beschrieben werden damit man die Übersicht nicht verliert.
Freddy schrieb: > Genauso ist es auch Geschmackssache ob es (wie der Autor es in der > Grafik beschreibt) alles über Records löst. Ich sehe die Records auch eher zwiespältig: Der Profi kann damit Zeit einsparen (wenn Ports angepasst werden müssen) und seine Simulation sicherer machen (den (Eingangs-)Record in die Sensitivliste und gut is). Der Anfänger lernt so aber gar nicht, was eine unvollständige Sensitivliste bewirken kann. Wehe, wenn er dann mal ein "altes" Design in die Finger bekommt und ändern muss. Und er lernt nicht, dass Hardware vorher durchdacht und definiert sein will/soll (besonders an den Schnittstellen aka. Ports).
Lothar Miller schrieb: > Hubert schrieb: >> dass man InOut Ports nicht innerhalb eines Designs nutzen soll ist klar. > Man kann sie eigenlich auch nicht nutzen, weil es sowas im FPGA gar > nicht gibt. Jeder inout Port innerhalb eines FPGAs muss daher in einen > Multiplexer aufgelöst werden. Und weil es sich nicht gibt, macht es auch keinen Sinn, sie theoretisch einzuführen. Funktionstechnisch bidirektionale Busse und Signallayer in FPGAs sind immer als Hin-Rück-Weg zu beschreiben, weil sie für die meisten Anwendungen nicht benötigt werden, die halbe Funktionsschicht damit wegfällt und die Implementierung nur mehr Aufwand bedeutet, die Platz und Geld kostet, um ein paar Leitungen zu sparen. Innerhalb der FPGAs macht es keinen Sinn. Mit steigenden Taktfrequenzen macht es auch ausserhalb der FPGAs keinen Sinn mehr, weil die Bandbreiten in den FPGAs inzwischen deutlich grösser sind, als was drausen transportierbar ist und damit die Leitungen eh schon Flaschhals sind. Leitungen durch Buffer umzuschalten is out. Der Aufrechterhalt bidirektionaler Verbindungen ist daher ohnehin Quatsch und an der Realität vorbei. Der Herr Professor kommt 25 Jahre zu spät.
Naja, wir hätten als bidirektionalen Bus immerhin noch den zu Anfang aufgeführten I2C Bus... ;-)
Hans schrieb: > Leitungen durch Buffer umzuschalten is out. > > Der Aufrechterhalt bidirektionaler Verbindungen ist daher ohnehin > Quatsch und an der Realität vorbei. Verallgemeinerungen sind immer falsch! ;-)
Jetzt muß ich mal was doofes Fragen: Macht es denn einen Unterschied, ob ich ein Signal als "inout" definiere und den Rest der Toolchain überlasse, ober ob ich das selber händisch die beschriebene Lösung auscodiere?
Bronco schrieb: > und den Rest der Toolchain überlasse Welchen "Rest"? Umschalten musst doch sowieso du selber. Denn nur du weißt, wann du was ausgeben willst/sollst/darfst...
Sorry, ich meinte: 1. Fall: Ich ziehe ein einziges "inout"-Signal durch 10 Hierarchie-Ebenen hindurch in das Zielmodul, wo ich dann das Signal lese und entweder '0', '1' oder 'Z' draufschreibe. 2. Fall: Ich ziehe drei Signale (ich nenne sie mal "DataIn, DataOut, DataDir") durch 10 Hierarchie-Ebenen und habe im TopLevel-Modul so etwas wie
1 | DataIn <= MEININOUTPIN; |
2 | if (DataDir = '1') then |
3 | MEININOUTPIN <= DataOut; |
4 | else
|
5 | MEININOUTPIN <= 'Z'; |
6 | end if; |
Macht das einen Unterschied? Eigentlich nicht, oder?
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.