Hallo an alle, ich möchte einen generischen Multiplexer implementieren. Der Eingang ist ein N*32 breiter Vektor. Mittels eines Multiplexers kann nun das m-te 32 Bit Wort aus diesem Vektor selektiert werden. Um das besser darzustellen habe ich ein Bild angehängt, bei dem der Eingangsvektor 128-bit breit ist. Die Steuerleitung ist log2(N) breit. Wie kann ich diese Schaltung in VHDL generisch für N>=1 implementieren? lg Martin
1 | out(31 downto 0) <= in((to_integer(m)+1)*32 - 1 downto (to_integer(m)+1)*32 -32) |
VHDL hotline schrieb im Beitrag #4015212: > out(31 downto 0) <= in((to_integer(m)+1)*32 - 1 downto > (to_integer(m)+1)*32 -32) Leider sind solche Konstrukte in Vivado nicht synthetisierbar, da beide Ranges dynamisch sind. Siehe dazu [1]. Wie kann man solche vermeiden? Danke & lg Martin [1] http://www.xilinx.com/support/answers/52302.html
Martin schrieb: > Der Eingang ist ein N*32 breiter Vektor. Mittels eines Multiplexers > kann nun das m-te 32 Bit Wort aus diesem Vektor selektiert werden. > Um das besser darzustellen habe ich ein Bild angehängt, bei dem der > Eingangsvektor 128-bit breit ist. Mir kommt die Anwendung etwas eigenartig vor, aber wenns unbedingt sein muss... > Die Steuerleitung ist log2(N) breit. Das ist eine Kommazahl, das ist dir klar? Also musst müsstest du erst mal passend runden: http://www.lothar-miller.de/s9y/archives/72-Breite-eines-Vektors-berechnen-log2.html > Wie kann man solche vermeiden? Mit einer Schleife?
1 | process (m, input) begin |
2 | for i in 0 to 31 loop |
3 | output(i) <= input(i + m*32); |
4 | end loop; |
5 | end process; |
:
Bearbeitet durch Moderator
Hallo Lothar, Danke für die Antwort. Lothar Miller schrieb: > Martin schrieb: >> Der Eingang ist ein N*32 breiter Vektor. Mittels eines Multiplexers >> kann nun das m-te 32 Bit Wort aus diesem Vektor selektiert werden. >> Um das besser darzustellen habe ich ein Bild angehängt, bei dem der >> Eingangsvektor 128-bit breit ist. > Mir kommt die Anwendung etwas eigenartig vor, aber wenns unbedingt sein > muss... Das Anwendungsgebiet ist relativ einfach erklärt. Ein Algorithmus arbeitet auf Blöcken (die sind N*32-bit breit). Das Dateninterface ist jedoch nur 32-bit breit. Irgendwie müssen die Daten nun serialisiert werden. Die generische Implementierung deshalb, um verschiedene Algorithmen einfach austauschen zu können. Wie würdest du sowas realisiseren? Lothar Miller schrieb: > Das ist eine Kommazahl, das ist dir klar? Das ist klar. Die wird schon entsprechend generiert. Lothar Miller schrieb: >> Wie kann man solche vermeiden? > Mit einer Schleife? process (m, input) begin > for i in 0 to 31 loop > output(i) <= input(i + m*32); > end loop; > end process; Danke, funktioniert! lg Martin
VHDL hotline schrieb im Beitrag #4015297: > Martin schrieb: >> Wie würdest du sowas realisiseren? > > Schieberegister. Funktioniert nicht. Da möglicherweise die unteren Blöcke ungültig sind.
Martin schrieb: > Funktioniert nicht. Da möglicherweise die unteren Blöcke ungültig sind. Dann nimm halt nur die oberen, zwingt dich ja keiner den Gesamtblock komplett durchzuschieben.
Martin schrieb: > Irgendwie müssen die Daten > nun serialisiert werden. Die generische Implementierung deshalb, um > verschiedene Algorithmen einfach austauschen zu können. So oder so bräuchtest Du noch eine Signalisierung, die Dir angibt, wann die Daten gültig sind. Duke
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.