Forum: FPGA, VHDL & Co. Frage zur VHDL Syntax - unsigned(std_logic_vector)


von hmmm (Gast)


Lesenswert?

Hallo,

ich steh grade etwas aufm Schlauch. Ich will einen std_logic_vector mit 
einem generic integer vergleichen. Ich hab jetzt aber grad ein anderes 
Problem
1
...
2
generic(foo : integer := 8);
3
...
4
5
signal footo : std_logic_vector(3 downto 0);
6
signal foodownto : std_logic_vector(0 to 3);
7
8
...
9
-- hier kommen einige Zuweisungen zu den beiden Variablen, angenommen es steht jetzt in beiden "1000" drin, also: (könnte aber auch innerhalb von eines prozesses sein, ist also variabl und keine feste, concorrent zuweisung
10
footo <= "1000";
11
foodownto <= "1000";
12
13
14
-- und später prüfe ich dann sowas, innerhalb eines prozesses
15
if unsigned(footo) = foo then
16
-- do something
17
end if;
18
if unsigned(foodownto) = foo then
19
-- do something
20
end if;

werden dann beide if anweisungen ausgeführt? also sind beide if 
auswertungen true, obwohl der eine downto und der andere to deklariert 
wurden? Danke für die Hilfe

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


Lesenswert?

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...

: Bearbeitet durch Moderator
von hmmm (Gast)


Lesenswert?

Ahh verdammt...

Gut, danke mal für die Hinweise.^^
Interessant ist dann nur folgendes:
hab mir mal einen sehr übersichtlichen "Test" geschrieben
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
5
entity test is
6
end entity test;
7
8
architecture RTL of test is
9
  signal a : std_logic_vector(0 to 3) := "0000";
10
  constant b : integer := 8;
11
begin
12
  
13
  a <= "1000" after 1 ns;
14
  
15
  test : process(a) is
16
  begin
17
    report "here";
18
    if unsigned(a) = b then
19
      report "if";
20
    else
21
      report "elsee";
22
    end if;
23
  end process test;
24
  
25
end architecture RTL;

und modelsim git mir aus
1
run 2 ns
2
# ** Note: here
3
#    Time: 0 ns  Iteration: 0  Instance: /test
4
# ** Note: elsee
5
#    Time: 0 ns  Iteration: 0  Instance: /test
6
# ** Note: here
7
#    Time: 1 ns  Iteration: 0  Instance: /test
8
# ** Note: if
9
#    Time: 1 ns  Iteration: 0  Instance: /test

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


Lesenswert?

hmmm schrieb:
> und modelsim git mir aus
Ja, passt doch...
Erst ist der Wert ungleich, und dann nach 1 ns gleich.

Aber wie gesagt: du hast Glück, dass der "=" Operator passend für den 
Vergleich eines unsigend Vektors mit einem positiven(!) Integer 
überladen, und zudem die Zahl 8 genau so ein Integer ist:
1
  :
2
     -- Id: C.29
3
  function "=" ( L: UNSIGNED; R: NATURAL) return BOOLEAN;
4
     -- Result subtype: BOOLEAN
5
     -- Result: Computes "L = R" where L is an UNSIGNED vector and
6
     --         R is a non-negative INTEGER.
7
  :


> test : process(a) is
Dir ist klar, dass diese Sensitivliste nicht vollständig ist?

: Bearbeitet durch Moderator
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.