Forum: FPGA, VHDL & Co. Generischer Multiplexer in VIVADO als VHDL läuft nicht


von Peter B. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
von Rudolph (Gast)


Lesenswert?

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.

von Edi M. (Gast)


Lesenswert?

Kann es sein, dass Vivado diese veralteten BIB nach wie vor noch 
reinhaut?
Oder ist das nun abgestellt?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.