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

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?

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.