Forum: FPGA, VHDL & Co. [VHDL] Array of Array mit dynamischer Länge


von Guest (Gast)


Lesenswert?

Hallo,

mir ist bekannt dass man in VHDL Array-Typen mit (natural range <>) 
deklarieren kann, so dass man die eigentliche Länge in der jeweiligen 
Dimension erst bei der Signal-/Variablendeklaration bestimmt.

In einer bestimmten Situation benötige ich aber Arrays aus Arrays (array 
of std_logic_vector) oder Arrays aus Integern (array of integer). 
Hierbei muss ich aber in der Typendeklaration die Länge des zugrunde 
liegenden Array Typs festsetzen, also z.B.
1
type at1 is array (natural range <>) of std_logic_vector(3 downto 0);
oder
1
type at2 is array (natural range <>) of integer range 0 to 123;

Lösbar ist dieses Problem zumindest für die std_logics mit 2D-Arrays:
1
type at3 is array (natural range <>, natural range <>) of std_logic;

Dieser Ansatz scheitert aber am Fehlen von Slices aus 2D Arrays in VHDL. 
Folgender Code funktioniert also nicht:
1
signal s1 : at3 (3 downto 0, 7 downto 0);
2
signal s2 : std_logic_vector(7 downto 0);
3
...
4
s2 <= s1(2, 7 downto 0);

Wie ist das Problem zu Lösen. Für jede benötigte Arraygröße und Range 
einen eigenen Typ anzulegen ist an der Stelle natürlich auch nicht 
praktikabel, insbesondere wenn die Dimensionen zusätzlich noch per 
Generic anpassbar sein müssen.

von Guest (Gast)


Lesenswert?

Achso noch eine kleine Anmerkung zum Thread-Titel: Natürlich ist das 
ganze nicht wirklich "dynamisch" im Sinne von "zur Laufzeit festgelegt". 
Ein besserer Begriff dafür ist mir allerdings nicht bekannt.

von Duke Scarring (Gast)


Lesenswert?

Würde es Dir helfen die Arraydimensionen in einem globalen Package zu 
deklarieren?

Duke

von Guest (Gast)


Lesenswert?

Duke Scarring schrieb:
> Würde es Dir helfen die Arraydimensionen in einem globalen Package zu
> deklarieren?

Nicht wirklich. Also ja, das tue ich bereits, allerdings beseitigt es 
nicht das Problem, für jede neue Arraygröße einen neuen Typ anlegen zu 
müssen, wenn ich dich richtig verstehe.

von Duke Scarring (Gast)


Lesenswert?

Ok. Jetzt habe ich Dein Problem verstanden (hoffentlich).

Hier könntest Du den slv so groß machen, daß alle Varianten reinpassen:
1
type at1 is array (natural range <>) of std_logic_vector(3 downto 0);
Die Synthese sollte das array dann optimieren.

Guest schrieb:
> Dieser Ansatz scheitert aber am Fehlen von Slices aus 2D Arrays in VHDL.
> Folgender Code funktioniert also nicht:
Versuch mal, Dir eine eigene Funktion für das Slicing zu schreiben.

Ein unschöner Workaraound wäre es, wenn man die Daten in einem riesigen 
eindimensionalen Vektor verwendet und mit entsprechenden Funktionen auf 
Ausschnitte zugreift.

Duke

von Christoph Z. (christophz)


Lesenswert?

Antwort 1:

Deine Wünsche sind mit VHDL-2008 in Erfüllung gegangen:
http://doulos.com/knowhow/vhdl_designers_guide/vhdl_2008/vhdl_200x_small/#composite

Wichtig: Nicht alle Tools können VHDL-2008 und es ist immer noch nicht 
absehbar wann alle Hersteller mit der Umsetzung fertig sind (bzw. 
beginnen).


Antwort 2:

Wie Duke schon schreibt verwende auch ich gerne Konstanten in einem 
Package um die Typ definitionen zu vereinfachen.

Das Problem mit den Fehlenden std_logic_vector-Slices aus einem 2D 
std_logic Array kann man Lösen wenn man dazu eine function() schreibt.
Das Array und der Index der 1. Dimension als Eingang, Als Rückgabewert 
dann der Vektor der 2. Dimension. Die Funktion besteht eigentlich nur 
aus einer for...loop und lässt sich auch syntetisieren.

von Guest (Gast)


Lesenswert?

Christoph Z. schrieb:
> Antwort 1:
>
> Deine Wünsche sind mit VHDL-2008 in Erfüllung gegangen:
> 
http://doulos.com/knowhow/vhdl_designers_guide/vhdl_2008/vhdl_200x_small/#composite
>
> Wichtig: Nicht alle Tools können VHDL-2008 und es ist immer noch nicht
> absehbar wann alle Hersteller mit der Umsetzung fertig sind (bzw.
> beginnen).

Das ist eine super Information, vielen Dank dafür! Leider scheint die 
ISE (xst) nichtmal VHDL 2002 zu unterstützen, nichtmal Vivado kann 2008.

Christoph Z. schrieb:
> Wie Duke schon schreibt verwende auch ich gerne Konstanten in einem
> Package um die Typ definitionen zu vereinfachen.

Wie gesagt, das tue ich auch schon. In einem aktuellen Projekt benötige 
ich aber viele unterschiedliche Größen, wodurch diese Idee 
unübersichtlich wird.

Christoph Z. schrieb:
> Das Problem mit den Fehlenden std_logic_vector-Slices aus einem 2D
> std_logic Array kann man Lösen wenn man dazu eine function() schreibt.
> Das Array und der Index der 1. Dimension als Eingang, Als Rückgabewert
> dann der Vektor der 2. Dimension. Die Funktion besteht eigentlich nur
> aus einer for...loop und lässt sich auch syntetisieren.

Ja stimmt schon, daran habe ich mich auch schon versucht, fand die 
Lösung aber nicht schön. Man müsste hier einen sehr langen Vektor 
zurückgeben und dann für Zuweisungen daraus slices bilden. Aus Integern 
müsste ich (un)signed machen. Ich denke das versuche ich nochmal, danke!

von Guest (Gast)


Lesenswert?

Duke Scarring schrieb:
> Ein unschöner Workaraound wäre es, wenn man die Daten in einem riesigen
> eindimensionalen Vektor verwendet und mit entsprechenden Funktionen auf
> Ausschnitte zugreift.

Das erzeugt aber Probleme bei Integer/(un)signed Typen.

Duke Scarring schrieb:
> Die Synthese sollte das array dann optimieren.

Daran habe ich auch schon gedacht. Ich habe aber Angst dass die 
Optimierung bei Integer und (un)signed Typen nicht korrekt arbeitet, da 
der Maximalwert ja mehr oder weniger versteckt ist.

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.