Forum: FPGA, VHDL & Co. std_logic_vector zu integer


von Guest (Gast)


Lesenswert?

Hallo

Bekomme für diese Zeile immer nen Fehler.

std_logic_name := Array_Name(aktuelles Zeichen)(to_integer (x_pos (4 
downto 0)))(to_integer (y_pos (4 downto 0)));

die Fehlermeldung lautet:

Error (10405): VHDL error at OSD.vhd(102): can't determine type of 
object at or near identifier "to_integer" -- found 0 possible types

x_pos und y_pos werden so gebildet.

x_pos := conv_std_logic_vector(row_cnt,11);
y_pos := conv_std_logic_vector(col_cnt,10);

diese bibliotheken sind eingebunden:

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;

Ich will nur jeweils die unteren 4 bit der Counter wieder in einen 
integer wert wandeln damit ich das Array zeile für zeile abprüfen kann.

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


Lesenswert?

Guest schrieb:
> 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;
Lass die mittleren beiden Libs raus! Sonst kommen einige Definitionen 
doppelt vor, und du kannst überraschende Fehlermeldungen erhalten...
http://www.lothar-miller.de/s9y/archives/14-Numeric_Std.html

> to_integer (y_pos (4 downto 0))
to_integer aus der numeric_std funktioniert nur mit den Datentypen 
signed bzw. unsigned, nicht mit std_logic_vector. daher sollte das eher 
so aussehen:
1
to_integer(unsigned(y_pos(4 downto 0)))
oder mit den alten Synopsys Libs:
1
conv_integer(y_pos(4 downto 0))

Aber warum lässt du die x_pos und die y_pos nicht einfach gleich als 
integer laufen?

von Guest (Gast)


Lesenswert?

...erstmal danke :)

immer wieder lese ich alte libs. ich hab q9.1 sp2 web edition.

zum Zähler...ich habe ja schon einen integer counter laufen und da 
dachte ich warum nicht gleich nutzen. ich könnte ihn auch als unsinged 
(11 downto 0 bzw. 10 downto 0) deklarieren dann spar ich mir das hin und 
her convertieren.

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


Lesenswert?

Guest schrieb:
> immer wieder lese ich alte libs.
Beitrag "Re: Wert umwandeln"
> ich hab q9.1 sp2 web edition.
Da ist die numeric_std auf jeden Fall auch mit drin...

> zum Zähler...ich habe ja schon einen integer counter laufen und da
> dachte ich warum nicht gleich nutzen.
Ja, warum wandelst du dann noch großartig hin- und her?
>>> y_pos := conv_std_logic_vector(col_cnt,10);
>>> to_integer (y_pos (4 downto 0)));

> ich könnte ihn auch als unsinged (11 downto 0 bzw. 10 downto 0)
> deklarieren dann spar ich mir das hin und her convertieren.
Du könntest auch einfach gleich den col_cnt als Index nehmen, wenn der 
eh' schon ein integer ist......

von Guest (Gast)


Lesenswert?

aber der counter läuft weiter als das array breit bzw tief ist...gibt 
das nicht probleme, wenn er einen wert im array abfragt der außßerhalb 
liegt?

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


Lesenswert?

Guest schrieb:
> aber der counter läuft weiter als das array breit bzw tief ist...gibt
> das nicht probleme, wenn er einen wert im array abfragt der außßerhalb
> liegt?
Doch klar. Das wird dir der Simulator aber sagen.
Und zur Begrenzung des Zählbereichs gibt es die entsprechenden 
Operatoren / und mod, mit denen sich der Index (ohne zusätzlichen 
Hardwareaufwand) zurechtrücken lässt.

von guest (Gast)


Lesenswert?

und wie mache ich einen iteger zu einem vector,
also z.B.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity Zaehler is
    Port ( clk : in  STD_LOGIC;
           count : out  STD_LOGIC_VECTOR (3 downto 0));
end Zaehler;

architecture Behavioral of Zaehler is

signal help : integer range 0 to 15;

begin

process
begin
wait until rising_edge(clk);
help <= help + 1;
end process;
--hier müsste der integer "help" in einen Vektor gewandelt werden?
count<=help;
end Behavioral;

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


Lesenswert?

guest schrieb:
> --hier müsste der integer "help" in einen Vektor gewandelt werden?
> count<=help;
Ja. Er müsste nicht. Er muss!

Mal angenommen, ich hätte im 
Beitrag "Re: std_logic_vector zu integer" nicht den 
entsprechenden Link erwähnt, dann müsstest du eben jetzt mal da hin 
gehen...
Und dann sähest du, dass ein "Umweg" über unsigned oder signed nötig 
wäre. Also müsste erst mal der integer zum unsigned mit einer Breite 
von 4 Bit konvertiert werden:
1
 to_signed(help,4)
Und dann das ganze in einen std_logic_vector gecasted werden:
1
 std_logic_vector(to_signed(help,4))
Und damit sähe es also so aus:
1
 count <= std_logic_vector(to_signed(help,4));
Ausgeschlafene Spezis würden das so schreiben:
1
 count <= std_logic_vector(to_signed(help,count'width));
Dann bräuchte nicht die Breite jedesmal angepasst werden, wenn count 
sich ändern würde...

von guest (Gast)


Lesenswert?

@Lothar

merce Dir!

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.