Hi, ich bin mir ziemlich sicher das es eine daemliche Frage ist... aber ich steh gerade ein bisschen auf dem Schlauch. Ich versuche ein Verilog Modell von Lattice auf einen Xilinx FPGA zu portieren, habe aber keinerlei Erfahrung mit Lattice FPGAs. Es haengt blos an der Instanziierung eines "BB" Bidirectional Buffers, klingt vom Namen her ja nach einer Entsprechung der Xlinx IOBs. Wo kann ich nachlesen was das Teil genau tut? Nach zwei Buchstaben zu googeln ist denkbar aussichtslos, "bidirectional buffer" ist auch fuerchterlich allgemein und in den FPGA-Handbuechern von Lattice hab ich auf Anhieb nichts finden koennen. Wo muss ich schauen? Danke, Sebastian
Einen Bidirektionalen Tristate Buffer für Xilinx beschreibe ich in VHDL so:
1 | pins <= dataout when dir=AUSGANG else (others=>'Z'); |
2 | datain <= pins; |
Dann übernimmt die Synthese automatisch die Instantiierung des Pintreibers (IOB). In Verilog müsste das doch so ähnlich auch gehen. Im Anhang ein Screenshot aus dem MachXO-Handbuch http://www.latticesemi.com/lit/docs/handbooks/HB1002.pdf
Hallo Lothar, die Beschreibung des Tristate-Puffers kann ich nachvollziehen. Ich bin mir aber nicht wirklich sicher ob "BB" das selbe macht... dann waere es ja nicht besonders sinnig die Komponente extra einzubauen wenn man das Verhalten so einfach beschreiben kann... Vielleicht mag sich mal jemand die angehaengte Datei ansehen. Was tut diese Zeile?
1 | BB tpio_inst(.I(PIO_DATA_O), .T(~PIO_TRI), .O(PIO_IO_I), .B(PIO_IO)); |
Sebastian
> BB tpio_inst(.I(PIO_DATA_O), .T(~PIO_TRI), .O(PIO_IO_I), .B(PIO_IO)); Der Komponente tpio_inst werden die Signale Eingang (I), Tristate (T), Ausgang (O) und ein Typ (B) zugewiesen. Der Typ (PIO_IO) ist eine Zeichenkette, die den Portpin beschreibt (LVTTL..., Interfacespannung 2V5, 3V3...). Die anderen 3 sind die bekannten Signale. Im Handbook HB1001.pdf zur XP-Familie ist das noch ein wenig auscodiert. http://www.latticesemi.com/dynamic/view_document.cfm?document_id=9418 Allerdings muß ich zugeben, dass ich auch da nichts explizit zur Komponente BB gefunden habe. Wenigstens aber die Anwendung.
Lothar Miller wrote: >> BB tpio_inst(.I(PIO_DATA_O), .T(~PIO_TRI), .O(PIO_IO_I), .B(PIO_IO)); > > Der Komponente tpio_inst werden die Signale Eingang (I), Tristate (T), > Ausgang (O) und ein Typ (B) zugewiesen. Der Typ (PIO_IO) ist eine > Zeichenkette, die den Portpin beschreibt (LVTTL..., Interfacespannung > 2V5, 3V3...). Die anderen 3 sind die bekannten Signale. Also PIO_IO ist vom Typ "inout", das kann doch keine Zwichenkette sein, oder (zugegeben, mit meinen Verilog-Kenntnissen ists nicht soo weit her, aber das ist doch blos ein Bit)? Oder wie kommst du darauf? > Im Handbook HB1001.pdf zur XP-Familie ist das noch ein wenig auscodiert. > http://www.latticesemi.com/dynamic/view_document.cfm?document_id=9418 > Allerdings muß ich zugeben, dass ich auch da nichts explizit zur > Komponente BB gefunden habe. Wenigstens aber die Anwendung. PIOs sind da ausfuehrlich beschrieben, aber die Signale passen so gar nicht zu dem was BB hat. Vielen Dank fuer deine Muehe, aber klar ist mir das immer noch nicht :-/ Sebastian
Ich kenne mich mit Verilog nun nicht soooo gut aus, ich habe deshalb vom VHDL-Code auf die Verilog-Beschreibung transferiert. Und im VHDL-Code ist das ein Attribut, das dem Synthesizer übergeben wird. Deshalb dürfte die Beschreibung bei Verilog auch sowas ähnliches machen (so meine Vermutung). Diese Zeichenkette dürfte hier der Knackpunkt sein, der den IO-Standard definiert: /*synthesis IO_TYPE="SSTL25_II"*/ Verilog:
1 | : |
2 | inout [7:0] dq/* synthesis IO_TYPE="SSTL25_II"*/; |
3 | : |
4 | BB bidiInst0 (.I(ddrout[0]), .T(tridata[0]), .O(ddrin[0]), .B(dq[0])); |
5 | : |
VHDL:
1 | : |
2 | ATTRIBUTE IO_TYPE OF dq : SIGNAL IS "SSTL25_II"; |
3 | : |
4 | bidiInst0 : BB PORT MAP( I => ddrout(0),T => tridata(0),O => ddrin(0),B => dq(0)); |
5 | : |
EDIT: Weil so eine Komponenten-Instantitierung immer Architekturgebunden ist, vermeide ich die soweit möglich und nehme die generische Beschreibung wie aus meinem 1. Post. Der IO-Standard wird dann im (architekturabhängigen) Constraint-File angegeben.
Spekulation: BB = Black Box ? In Zusammenhang mit IPExpress generierten IP-Core-Files ...
Achso, nun versteh ichs... PIO_IO ist der Ein-/Ausgangspin. Und ueber diese Attribute kriegt er gleich noch den IO-Standard mitgegeben, den man sonst im UCF File eintragen muss. Die versuchen aber auch alles um Portabilitaet zu verhindern... Also werd ich mal dies versuchen:
1 | // BB tpio_inst(.I(PIO_DATA_O), .T(~PIO_TRI), .O(PIO_IO_I), .B(PIO_IO));
|
2 | // ersetzt durch:
|
3 | |
4 | assign PIO_IO = (~PIO_TRI) ? PIO_DATA_O : 1'bz; |
5 | assign PIO_IO_I = ( PIO_TRI) ? PIO_IO : 1'bz; |
Schaut das grob richtig aus? Sebastian
SuperWilly wrote:
> ... aus der ispLEVER 7.1 Hilfe: siehe Anhang
Ausgezeichnet, demnach waren wir auf der richtigen Faehrte. Wenn ich mir
die Wahrheitstabelle ansehe wuerde ich so auf den ersten Blick sagen das
mein Code funktionieren muesste. Einwaende?
Vielen Dank fuer die guten Tipps Lothar und fuer die Loesung des
Raetsels, SuperWilly :-)
Sebastian
SuperWilly wrote:
> ... aus der ispLEVER 7.1 Hilfe: siehe Anhang
Ja, nur irgendwie schade, dass sowas nicht im Datenblatt oder Usermanual
oder in den Whitepapers auftaucht... :-(
Lothar Miller wrote: > SuperWilly wrote: >> ... aus der ispLEVER 7.1 Hilfe: siehe Anhang > > Ja, nur irgendwie schade, dass sowas nicht im Datenblatt oder Usermanual > oder in den Whitepapers auftaucht... :-( Ich haette nicht gedacht das ich das mal sagen wuerde, aber das macht Xilinx tatsaechlich besser. Da gibts die ganze HTML-Doku durchsuchbar im Netz... Sebastian
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.