Forum: FPGA, VHDL & Co. Mehrdimensionales Array in VHDL


von Moritz G. (mbydq2)


Lesenswert?

Nach Recherche im Netz und Ausprobieren habe ich einen Text über Arrays 
in VHDL geschrieben. Der Text stellt meinen aktuellen Kenntnisstand dar, 
ich erhebe keinen Anspruch auf Vollständigkeit oder Richtigkeit. Bitte 
schreibt wenn etwas nicht stimmt oder Ihr etwas ergänzen möchtet. Z.B. 
habe ich nur mit einem Simulator und Synthese Programm Erfahrung.
Ich hoffe es hilft anderen in meiner Situation.

VHDL-Implementationen erlauben meist bis zu dreidimensionale Arrays von 
Basetypen wie Enumerationstypen wie std_logic. Der eindimensionale Typ 
std_logic_vector ist bereits in ieee.std_logic_1164 definiert.
Synthetisierbar sind meist nur Arrays die mit zwei Dimensionen 
deklariert wurden.
Die Deklaration von Arrays kann auf zwei Arten erfolgen:
Entweder es wird ein eindimensionales Array von einem Array deklariert 
um eine Dimension hinzuzufügen oder es wird direkt ein zweidimensionales 
Array deklariert. Wurde ein eindimensionales Array von einem Array 
deklariert so ist das unter Array nicht indizierbar, sondern muss erst 
einem Signal seines Typs zugewiesen werden bevor seine Elemente einzeln 
angesprochen werden können.
Wurden direkt zwei Dimensionen deklariert so bezeichnet ein Element 
namevonarray2D(index2, index1) wobei index2 das obere\äußere 1D Array 
indiziert und index1 das untere\innere.
Für Arrays die mehrdimensional deklariert wurden, ist es für keine 
Dimension, auch nicht die unterste \ rechtsstehende, möglich slices, 
also zusammenhängende Ausschnitte, anzusprechen, sondern nur einzelne 
Elemente.
Eine Möglichkeit Beschränkungen zu umgehen ist es sich sprachlich auf 
eine Dimension zu begrenzen und den Index als Linearkombination 
anzugeben namevonarray2D((index1'HIGH + 1)*index2 + 1*index1), dies 
entspricht namevonarray2D(index2, index1) wenn der kleinste Index 
jeweils 0 ist. Diese Variante ist flexibler, aufwändiger und 
fehleranfälliger. Soll z.B. aus einer Matrix(1. und 2. Dim.) von Werten 
(3.Dim) eine Matrix von Listen von Stellen einer bestimmten Wertigkeit 
der Werte einer Richtung der Matrix erstellt werden, so muss auf drei 
Dimensionen zugegriffen werden können.
Was simulierbar oder synthetisierbar ist, hängt vom genutzten Produkt 
ab.

Hier noch zwei Varianten um ein als 2D missbrauchten 1D Array 
umzuordnen, um andere slices nehmen zu können:
1
sMvonNvon1 ist array (M-1 downto 0) von std_logic_vector (N-1 downto 0)
2
sNvonMvon1 ist array (N-1 downto 0) von std_logic_vector (M-1 downto 0)
3
4
l_umordnen : process (MvonNvon1)
5
  variable v1vonNvon1 : std_logic_vector(N-1 downto 0);
6
  variable vNmalMvon1 : std_logic_vector(N*M-1 downto 0);
7
 begin
8
  for n in N-1  downto 0 loop
9
   for m in M-1 downto 0 loop
10
    v1vonNvon1 := sMvonNvon1(m);
11
    vNmalMvon1(M*n + m) := v1vonNvon1(n);
12
   end loop;-- M
13
   sNvonMvon1(n) <= vNmalMvon1(M*n+M-1 downto M*n);
14
  end loop;-- N
15
 end process l_umordnen;
16
17
Dies ist einfacher als mit generate:
18
19
l_gen_kopieren_i : for i in  M-1 downto 0 generate
20
  sMmalNvon1(N*i+N-1 downto N*i) <= sMvonNvon1(i);
21
 end generate l_gen_kopieren_i;
22
l_gen_drehenundgruppieren_aussen : for i in N-1 downto 0 generate
23
 l_gen_drehen_innen : for j in  M-1 downto 0 generate
24
   sNmalMvon1(N*j * 1*i) <= sMmalNvon1(1*j + M*i);
25
  end generate;
26
  sNvonMvon1(i) <= sNmalMvon1(M*i+M-1 downto M*i);
27
 end generate;

Mit generate waren zwei Zwischensignale voller größe nötig. Durch einem 
Process mit Variable werden die Signale automatisch generiert.
Es waren nur zwei for-loop nötig, aber drei generate.

[ multidimensional mehrdimensionale ]

von Edi M. (Gast)


Lesenswert?

Hättest Du auch eine Applikation für all die grossen komplexen 
Datenmengen?

(Wo) macht es Sinn, diese so anzulegen, wo ein FPGA doch meist keine 
virtuelle Datenverwaltung betreibt?

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


Lesenswert?

Moritz G. schrieb:
> Z.B. habe ich nur mit einem Simulator und Synthese Programm Erfahrung.
Du solltest bei einem solch hardwarelastigen Thema aber schon sagen, 
welche Toolchain du meinst.
> Was simulierbar oder synthetisierbar ist, hängt vom genutzten Produkt ab.
Insbesondere weil/wenn die Realisierbarkeit letztlich nur von dieser 
Toolchain (also nicht FPGA!!!) abhängt. Denn einem FPGA ist es 
schnurzegal, wie die Hardware beschrieben wurde, nur der Synthesizer 
muss damit klarkommen...

> VHDL-Implementationen erlauben meist bis zu dreidimensionale Arrays von
> Basetypen wie Enumerationstypen wie std_logic. Der eindimensionale Typ
> std_logic_vector ist bereits in ieee.std_logic_1164 definiert.
> Synthetisierbar sind meist nur Arrays die mit zwei Dimensionen
> deklariert wurden.
Also z.B. ein Array eines std_logic_vectors?
Nein, mindestens 3 sind es schon immer, denn sonst könnte man nicht mal 
einen (Bildschirm-)Speicher (x,y,vektor) anlegen...
http://www.lothar-miller.de/s9y/archives/39-Mehrdimensionale-Arrays.html
Und dann vor allem der hier:
http://www.lothar-miller.de/s9y/archives/79-use_new_parser-YES.html
Fazit: direkt 5 Dimensionen ohne Weiteres synthetisierbar.

> slices, also zusammenhängende Ausschnitte
Bei FPGAs ist der Begriff schon Slices für etwas anderes belegt: 
Xilinx User meinen damit elementare Logikblöcke innerhalb der 
FPGA-Struktur.

von Moritz G. (mbydq2)


Lesenswert?

Lothar Miller schrieb:
> Also z.B. ein Array eines std_logic_vectors?
> Nein, mindestens 3 sind es schon immer, denn sonst könnte man nicht mal
> einen (Bildschirm-)Speicher (x,y,vektor) anlegen...

Nein, ein 1D Array von std_logic_vector wäre nur 1D weil die Elemente 
des std_logic_vector so nicht adressierbar sind.

> http://www.lothar-miller.de/s9y/archives/39-Mehrdimensionale-Arrays.html
> Und dann vor allem der hier:
> http://www.lothar-miller.de/s9y/archives/79-use_new_parser-YES.html
> Fazit: direkt 5 Dimensionen ohne Weiteres synthetisierbar.

Danke

>> slices, also zusammenhängende Ausschnitte
> Bei FPGAs ist der Begriff schon Slices für etwas anderes belegt:
> Xilinx User meinen damit elementare Logikblöcke innerhalb der
> FPGA-Struktur.

ModelSim nennt meines Wissens nach Bustaps \ Untervektoren oder wie auch 
immer Sie ein "(X downto Y)" nennen so. Die Unterscheidung dürfte im 
Kontext einfach genug gewesen sein.

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


Lesenswert?

Moritz G. schrieb:
> Nein, ein 1D Array von std_logic_vector wäre nur 1D
Ein std_logic_vektor ist ein array of std_logic. Ein Array von 
std_logic_vector ist also einArray eines Arrays. Das sind m.E. 2 
Dimensionen...
> weil die Elemente des std_logic_vector so nicht adressierbar sind.
Oh, selbstverständlich sind sie adressierbar. Nur eben nicht in der 
vektor(x,y) aber durchaus ind der vektor(x)(y) Schreibweise...

> Die Unterscheidung dürfte im Kontext einfach genug gewesen sein.
Schon, aber sie wäre aber gar nicht nötig gewesen, wenn du einfach 
"Vektorabschnitt" oder sonstwie gesagt hättest....

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.