std_logic_vector auf integer umwandeln

Gast #2041225
Lesenswert?

Ich stecke nun seit vielen 10minuten an einem sehr banalen Problem..

Die Umwandlung von einem std_logic_vector in einem Integer.  Mit der 
Funktion to_integer erzielte ich bis jz keine Erfolge.

variable count :  integer range 0 to 10000;
...
begin
...
count := to_integer(unsigned(Stufen));
...
wobei Stufen ein std_logic_vector (7 downto 0) ist..
Als Fehler wird mir immer:  (vcom-1078) Identifier "unsigned" is not 
directly visible. angezeigt.

bitte um hilfe!

mfg rudi
Gast #2041265
Lesenswert?

also hier der ganze code... ist aber ziemlich viel überflüssiges drin^^ 
eigentlich geht es nur um das convertieren
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_arith.all;
4
use ieee.std_logic_unsigned.all;
5
use ieee.numeric_std.all;
6

7
entity prell_gen is
8
  port (
9
   clk25mhz   : in std_logic;   -- 25 MHz Systemclock
10
   prell_gen_out : out std_logic := '0';
11
   wiederholungen    : in std_logic_vector (5 downto 0);
12
   stufen   : in std_logic_vector (7 downto 0) );
13
end prell_gen;
14

15
architecture prell_gen_architecture of prell_gen is
16
signal verz : std_logic := '0';            --verzögerungs var
17
begin
18
     
19
verzoegerung : process (clk25mhz) --generiert die verzögerung / zeitstufen
20

21
variable enable : std_logic := '0';          --enable variabel
22
variable wied : std_logic_vector(5 downto 0);--hilfsvariabel für die wiederholungen variabel
23
variable hilfe : std_logic := '0';          --hilfe variabel
24
variable one : std_logic_vector(5 downto 0) := "000001";--zähl variabel
25
variable count :  integer range 0 to 10009;--hilfsvariabel für die stufen
26
variable countt : time; -- hilfsvariable als typ time
27

28
begin
29
  if (clk25mhz'event and clk25mhz = '1') then -- Synch mit pos Systemclockflanke
30
    
31
    --if hilfe = '1' then
32
      wied := wiederholungen;
33
    --hilfe := '0'; 
34
    --end if;
35
    
36
    --100us + (50us * Stufen)
37
    count := to_integer(unsigned(Stufen));
38
    --count := 1;
39
    count := count * 50;
40
    count := count + 100;
41
    countt := count * 1 us;
42
    
43
    while wied /= "000000" loop
44
      verz <= not verz after (countt); 
45
      prell_gen_out <= verz;
46
      wied := wied - one;
47
    end loop;
48
    
49
  end if;
50
end process verzoegerung;
51

52
end prell_gen_architecture;
Moderator (Firma: Titel) Persönliche Seite #2041302
Lesenswert?

@ Rudolf S.
Kommst du aus der C-Ecke und hast bisher Software progemmiert?
Die überaus extensive Nutzung von Variablen legt den Verdacht nahe...

Das kann nicht in Hardware umgesetzt werden:
1
     verz <= not verz after (countt);
Hier wird die Synthese nicht mal eine Warnung, sondern bestenfalls eine 
Info ausspucken, bevor sie das after ignoriert...

Torsten M. schrieb:
> Ist der Code für die Synthese gedacht oder nur für Simulation?
Das kann nur für die Simulation sein, denn sowas packt die Synthese noch 
nicht...
Rudolf S. schrieb:
1
 if (clk25mhz'event and clk25mhz = '1') then 
2
    while wied /= "000000" loop           -- while erzeugt prinzipiell erstmal parallele Hardware
3
      verz <= not verz after (countt);    -- das ist aber nicht so schlimm, denn
4
      prell_gen_out <= verz;              -- die Signale verz und prell_gen_out sind während der Schleife statisch
5
      wied := wied - one;
6
    end loop;
Und damit könnte dieser ganze Prozess ohne jegliche 
Funktionseinschränkung so abgekürzt werden:
1
verzoegerung : process (clk25mhz) --generiert die verzögerung / zeitstufen
2
begin
3
  if (clk25mhz'event and clk25mhz = '1') then -- Synch mit pos Systemclockflanke
4
      verz <= not verz after (countt); 
5
      prell_gen_out <= verz;
6
  end if;
7
end process verzoegerung;
und das wird die Synthese auch tun. Denk mal drüber nach...  :-o
Moderator (Firma: Titel) Persönliche Seite #2041317
Lesenswert?

Nachtrag:
>> Und damit könnte dieser ganze Prozess ohne jegliche
>> Funktionseinschränkung so abgekürzt werden:
Es wird natürlich auch das after ignoriert. Bleibt also das übrig:
1
verzoegerung : process (clk25mhz) 
2
begin
3
  if (clk25mhz'event and clk25mhz = '1') then 
4
      verz          <= not verz; 
5
      prell_gen_out <= verz;
6
  end if;
7
end process verzoegerung;

Und zudem ist hier wegen der Signale sogar die Reihenfolge irrelevant, 
so dass das hier das selbe Ergebnis bringt:
1
verzoegerung : process (clk25mhz) 
2
begin
3
  if (clk25mhz'event and clk25mhz = '1') then 
4
      prell_gen_out <= verz;
5
      verz          <= not verz; 
6
  end if;
7
end process verzoegerung;
Gast #2041407
Lesenswert?

Rudolf S. schrieb:
> Als Fehler wird mir immer:  (vcom-1078) Identifier "unsigned" is not
> directly visible. angezeigt.

Ich hake hier nochmal ein:
Wenn in VHDL etwas doppelt definiert ist, wird dieses "etwas" 
unsichtbar. Eine sinnvollere Meldung wäre ja: Hey Du hast hier was 
doppelt definiert; Fehler ich weiß nicht was ich nehmen soll!?

Stattdessen kommt (je nach Compiler/Synthesizer) "nicht definiert" oder 
"unsichtbar". Da kann man manchmal ganz schön nach dem Fehler suchen.

Das unsigned ist in diesem Fall in der ieee.numeric_std und in der 
ieee.std_logic_arith/ieee.std_logic_unsigned definiert und damit 
unsichtbar...


Duke

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren