Forum: FPGA, VHDL & Co. std_logic_vector auf integer umwandeln


von Rudolf S. (Gast)


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

von Duke Scarring (Gast)


Lesenswert?

Die Bibliothek
1
use ieee.numeric_std.all;
ist eingebungen?

Duke

von Rudolf S. (Gast)


Lesenswert?

ist eingebunden ja

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


Lesenswert?

Hast du noch andere Arithmetik-Libs eingebunden?
Zeig mal den ganzen Code (am besten als Anhang mit Endung .vhd)...

von Silvia A. (silvia)


Lesenswert?

die numeric.std unterstützt das direct nicht.
über einen Cast sollte es gehen.

von Rudolf S. (Gast)


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;

von T. M. (xgcfx)


Lesenswert?

Rudolf S. schrieb:
> use ieee.std_logic_arith.all;
> use ieee.std_logic_unsigned.all;

fliegen raus und schon dürfte es gehen. Ist der Code für die Synthese 
gedacht oder nur für Simulation?

von Rudolf S. (Gast)


Lesenswert?

use ieee.std_logic_unsigned.all;
ausgeklammert und jz gehts danke.
für die synthese mit einem Altera FPGA

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


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

von T. M. (xgcfx)


Lesenswert?

Dumm nur, dass die Synthese aus
1
verz <= not verz after (countt);

ziemlich wahrscheinlich
1
verz <= not verz;

machen wird. ;-)

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


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;

von Duke Scarring (Gast)


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

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.