Forum: FPGA, VHDL & Co. Quartus interpretiert Array of std_logic_vector merkwürdig


von Peter Z. (starkstrompeter)


Lesenswert?

Hallo Zusammen,

ich arbeite gerade an einem VHDL-Design und komme mit dem, was Quartus 
II 11.1 mir erzeugt nicht ganz klar. Prinzipiell habe ich eine Entity, 
welche ein Array[0..127] von std_logic_vector(31 downto 0) in ihrem Port 
hat:
1
port(
2
   COE_OUTPUTS    : out io_array(0 to 127)  -- 0x80..0xff: Read/Write
3
);

Der Typ "io_array" ist in einem gesonderten Package definiert:
1
type io_array is array(natural range <>) of std_logic_vector(31 downto 0);

Von dieser Komponente habe ich nun in ein Block Symbol File (.bsf) 
erzeugt (File->Create/Update->Create symbol files for current file). 
Dieses verwende ich innerhalb eines Block Design Files, wobei der 
entsprechende Port in der grafischen Darstellung als 
"COE_OUTPUTS[0..127][31..0]" angezeigt wird.

Im nächsten Schritt wandle ich das BDF wieder in ein VHDL-File, um es im 
SOPC-Builder einzubinden (File->Create/Update->Create HDL design file 
for current file). Im generierten VHDL-File erscheint der Port nun in 
folgender Form:
1
COE_OUTPUTS : OUT STD_LOGIC_VECTOR(0 TO 127 , 31 DOWNTO 0)

Diese Schreibweise bemängelt mir der Syntax-Check beim Erstellen einer 
SOPC-Komponente mit der Fehlermeldung:

> Error: VHDL Indexed Name error at slave.vhd(53): array type "std_logic_vector" 
expects 1 index arguments File: d:/sopc/slave/slave.vhd Line: 53

Vielleicht hat mir jemand einen Tipp, warum beim Umwandeln des BDF-Files 
"ungültiger" VHDL-Code erzeugt wird, und wie ich das umgehen kann.

Peter

von Duke Scarring (Gast)


Lesenswert?

Peter Z. schrieb:
> COE_OUTPUTS : OUT STD_LOGIC_VECTOR(0 TO 127 , 31 DOWNTO 0)
Du willst, daß Deine Komponente 32 * 128 = 4096 Ausgangsleitungen hat?

> Diese Schreibweise bemängelt mir der Syntax-Check beim Erstellen einer
> SOPC-Komponente mit der Fehlermeldung:
>
>> Error: VHDL Indexed Name error at slave.vhd(53): array type "std_logic_vector"
> expects 1 index arguments File: d:/sopc/slave/slave.vhd Line: 53
>
Da wird ein eindimensionales Array erwartet. Du erstellst ein 
zweidinemsionales VHDL-Array.

> Vielleicht hat mir jemand einen Tipp, warum beim Umwandeln des BDF-Files
> "ungültiger" VHDL-Code erzeugt wird, und wie ich das umgehen kann.
Das ist kein ungültiger VHDL-Code. Aber Dein Tool kommt mit dem 
Konstrukt offenbar nicht so richtig klar.

Duke

von Peter Z. (starkstrompeter)


Lesenswert?

Danke für die Antwort!

> Du willst, daß Deine Komponente 32 * 128 = 4096 Ausgangsleitungen hat?

Nur im Extremfall :-) Das ganze soll eine allgemeine 
Avalon-Slave-Komponente werden, welche bis zu 128 Register als Eingänge 
und Ausgänge bereitstellt (also den kompletten vorgesehenen Adressraum). 
Im Normalfall werde ich davon nur einzelne nutzen, womit die Synthese 
hoffentlich sämtliche unnötigen Register eliminiert.

> Das ist kein ungültiger VHDL-Code. Aber Dein Tool kommt mit dem
> Konstrukt offenbar nicht so richtig klar.

Hm, gibt es da irgendeine Möglichkeit, Quartus zweidimensionale Arrays 
innerhalb eines Ports doch schmackhaft zu machen, oder muss ich darauf 
verzichten? Scheint ja nur ein Problem der Schreibweise zu sein, aber 
auf die habe ich bei einem automatisch generierten VHDL-File leider 
keinen Einfluss.

Peter

von Osterhase (Gast)


Lesenswert?

Warum erzeugst Du eigentlich aus dem VHDL Code ein .bdf und dann aus dem 
.bdf VHDL Code?
>Im Normalfall werde ich davon nur einzelne nutzen, womit die Synthese
>hoffentlich sämtliche unnötigen Register eliminiert.
Da würde ich die Range im generic-Teil parametrisieren. Wenn man dann 
mit dem Component Editor aus dem VHDL Code eine Komponente für den SOPC 
Builder erzeugt, kann man die Range in der GUI ändern, wenn man die 
diese Komponente zu einem SOPC System hinzufügt

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.