Hallo, ich würde gerne in einem Vivado Design (siehe Beitrag "Red Pitaya Erfahrungswerte?" ) einen generischen Multiplexer benutzen. das angefügte MUX_TEST.vhd Module ist im weitesten an dem Code hier angelehnt: https://stackoverflow.com/questions/23709954/creating-a-generic-multiplexer jetzt habe ich das Problem, dass es "so" in Vivado nicht funktioniert. Z.B. dürfen PORTS nur vom Typ STD_LOGIC oder STD_LOGIC_VECTOR sein und nicht etwas integer. Sollte ich den Port für "sel" auf STD_LOGIC_VECTOR stellen, müsste ich ja um die "Bitbreite" generisch berechnen zu lassen, aus "input_entries" die Quadratwurzel ziehen, auf den nächsten Ganzzahlwert runden 1 abziehen. dazu benötigte ich "log2" und "ceil" diese sind in der IEEE.MATH_REAL enthalten, jedoch nicht mehr in Vivado unterstützt. Wie komme ich sinnvollerweise doch noch zum Ziel? also PORT input ---> ist generisch PORT sel ---> ist generisch (Quadratwurzel und ceil benötigt) PORT outp --> ist generisch (nur von der Datenbreite abhängig) Viele Grüße
In der Kürze der Zeit fällt mir schon mal das auf: se IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; ... use IEEE.NUMERIC_STD.ALL; Als ganz wichtiger Tipp: niemals die alte obsolete std_logic_arith zusammen mit der numeric_std verwenden. Nie! Das Problem dabei sind nämlich doppelte Typdefinitionen, die kuriose und irreführende Fehlermeldungen bringen. Dazu einfach mal hier im Forum suchen. Und als Tipp, wie man generische Ports macht: sieh dir mal den Quellcode der numeric_std an. Da sind ein paar hübsche Beispiele drin. Letztlich musst du für einen generischen MUX nämlich gar keine Vektorbreite definieren oder abgeben. Jeder Vektor bringt seine Breite nämlich mit. Stichwort: Attribute, 'length, ' range, usw...
:
Bearbeitet durch Moderator
Peter B. schrieb: > dazu benötigte ich "log2" und "ceil" diese sind in der IEEE.MATH_REAL > enthalten, jedoch nicht mehr in Vivado unterstützt. Trotz eines anders lautenden Answer Records https://www.xilinx.com/support/answers/52304.html, und auch wenn der Syntax-Check das rot unterkringelt, werden gerade log2 und ciel sehr wohl für die static elaboration von der Synthese unterstützt, vgl. z.B. hier: https://forums.xilinx.com/xlnx/board/crawl_message?board.id=DEENBD&message.id=13826 Einfach ausprobieren und im Synthese-Report nachschauen, was dort errechnet wurde.
Kann es sein, dass Vivado diese veralteten BIB nach wie vor noch reinhaut? Oder ist das nun abgestellt?
Rudolph schrieb: > werden gerade log2 und ciel sehr wohl für die static elaboration von der > Synthese unterstützt, Ja, zur Berechnung von Konstanten schon immer: http://www.lothar-miller.de/s9y/archives/72-Breite-eines-Vektors-berechnen-log2.html
Peter B. schrieb: > jetzt habe ich das Problem, dass es "so" in Vivado nicht funktioniert. > Z.B. dürfen PORTS nur vom Typ STD_LOGIC oder STD_LOGIC_VECTOR sein und > nicht etwas integer. Natürlich dürfen Ports prinzipiell jeden Typ übergeben, dieses Problem liegt also ausserhalb des Moduls. Peter B. schrieb: > also > PORT input ---> ist generisch > PORT sel ---> ist generisch (Quadratwurzel und ceil benötigt) > PORT outp --> ist generisch (nur von der Datenbreite abhängig) Ich würde das mal etwa so anfangen und schauen, ob der Synthesizer das frisst:
1 | library IEEE; |
2 | use IEEE.std_logic_1164.all; |
3 | use IEEE.NUMERIC_STD.ALL; |
4 | |
5 | entity MUX_TEST is |
6 | |
7 | port( |
8 | signal input : IN STD_LOGIC_VECTOR; |
9 | signal sel : IN STD_LOGIC_VECTOR; |
10 | signal outp : OUT STD_LOGIC_VECTOR |
11 | );
|
12 | |
13 | end entity MUX_TEST; |
14 | |
15 | architecture Behavioral of MUX_TEST is |
16 | signal idx : integer; |
17 | begin
|
18 | idx <= to_integer(unsigned(sel)); |
19 | outp <= input (input(idx*input'length+input'length-1) DOWNTO (idx*input'length); |
20 | end architecture Behavioral; |
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.