Forum: FPGA, VHDL & Co. RAM Speicher im FPGA (Cyclone iV) mit Quartus 2


von Ben C. (bencharmin)


Lesenswert?

Hallo.
Kann mir jemand sagen, wie ich den im Cyclone IV integrierten "Embedded 
Block RAM" ansprechen kann?

Ich möchte z.B. einen Wert auf einen Speicherblock schreiben und ihn 
später wieder auslesen. Wie geht das?

Beste Grüße

von Uwe (Gast)


Lesenswert?

> Ich möchte z.B. einen Wert auf einen Speicherblock schreiben

Sicher das DU den Beschreiben möchtest ? Was hast du denn für 
Spannungspegel LVTTL ?
Ne mal ernst von wo aus möchtest du den BRAM ansprechen. Man kann einen 
BRAM explizit Instantiieren. Man kann aber auch einfach die Option 
einschalten das BRAM benutzt werden sollen (die ist aber glaube ich 
standardmäßig an).
Wenn die Synthesetools "denken" das passt ganz gut in ein BRAM dann 
machen sie das auch da rein.
ALso von wo willst du das BRAM ansprechen von einer FSM oder von 
außerhalb oder von innen und aussen als Dual Ported RAM. Viele viele 
Fragen ...

von Uwe (Gast)


Lesenswert?

Die Antwort kann auch ganz kurz ausfallen : So wie du es willst !

von Ben C. (bencharmin)


Lesenswert?

Hallo Uwe,
ich habe eine bzw. mehrere state machines in vhdl. In einem Zustand soll 
ein Wert bzw. eine Bitfolge in dem RAM-Speicher abgelegt werden und in 
einer x-beliebigen anderen state machine in ingendeinem zustand wieder 
ausgelesen oder/und ggf überschrieben werden.

: Bearbeitet durch User
von Uwe (Gast)


Lesenswert?

Warum soll es ein BRAM sein wenn es nur EIN Wert ist.
Wenn du mehrere Werte speichern willst könnte es sinn machen, dann 
braucht deine Statemachine aber einen Adressbus um zu entscheiden wohin 
der Wert soll, bzw. von wo der Wert gelesen werden soll (von welcher 
Adresse).
Wenn man da so macht sollte Quartus das von alleine erkennen und dort 
ein BRAM benutzen.
Ansonsten kann man es auch per Hand Instantiieren oder den Wizard 
benutzen :
http://www.altera.com/literature/ug/ug_ram_rom.pdf

von Ben C. (bencharmin)


Lesenswert?

naja es soll ja nicht nur um einen wert gehen, sondern um mehrere. aber 
wenn ich das grundprinzip weiß, wie man einen wert oder eine Bitfolge 
mit zb 12 bits im ram ablegt, dann kann ich es bestimmt auch auf mehrere 
werte/Bitfolgen anwenden.

kann mir jemand ein paar zeilen vhdl code schreiben, wie ich etwas in 
den ram speichere (auf eine bestimmte Adresse?) und ich es wieder lese.

wenn zb "bitfolge12" ein Signal ist mache ich das ja normal so:

bitfolge12 <= "001110100011";

diese Bitfolge ist jetzt ja aber nur lokal in dem jeweilen vhdl-block 
gespeichert. wenn ich genau diese folge jetzt in einem anderen block in 
irgendeinem state verwerden möchte, so muss ich Verbindungen ziehen und 
immer mit in und out arbeiten. ist es da nicht einfacher die Bitfolge in 
einen gewissen speicher zu klatschen und ihn irgendwann wieder 
rauszuholen??

von Walt (Gast)


Lesenswert?

Hi Ben

Schau dir doch mal das Dokument "RAM Megafunction User Guide" von Altera 
an. Da findest du alle Informationen, die du brauchst. Das RAM kannst du 
im Quartus mittels MegaWizard generieren. Die Ansteuerung ist dann ganz 
einfach.

Gruss
Walt

von Mike (Gast)


Lesenswert?

Falls du keinen Altera-spezifischen Speicher haben möchtest, dann kann 
du auch eins der Templates verwenden (über File -> New -> Insert 
Template). Alternativ kannst du auch ins Handbuch schauen. Dort gibt es 
ein Kapitel "Inferring RAM functions from HDL Code". Wenn du den 
Speicher so wie dort beschrieben definierst, dann übersetzt Quartus das 
automatisch in eine passende Anzahl Blockrams.

Den Speicher zu benutzen ist eigentlich recht einfach: Adresse anlegen 
und einen Takt später sind die Daten am Ausgang. Schreiben fast genauso: 
Adresse+Daten+Write enable anlegen...

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


Lesenswert?

Mike schrieb:
> Falls du keinen Altera-spezifischen Speicher haben möchtest, dann kann
> du auch eins der Templates verwenden (über File -> New -> Insert
> Template).
Das würde ich machen, denn dann ist die Beschreibung universell 
einsetzbar und portabel. Wegen eines schnöden RAMs gleich einen Core zu 
instantiieren, das ist, wie wenn du zum Auf- und Zudrehen des 
Wasserhahns den Installateur holst...

> ein Kapitel "Inferring RAM functions from HDL Code".
Und das ist auch ganz ineressant:
https://www.google.de/search?q=quartus+synthesis+guide
Beitrag "Re: Quartusrichtlinien für Procedure"
Wenn dann noch ein Blick über den Tellerrand hinaus gemacht wird, dann 
ist die gefundene Lösung problemlos portierbar: 
http://www.lothar-miller.de/s9y/archives/20-RAM.html

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.