Forum: FPGA, VHDL & Co. Speicheroptimierung


von Artur (Gast)


Lesenswert?

Hallo
ich bin beschäftige mich garde mit VHDL und Quartus und komme jetzt zu 
einem Speicherplatzproblem. dabei summiere ich immer wieder neue Werte 
auf ein Signal , dass ich dann ausgebe. dabei gehen die Ergebnisse aber 
auf die logischen Elemente  ( total logical elements; Größe 33216 ) 
während total memory Bits leer bleibt ( Größe 483840 ), wie kann ich 
aktuelle Werte hier speichern ( und mir zurückholen) ?

von Klaus F. (kfalser)


Lesenswert?

Vielleicht solltest Du Dir zuerst die Unterschiede zwischen einem FGPA 
und einem Prozessor klarmachen.
Speicherelemente im FPGA sind etwas anderes als der Speicher im 
Prozessor und wird üblicherweise nicht zum Abspeichern vom 
Zwischenergenissen verwendet.

Zeig eventuell ein bischen von Deinem Code, dann kann Dir besser 
geholfen werden.

von lukas (Gast)


Lesenswert?

case zaehler is
WHEN 0 => ausgangimag0 <=ausgangimag0 + resultim;ausgang2 <= 
ausgangimag0;
WHEN 1 => ausgangimag1 <=ausgangimag1 + resultim;ausgang2 <= 
ausgangimag1;
WHEN 2 => ausgangimag2 <=ausgangimag2 + resultim;ausgang2 <= 
ausgangimag2;
WHEN 3 => ausgangimag3 <=ausgangimag3 + resultim;ausgang2 <= 
ausgangimag3;
WHEN 4 => ausgangimag4 <=ausgangimag4 + resultim;ausgang2 <= 
ausgangimag4;
WHEN 5 => ausgangimag5 <=ausgangimag5 + resultim;ausgang2 <= 
ausgangimag5;
WHEN 6 => ausgangimag6 <=ausgangimag6 + resultim;ausgang2 <= 
ausgangimag6;
WHEN 7 => ausgangimag7 <=ausgangimag7 + resultim;ausgang2 <= 
ausgangimag7;
WHEN 8 => ausgangimag8 <=ausgangimag8 + resultim;ausgang2 <= 
ausgangimag8;
WHEN 9 => ausgangimag9 <=ausgangimag9 + resultim;ausgang2 <= 
ausgangimag9;
WHEN 10 => ausgangimag10 <=ausgangimag10 + resultim;ausgang2 <= 
ausgangimag10;
WHEN 11 => ausgangimag11 <=ausgangimag11 + resultim;ausgang2 <= 
ausgangimag11;
WHEN 12 => ausgangimag12 <=ausgangimag12 + resultim;ausgang2 <= 
ausgangimag12;
WHEN 13 => ausgangimag13 <=ausgangimag13 + resultim;ausgang2 <= 
ausgangimag13;
WHEN 14 => ausgangimag14 <=ausgangimag14 + resultim;ausgang2 <= 
ausgangimag14;
WHEN 15 => ausgangimag15 <=ausgangimag15 + resultim;ausgang2 <= 
ausgangimag15;
WHEN 16 => ausgangimag16 <=ausgangimag16 + resultim;ausgang2 <= 
ausgangimag16;
WHEN 17 => ausgangimag17 <=ausgangimag17 + resultim;ausgang2 <= 
ausgangimag17;
WHEN 18 => ausgangimag18 <=ausgangimag18 + resultim;ausgang2 <= 
ausgangimag18;
..........
usw ich hab insgesamt etwa 1000 Werte wie ausgangimagX zum Zwischen 
speichern

von Klaus F. (kfalser)


Lesenswert?

2 Anmerkungen :
a) Es gibt auch in VHDL arrays, sodass man schreiben kann :
ausgangimag[zaehler] <= ausgangimag[zaehler] + resulttim;

Wenn ausgangimag vom Typ std_logic_vector ist oder unsigned ist, dann 
ist es vielleicht ein bischen komplizierter, weil man eine zusätzlichen 
Type definieren muss, aber es geht.

b) Man kann diese ganzen Zählvariablen unter Umständen schon in eine 
Speicherelement des FPGAs legen (bei Altera kenne ich mich nicht aus, 
aber bei Xilinx heißt das BlockRAM), aber das hängt von ein paar 
Bedingungen ab.
- Das was Du geschrieben hast, ist einen Anzahl von getrennten Zähler.
Jeder Zähler enthält eine Additionseinheit, sodass Du 1000 Zähler, 1000 
Adder usw. gleichzeitig im FPGA hast. Jeder Zähler ins unabhängig, 
sodass allle im Prinzip gleichzeitig zählen könnten, aber nur 1 Zähler 
wird jeweils aktiv.
Damit kann man mit jedem Taktzyklus einen anderen Zähler ein- und 
ausschalten.
- Die Speicher-Komponenten sind wie der Name sagt, Speicher. Diese 
können nicht einfach so aktualisiert werden, sondern man muss den Wert 
zuert aus dem Speicher holen, bearbeiten ( = inkrementieren) und 
zurückschreiben. Das geht nicht in einem einzelen Taktzylus.
Als Vorteil hast Du aber nicht mehr 1000 Additionseinheiten, sondern nur 
mehr eine.
Schau Dir einmal diese Blockrams (oder wie sie unter Altera heißen) an.

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.