mikrocontroller.net

Forum: FPGA, VHDL & Co. Seltsamer ModelSim Compiler Fehler?


Autor: Rooney Bob (rooney)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich stehe vor einem mir unlösbaren Problem.

Wenn ich folgenden VHDL Code (nur relevante Teile angeführt) in ModelSim 
kompiliere wird die Fehlermeldung "Badly formed indexed name of "data". 
Index #2 is a range." ausgegeben.
type array2d0 is array (15 downto 0,15 downto 0) of std_logic;

signal data: array2d0;
signal lDat: std_logic_vector(15 downto 0);

lDat(15 downto 0) <= data(1, 15 downto 0);

Weiß jemand voran das liegen kann? Kompiliere ich den Code in Quartus II 
funktioniert es tadellos.

lg
Rooney

Autor: dito (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternativ müsste aber auch diese Deklaration funktionieren:
type array2d0 is array (15 downto 0) of std_logic_vector(15 downto 0);


Oder ist das nicht gewollt?

Autor: Modelsimmer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaube, man muss die 1 als natural übergeben

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

Bewertung
0 lesenswert
nicht lesenswert
> Index #2 is a range
Das sagt schon alles, oder?
  data(1, 15 downto 0);
Modelsim stört sich an der Indizierung mit einem Range.

> Kompiliere ich den Code in Quartus II funktioniert es tadellos.
Funktioniert dann deine Hardware, oder verdaut Quartus nur den Code und 
macht ein Verdauungsprodukt daraus (ugs: Sch...e)?

> Ich stehe vor einem mir unlösbaren Problem.
Mach eine loop daraus.
   for i in 0 to 15 loop
      lDat(i) <= data(1, i);
   end loop;

Autor: Rooney Bob (rooney)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, hat funktioniert!!

Autor: Rooney Bob (rooney)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, vielleicht zu früh gefreut.

Folgender Code funktioniert einwandfrei...
process(data)
begin
  for i in 0 to 15 loop
    lDat(i) <= data(1, i);
  end loop;
end process;

Wie macht man das aber, wenn man kein Sensitivity List hat, also wenn 
man einen konstanten Wert zuweisen möchte?

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rooney Bob schrieb:
lDat(15 downto 0) <= data(1, 15 downto 0);

Slices sind nur für ein-dimensionale Objekte definiert. Siehe auch 
Kapitel 6.5 in IEEE1076-2002. Also, Schleife oder ein ein-dimensionales 
Array aus std_logic_vector definieren.

Gruß
Marcus
http://www.doulos.com/

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

Bewertung
0 lesenswert
nicht lesenswert
> Wie macht man das aber, wenn man kein Sensitivity List hat, also wenn
> man einen konstanten Wert zuweisen möchte?
Jeder Prozess wird bei der Initialisierung einmal bis zum ersten wait 
durchlaufen.

Wenn du keine Sensitiv-Liste hast, dann muß dein Prozess ein wait haben, 
sonst hagelt es Fehlermeldungen. Also mußt du zum Schluss ein wait 
einfügen:
process begin
  for i in 0 to 15 loop
    lDat(i) <= constantdata(1, i);
  end loop;
  wait; -- wait forever
end process;

Autor: Rooney Bob (rooney)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also nur "wait" geht nicht, denn dann wird in Xilinx folgende 
Fehlermeldung ausgegeben:

Bad condition in wait statement, or only one clock per process.

Ein eindimensionales Objekt nehmen geht deswegen nicht, da ich in meinem 
Design ein fertiges Modul einsetze, das als Input leider ein 
mehrdimensionales Array erwartet. Würde mir gerne ersparen alles 
umzuschreiben.

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.