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.
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?
...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.
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......
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?
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.
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;
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...
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.