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
Die Bibliothek
1 | use ieee.numeric_std.all; |
ist eingebungen? Duke
Hast du noch andere Arithmetik-Libs eingebunden? Zeig mal den ganzen Code (am besten als Anhang mit Endung .vhd)...
die numeric.std unterstützt das direct nicht. über einen Cast sollte es gehen.
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; |
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?
use ieee.std_logic_unsigned.all; ausgeklammert und jz gehts danke. für die synthese mit einem Altera FPGA
@ 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
Dumm nur, dass die Synthese aus
1 | verz <= not verz after (countt); |
ziemlich wahrscheinlich
1 | verz <= not verz; |
machen wird. ;-)
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; |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.