Forum: FPGA, VHDL & Co. Brauche Hilfe mit VHDL Code array


von Steve (Gast)


Lesenswert?

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

von Matthias G. (mgottke)


Lesenswert?

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.

von Steve (Gast)


Lesenswert?

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

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


Lesenswert?

So geht das:
1
PRDATA_int  <= PRDATA(7 downto 0);
Als Buchtipp:
Reichardt/Schwarz VHDL-Synthese

von Steve (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.