mikrocontroller.net

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


Autor: Steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht 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:
type array_Timeout is Array (15 downto 0) of integer range 0 to 40000;
-- besser noch aber so:
type array_Timeout is Array (0 to 15) of integer range 0 to 40000;
-- und dann folgendes:
if array_Timeout_Sicherungsmesswerte(0) > 0 then
   array_Timeout_Sicherungsmesswerte(0) <= array_Timeout_Sicherungsmesswerte(0) - 1;
else -- der else-Zweig kann entfallen, da sich da ja nichts mehr ändert.
   array_Timeout_Sicherungsmesswerte(0) <= 0;
end if;
-- Die If-Anweisung natürlich in einem getakteten Prozess.
Die Indizierung eines Arrays erfolgt immer in einem "POSITIVE" 
ganzzahligen Datenraum.

Autor: Steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.