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.
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
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.