hmmm schrieb:
> werden dann beide if anweisungen ausgeführt?
Keine wird ausgeführt, weil du einen unsigned-Vektor mit einem Integer
vergleichst. Das geht nicht.
Mit der numeric_std ginge es so:
1 | if to_integer(unsigned(foodownto)) = foo then ...
|
Und dann wird es spannend: wird auch der "to-Vektor" "richtig"
umgerechnet?
Da hilft ein Blick in die numeric_std:
http://www.csee.umbc.edu/portal/help/VHDL/packages/numeric_std.vhd
Dort findet sich dann sowas:
1 | library ieee;
|
2 | use ieee.STD_LOGIC_1164.all;
|
3 |
|
4 | Package numeric_std is
|
5 | --================================================================
|
6 | -- Numeric array type definitions
|
7 | --================================================================
|
8 |
|
9 | type UNSIGNED is array ( NATURAL range <> ) of STD_LOGIC;
|
Und das sieht genau so aus wie die definition des std_logic_vectors:
1 | type std_logic_vector is array ( natural range <>) of std_logic;
|
Das heißt also, dass der Cast zum unsigend() nichts am Vektor ändert.
Nächster Schritt: was passiert beim to_integer()?
Wieder in der numeric_std nachgeschaut:
1 | function TO_INTEGER(ARG: UNSIGNED) return NATURAL is
|
2 | :
|
3 | variable XARG:UNSIGNED(ARG_LEFT downto 0);
|
4 | variable RESULT: NATURAL:= 0;
|
5 | variable w : INTEGER:= 1; -- weight factor
|
6 | begin
|
7 | :
|
8 | :
|
9 | for i in XARG'reverse_range loop
|
10 | if XARG (i) = '1' then
|
11 | RESULT:= RESULT + w;
|
12 | end if;
|
13 | if (i /= XARG'left) then w := w + w;
|
14 | end if;
|
15 | end loop;
|
16 | return RESULT;
|
17 | end TO_INTEGER;
|
Nach genauem hinsehen erkennt man, dass hier mit 'reverse_range stur die
Bits des Vektors "von hinten her" angeschaut werden. Und eben nicht
explizit das footo(3) oder das foodownto(3).
Fazit: beide Vergleiche werden auf die selbe Art reagieren...