Forum: FPGA, VHDL & Co. Variabler Teilzugriff auf mehrdimensionales Array (Verilog)


von hiall (Gast)


Lesenswert?

Hallo,


Ausgangslage: ich habe ein mehrdimensionales Array reg[7:0]array[0:599]; 
bei dem ich nacheinander auf bestimmte Bereiche einzeln zugreiffen 
möchte. Nun habe ich an folgedes Kontrukt gedacht um z.B. 20 Werte zu 
extrahieren:
1
array_part<=array[variable+:20];

Nun erhalte ich von Quartus II 11.1SP2 folgenden Fehler:

"Integrated Synthesis does not support variable part-select of 
multi-dimensional arrays"

Hat jemand eine  workaround für dieses Probleme oder kann mir sontige 
Tipps geben wie ich das realisieren kann (im Hinblick darauf das die 
Anzahl der Werte parametrierbar sein soll).

Danke

von bko (Gast)


Lesenswert?

Kenne Quartuns nicht aber evtl. gehts mit verilog-2001 Schalter an ...

von hiall (Gast)


Lesenswert?

Vielleicht weiss auch jemand wie man das in VHDL handhabt und ich kann 
das dann übertragen da wäre ich auch für Vorschläge offen.

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


Lesenswert?

hiall schrieb:
> mehrdimensionales Array reg[7:0]array[0:599];
Also ein RAM mit 600 Bytes?

> Vielleicht weiss auch jemand wie man das in VHDL handhabt
Was?

> ich nacheinander auf bestimmte Bereiche einzeln zugreiffen möchte.
Gleichzeitig?

> Nun habe ich an folgedes Kontrukt gedacht um z.B. 20 Werte zu extrahieren
Was ist hier "extrahieren"?

von hiall (Gast)


Lesenswert?

Lothar Miller schrieb:
> hiall schrieb:
>> mehrdimensionales Array reg[7:0]array[0:599];
> Also ein RAM mit 600 Bytes?
>
>> Vielleicht weiss auch jemand wie man das in VHDL handhabt
> Was?
>
>> ich nacheinander auf bestimmte Bereiche einzeln zugreiffen möchte.
> Gleichzeitig?
>
>> Nun habe ich an folgedes Kontrukt gedacht um z.B. 20 Werte zu extrahieren
> Was ist hier "extrahieren"?

Also das Array ist in Hardware ja 600*8 Register wenn ich das richtig 
verstehe.
Ich möchte nun in einem Takt auf einen bestimmten Bereich des Arrays 
zugreiffen und diese Werte weiterverarbeiten. Die Anzahl soll variabel 
sein.

Verilog bietet folgendes Kontrukt array_part<=array[variable+:20]; dafür 
was aber nicht durch Quartus unterstützt wird. Wie kann ich es am 
ressourcensparenden umsetzen auf bestimmte Arrayabschnitte zuzugreiffen.

Die Werte die ich in einem Takt benötige sollten wenn möglich 
gleichzeitig zur Verfügung stehen.
Altera bietet als workaround nur an man soll statische Zugriffe wie z.B. 
array_part<=array[0+:20]; array_part<=array[20+:20]; usw verwenden.

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


Lesenswert?

hiall schrieb:
> in einem Takt auf einen bestimmten Bereich des Arrays zugreiffen
Tja, damit bringst du dein FPGA ganz hübsch zum Kotzen, denn ein RAM 
mit parallelem Zugriff gibt es nicht. Du brauchst also 4800 Flipflops 
in Slices zum Speichern deiner Information...

> Die Anzahl soll variabel sein.
Eine variable Anzahl kann es in Hardware nicht geben. Oder sollte dann 
das FPGA kurz mal umverdrahtet werden? Wenn du sowas willst, dann 
müsste das also mit Multiplexern gelöst werden. Und das gäbe m.E. einen 
Riesenmonstermegamultiplexer.

> Verilog bietet folgendes Kontrukt array_part<=array[variable+:20]; dafür
> was aber nicht durch Quartus unterstützt wird.
Verilog kann wahrscheinlich noch viel mahr, als Hardware es könnte. Dein 
Problem wird auch mit VHDL nicht besser, denn die Zielhardware bleibt 
unabhängig von der Beschreibungssprache die Gleiche.

> Altera bietet als workaround nur an man soll statische Zugriffe wie z.B.
> array_part<=array[0+:20]; array_part<=array[20+:20]; usw verwenden.
Klar, weil dieses statische Verhalten dann in statischer Verdrahtung 
resultiert.

von hiall (Gast)


Lesenswert?

oder ist die Verwendung der speziellen RAM Bausteine M9k usw angeraten 
in Verbindung mit dem Altera IP Core zu Ansteuerung dieser Blöcke?

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


Lesenswert?

hiall schrieb:
> oder ist die Verwendung der speziellen RAM Bausteine M9k usw angeraten
> in Verbindung mit dem Altera IP Core zu Ansteuerung dieser Blöcke?
Latürnich macht es Sinn, fertige interne Komponenten zu verwenden. Dann 
musst du dich allerdings von diesem parallelen Zugriff auf mehrere Worte 
verabschieden. Das kann kein RAM...

von Moritz G. (mbydq2)


Lesenswert?

hiall schrieb:

> Hat jemand eine  workaround für dieses Probleme oder kann mir sontige
> Tipps geben wie ich das realisieren kann (im Hinblick darauf das die
> Anzahl der Werte parametrierbar sein soll).

Ich kann kein verilog mehr aber das selbe Problem gibt es in VHDL.
"slices" gehen nur in 1-D.
Der Workaround ist dementsprechend nur 1-D zu nutzen.
1
NvonMvon1(n) <= NmalMvon1(M*n+M-1 downto M*n);

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.