Hallo, ich versuche meinen FPGA so in Verilog zu beschreiben, dass ich eine Zeitverzögerung durch die Hintereinanderschaltung von FFs erreiche. Es gibt einen Signalinput und einen input "[1:0] wahl" der mir 15 Ausgänge in 4 Varianten zu den FFs durchschaltet. reg [1023:0] schieber = 0; // Schieberegistervariable reg [9:0] tabelle [14:0][3:0]; // Tabelle für Delay-Intervalle ... dann wird die Initialisierung von "tabelle" mit den gewünschten Delay-Intervallen (funktioniert) ... dann folgt der Schieberegister (funktioniert) es gibt nur ein Problem mit assign: "unsupported expression on dynamic range select" assign out[1] = schieber[tabelle[0][wahl]]; assign out[2] = schieber[tabelle[1][wahl]]; ... assign out[15] = schieber[tabelle[14][wahl]]; Wie kann ich das hinbiegen? Vielen Dank für Vorschläge!!
Matthäus schrieb: > assign out[1] = schieber[tabelle[0][wahl]]; > assign out[2] = schieber[tabelle[1][wahl]]; > ... > assign out[15] = schieber[tabelle[14][wahl]]; > > Wie kann ich das hinbiegen? Vielen Dank für Vorschläge!! Schau dir an wie man in verilog multiplexer beschreibtm bspw: https://technobyte.org/verilog-multiplexer-4x1/ da steht für einen 4 zu 1 multiplexor:
1 | assign out = s1 ? (s0 ? d : c) : (s0 ? b : a); |
s ist der selector (s0 lsb, s1 msb), beschrieben ist das Ganze mit drei ? : Operatoren wie man sie aus C kennt, die in zwei ebenen hintereinandergeschaltet sind. Du solltest also (in Verilog) kein zweidiensionales array verwenden, sondern den selector 'selbst' ausdekodieren.
Matthäus schrieb: > der Schieberegister das ... > meinen FPGA mein ... > ich versuche meinen FPGA so in Verilog zu beschreiben Du solltest nicht das FPGA beschreiben (das hat der Hersteller des FPGAs schon gemacht), sondern du solltest deine Schaltung beschreiben, und zwar so, dass der Synthesizer/Compiler sie erkennt und umsetzen kann. > Es gibt einen Signalinput und einen input "[1:0] wahl" der mir > 15 Ausgänge in 4 Varianten zu den FFs durchschaltet. Du hast einen Eingang, der auf ein 1024-Bit Schieberegister geht. Dahinter hängen 15 Stück Riesenmega-1024:1-Monstermultiplexer, die dynamisch abhängig von 2 Eingangsbits und einer variablen Tabelle 1 Bit aus der 1024 Bit langen Schieberegisterkette auf den Ausgang multiplexen soll. Oder sehe ich das zu kompliziert? > Wie kann ich das hinbiegen? Wie sieht deine Schaltung für diese Funktion aus? Denn erst wenn du eine Schaltung auf einem Blatt Papier (oder wenigstens im Kopf) hast, dann kannst du die beschreiben. Und hoffen, dass der Synthesizer diese Beschreibung kapiert. > es gibt nur ein Problem mit assign: > "unsupported expression on dynamic range select" Lies die Doku deiner Toolchain. Dort steht drin, welchen Sprachumfang von Verilog der Synthesizer zu Hardware umformen kann. Bei VHDL schätze ich das auf weniger als 5% ein. Oder andersrum: ich kann eine ganz simple Codezeile in VHDL hinschreiben und bin mir sicher, dass kein Synthesizer sie auf ein FPGA (oder auch auf ein ASIC) abgebildet bekommt.
:
Bearbeitet durch Moderator
Fpgakuechle K. schrieb: > Schau dir an wie man in verilog multiplexer beschreibtm bspw: Das hat doch der OP ganz richtig gemacht (aber siehe unten). Das Synthesetool versteht es nur offenbar nicht. >
1 | > assign out = s1 ? (s0 ? d : c) : (s0 ? b : a); |
2 | > |
> > s ist der selector (s0 lsb, s1 msb), beschrieben ist das Ganze mit drei > ? : Operatoren wie man sie aus C kennt, die in zwei ebenen > hintereinandergeschaltet sind. > Du solltest also (in Verilog) kein zweidiensionales array verwenden, > sondern den selector 'selbst' ausdekodieren. Ganz so low-level ist Verilog nun auch nicht. Man muss es definitiv nicht so machen. Vor allem emfiehlt sich das nicht bei einem Multiplexer dieses Formats, selbst wenn man ihn in sinnvollerweise zwei Ebenen teilt.
Marcus H. schrieb: > Fpgakuechle K. schrieb: >> Schau dir an wie man in verilog multiplexer beschreibtm bspw: > > Das hat doch der OP ganz richtig gemacht (aber siehe unten). Das > Synthesetool versteht es nur offenbar nicht. Wenn die Software mit einer Fehlermeldung abbricht, hat der TO offensichtlich nicht alles richtig gemacht. >> Du solltest also (in Verilog) kein zweidiensionales array verwenden, >> sondern den selector 'selbst' ausdekodieren. > > Ganz so low-level ist Verilog nun auch nicht. Man muss es definitiv > nicht so machen. 'Low Level', also 'Gatterebene', ist aber nun mal die Beschreibungsform, die jeder Verilog-compiler verstehen sollte. Der TO sollte also mal in den "Synthesis Style guide" der von ihm verwendeten Software schauen, welche Verilog-construct für seine Hardware verlangt wird, bspw.: https://www.xilinx.com/support/documentation/sw_manuals/xilinx2019_1/ug901-vivado-synthesis.pdf S.226 ff.
Mal unabhängig davon ob dein Design sinnvoll ist, das Problem ist offenbar, dass dein Tool kein Array mit einem Eintrag aus einem anderen Array direkt indizieren kann. Du könntest mal versuchen, die 15 Tabellen in separate Signale zu übergeben und diese dann als Arrayindex zu verwenden. Das würde dir zumindest zeigen, ob du auf der richtigen Spur bist. Btw, warum hat deine Tabelle 32768*16 Einträge, wenn du nur 15*4 brauchst? Du weißt, dass [14:0] kein Wertebereich ist, sondern ein 15 bit breiter Vektor, der die Werte 0...32767 annehmen kann? Hast du das eigentlich mal simuliert? Du gehörst hoffentlich nicht zur Spezies, die Simulationen von FPGA-Designs für unnötig hält
@ Vancouver : das wusste ich ja, aber komischerweise gibt es eine Fehlermeldung, wenn ich das nicht als [14:0] anschreibe...
Matthäus schrieb: > @Vancouver: siehe > https://www.chipverify.com/verilog/verilog-arrays-memories > > stimmt also schon.. 'address range' (bitbreite Adresse) und 'range' (Wertebereich) meinen nicht unbedingt das selbe. Vancouver schrieb: > Du weißt, dass [14:0] kein Wertebereich ist, sondern ein 15 > bit breiter Vektor, der die Werte 0...32767 annehmen kann?
Sorry, stimmt natürlich. Das ist die unpacked dimension, da wird der Wertebereich angegeben. Ich hätte geschrieben reg [9:0] tabelle [15][4] aber deine Schreibweise ist auch richtig. Der Dopplepunkt hat mich nur ins geistige Nirvana befördert.
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.