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


von Rooney B. (rooney)


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.
1
type array2d0 is array (15 downto 0,15 downto 0) of std_logic;
2
3
signal data: array2d0;
4
signal lDat: std_logic_vector(15 downto 0);
5
6
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

von dito (Gast)


Lesenswert?

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


Oder ist das nicht gewollt?

von Modelsimmer (Gast)


Lesenswert?

ich glaube, man muss die 1 als natural übergeben

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


Lesenswert?

> Index #2 is a range
Das sagt schon alles, oder?
1
  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.
1
   for i in 0 to 15 loop
2
      lDat(i) <= data(1, i);
3
   end loop;

von Rooney B. (rooney)


Lesenswert?

Danke, hat funktioniert!!

von Rooney B. (rooney)


Lesenswert?

Okay, vielleicht zu früh gefreut.

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

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

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Rooney Bob schrieb:
1
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/

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


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:
1
process begin
2
  for i in 0 to 15 loop
3
    lDat(i) <= constantdata(1, i);
4
  end loop;
5
  wait; -- wait forever
6
end process;

von Rooney B. (rooney)


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.

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.