Anonymous U. schrieb:
> Wenn ich für die select-Leitung keinen logic_bit_vector verwende,
Was ist das? Ein selbst definierter Datentyp?
> optimiert das synthesetool dann automatisch auf die benötigten
> Leitungen.
Ja.
> Bzw. ist die Vorgehensweise mit dem logic_bit_vector nicht
> schöner oder ist das unüblich?
Die allermeisten Bibliotheksfunktionen arbeiten mit "unconstrained
vectors", denn sonst müsste ja eine to_integer()-Funktion die Breite des
Vektors mitbekommen. Sieh dir einfach mal z.B. die numeric_std an:
https://www.csee.umbc.edu/portal/help/VHDL/packages/numeric_std.vhd
Mal ganz exemplarisch daraus die Funktion to_integer():
1 | function TO_INTEGER(ARG: UNSIGNED) return NATURAL is
|
2 | constant ARG_LEFT:INTEGER:= ARG'length-1;
|
3 | alias XXARG:UNSIGNED(ARG_LEFT downto 0) is ARG;
|
4 | variable XARG:UNSIGNED(ARG_LEFT downto 0);
|
5 | variable RESULT: NATURAL:= 0;
|
6 | variable w : INTEGER:= 1; -- weight factor
|
7 | begin
|
8 | if (ARG'length<1) then
|
9 | assert NO_WARNING
|
10 | report "numeric_std.TO_INTEGER: null arg"
|
11 | severity warning;
|
12 | return 0;
|
13 | end if;
|
14 | XARG:= TO_01(XXARG);
|
15 | if (XARG(XARG'left)='X') then
|
16 | assert NO_WARNING
|
17 | report "numeric_std.TO_INTEGER: metavalue arg set to 0"
|
18 | severity warning;
|
19 | return 0;
|
20 | end if;
|
21 | for i in XARG'reverse_range loop
|
22 | if XARG (i) = '1' then
|
23 | RESULT:= RESULT + w;
|
24 | end if;
|
25 | if (i /= XARG'left) then w := w + w;
|
26 | end if;
|
27 | end loop;
|
28 | return RESULT;
|
29 | end TO_INTEGER;
|
Dort siehst du in der ersten Zeile, dass nur ein UNSIGNED Vektor
unbestimmter Breite übergeben wird. Der Rest wird mit Attributen
gemacht, hier eine schöne Anwendung für das Attribut 'reverse_range, das
den Vektor in einer for-Schleife von "hinten" her durchnudelt.
Als Tipp: es schadet nicht, diese Bibliotheken mal genauer anzuschauen,
da sind einige hübsche "Tricks" versteckt. Und vor Allem: die
funktionieren garantiert.