Hallo ich bin ein neuling was VHDL angeht und ich habe da ein Problem. Es wäre super wenn mir jemand eine Hilfestellung geben könnte. Ich möchte in einem Programm 16 Zähler Herunterzaehlen. Ich hab mir das so gedacht, dass ich ein Array einbinde, welches 16 Adressen enthält und wo ich in jeder Adresse jeweils Integer Werte von 40000 herunterzählen lasse. Leider gibt mir das Programm Libero welches ich benutze immer den folgenden Fehler aus: C:/Actel/Work/UART_APB_state_machine/hdl/Master.vhd(108): ERROR: type integer does not match with a string literal (VHDL-1276) Hier mal der Auszug aus meinem Code: type array_Timeout is Array (3 downto 0) of integer range 40000 to 0; signal array_Timeout_Sicherungsmesswerte : array_Timeout; if array_Timeout_Sicherungsmesswerte("0000") > 0 then array_Timeout_Sicherungsmesswerte("0000") <= array_Timeout_Sicherungsmesswerte("0000") - 1 ; else array_Timeout_Sicherungsmesswerte("0000") <= 0; Ich möchte sozusuagen wenn der Integer Wert groesser als 0 ist ihn immer um 1 herunterzaehlen. Ansonsten soll er auf 0 gesetzt werden.Hier will ich quasi das erste Feld in meinem Array ("0000") ansprechen und diesen Counter herunterzaehlen. Ich weiß nicht ob das ueberhaupt so geht die Adressen (sozusagen die 16 Felder des Arrays) als std_logic Vector zu deklarieren aber die Inhalte der Adressen mit Integer Zahlen zu befüllen Falls jemand Idee hat wäre ich sehr dakbar. Viele Grüße Steve
Steve schrieb: > C:/Actel/Work/UART_APB_state_machine/hdl/Master.vhd(108): ERROR: type > integer does not match with a string literal (VHDL-1276) > type array_Timeout is Array (3 downto 0) of integer range 40000 to 0; Dein Array besteht aus 4 Integer-Zahlen mit einem Bereich von 40000 bis 0. Was Du möchtest, müsste korrekterweise so sein:
1 | type array_Timeout is Array (15 downto 0) of integer range 0 to 40000; |
2 | -- besser noch aber so:
|
3 | type array_Timeout is Array (0 to 15) of integer range 0 to 40000; |
4 | -- und dann folgendes:
|
5 | if array_Timeout_Sicherungsmesswerte(0) > 0 then |
6 | array_Timeout_Sicherungsmesswerte(0) <= array_Timeout_Sicherungsmesswerte(0) - 1; |
7 | else -- der else-Zweig kann entfallen, da sich da ja nichts mehr ändert. |
8 | array_Timeout_Sicherungsmesswerte(0) <= 0; |
9 | end if; |
10 | -- Die If-Anweisung natürlich in einem getakteten Prozess.
|
Die Indizierung eines Arrays erfolgt immer in einem "POSITIVE" ganzzahligen Datenraum.
Vielen Dank für die schnelle Hilfe Matthias. jetzt klappt es :). Ich hätte noch eine andere Frage und zwar geht es um folgendes: Ich möchte einen 32 Bit Bus auslesen. Allerdings benötige ich nur die ersten 8 Bit, da der Rest eh nur mit Nullen gefüllt ist: -- Eingaenge Bus entity Master is Port ( PRDATA :in std_logic_vector(31 downto 0) ); end master; . . . signal PRDATA_int : std_logic_vector(7 downto 0); . . . PRDATA_int <= PRDATA; wenn ich dann später im Prozess den Wert von PRDATA, PRDATA_int zuordnen möchte geht das natürlich nicht weil er erwartet dass PRDATA_int auch 32 Bit hat. Gibt es da eine Möglichkeit, dass man nur die ersten 8 Bit von PRDATA auf PRDATA_int schreibt. Über Hilfe wäre ich sehr dankbar :) mfg Steve
Super genauso hab ich mir das auch gedacht. Vielen Dank für den Buchtip..ich werd mir das Buch auf alle mal anschauen. mfg Steve
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.