www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Speicheroptimierung


Autor: Artur (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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) ?

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: lukas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.