Forum: FPGA, VHDL & Co. Schleife: Vergleich von Integer und std_logic_vector


von Andi (loopy83)


Lesenswert?

Hallo zusammen,

ich möchte gerne eine Schleife erstellen.
1
if counter_value < register_value then
2
  counter_value <= counter_value + 1;
3
else
4
...
5
end if;

Nun ist der counter_value vom Typ Integer und der register_value vom Typ 
std_logic_vector.
1
signal register_value : STD_LOGIC_VECTOR(23 downto 0) := x"027100";
2
signal counter_value_strobe : integer range 0 to 16777215 := 0;

Nun habe ich mir diese beiden Links angeschaut und probiere Folgendes:
http://www.mikrocontroller.net/articles/Rechnen_in_VHDL
http://www.lothar-miller.de/s9y/categories/16-Numeric_Std
1
if counter_value < to_integer(signed(register_value)) then
2
  counter_value <= counter_value + 1;
3
else
4
...
5
end if;

Auch wenn ich die CAST und KONVERTIERUNG trenne und über Zwischensignale 
gehe, meckert mir ISE an, dass to_integer ein Undefined symbol ist.

Wie kann ich in der Schleife beide Werte miteinander vergleich, so dass 
es sauber übersetzt wird und auch sauber implementiert werden kann?

Vielen Dank!
Andi

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


Lesenswert?

Andreas B. schrieb:
> dass to_integer ein Undefined symbol ist
Zeig mal deine IEEE Libs vom Anfang deiner VHDL-Datei...

> ich möchte gerne eine Schleife erstellen.
http://www.if-schleife.de

von Andi (loopy83)


Lesenswert?

Hallo,
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;

Lass mich raten, ich muss die
1
use IEEE.NUMERIC_STD.ALL;
noch einbinden...

Nun vermeldet mir ISE "to_integer can not have such operands in this 
context"... muss ich den Vergleichswert doch einzeln umwandeln, geht das 
nicht auf einen Ritt in diesem Ausdruck?
1
if counter_value < to_integer(signed(register_value)) then
Sorry für den Begriff "if Schleife" - da hast du natürlich Recht :)

Vielen Dank!

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


Lesenswert?

Andreas B. schrieb:
> Lass mich raten, ich muss die
> use IEEE.NUMERIC_STD.ALL;
> noch einbinden...
Nein. Nicht noch, sondern nur...
Siehe den Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"
und den Beitrag "Wert umwandeln"
und viele, viele andere...

> geht das nicht auf einen Ritt in diesem Ausdruck?
Doch, das geht.

von Andi (loopy83)


Lesenswert?

Ah, in den Verlinkungen ist es klar geworden.
Ich habe nun
1
--use IEEE.STD_LOGIC_ARITH.ALL;
2
--use IEEE.STD_LOGIC_UNSIGNED.ALL;
3
use IEEE.NUMERIC_STD.ALL;
gesetzt und schon geht es.

Vielen Dank Lothar!

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.