mikrocontroller.net

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


Autor: Rudolf S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Bibliothek
use ieee.numeric_std.all;
ist eingebungen?

Duke

Autor: Rudolf S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist eingebunden ja

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Silvia A. (silvia)
Datum:

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

Autor: Rudolf S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also hier der ganze code... ist aber ziemlich viel überflüssiges drin^^ 
eigentlich geht es nur um das convertieren
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;

entity prell_gen is
  port (
   clk25mhz   : in std_logic;   -- 25 MHz Systemclock
   prell_gen_out : out std_logic := '0';
   wiederholungen    : in std_logic_vector (5 downto 0);
   stufen   : in std_logic_vector (7 downto 0) );
end prell_gen;

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

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

begin
  if (clk25mhz'event and clk25mhz = '1') then -- Synch mit pos Systemclockflanke
    
    --if hilfe = '1' then
      wied := wiederholungen;
    --hilfe := '0'; 
    --end if;
    
    --100us + (50us * Stufen)
    count := to_integer(unsigned(Stufen));
    --count := 1;
    count := count * 50;
    count := count + 100;
    countt := count * 1 us;
    
    while wied /= "000000" loop
      verz <= not verz after (countt); 
      prell_gen_out <= verz;
      wied := wied - one;
    end loop;
    
  end if;
end process verzoegerung;

end prell_gen_architecture;

Autor: T. M. (xgcfx)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rudolf S. (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
     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:
 if (clk25mhz'event and clk25mhz = '1') then 
    while wied /= "000000" loop           -- while erzeugt prinzipiell erstmal parallele Hardware
      verz <= not verz after (countt);    -- das ist aber nicht so schlimm, denn
      prell_gen_out <= verz;              -- die Signale verz und prell_gen_out sind während der Schleife statisch
      wied := wied - one;
    end loop;
Und damit könnte dieser ganze Prozess ohne jegliche 
Funktionseinschränkung so abgekürzt werden:
verzoegerung : process (clk25mhz) --generiert die verzögerung / zeitstufen
begin
  if (clk25mhz'event and clk25mhz = '1') then -- Synch mit pos Systemclockflanke
      verz <= not verz after (countt); 
      prell_gen_out <= verz;
  end if;
end process verzoegerung;
und das wird die Synthese auch tun. Denk mal drüber nach...  :-o

Autor: T. M. (xgcfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dumm nur, dass die Synthese aus
verz <= not verz after (countt); 

ziemlich wahrscheinlich
verz <= not verz;

machen wird. ;-)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
verzoegerung : process (clk25mhz) 
begin
  if (clk25mhz'event and clk25mhz = '1') then 
      verz          <= not verz; 
      prell_gen_out <= verz;
  end if;
end process verzoegerung;

Und zudem ist hier wegen der Signale sogar die Reihenfolge irrelevant, 
so dass das hier das selbe Ergebnis bringt:
verzoegerung : process (clk25mhz) 
begin
  if (clk25mhz'event and clk25mhz = '1') then 
      prell_gen_out <= verz;
      verz          <= not verz; 
  end if;
end process verzoegerung;

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.