Forum: FPGA, VHDL & Co. VHDL: Altera lpm_ram benutzen unter Quartus 2 3.0 ?


von Henrik (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leser des Forums,

ich lerne gerade VHDL mit Quartus 2 von Altera. Für ein kleines,
theoretisches, Projekt möchte ich die lpm_ram_io-Funktion benutzen, um
auf den Speicher eines APEX20KC zuzugreifen. Den Code findet ihr im
Anhang. Compilieren lässt er sich, nur bei der Simulation mittels
Waveform-Diagramm kommt Schwachsinn raus. Ich kann weder in den
Speicher schreiben noch auslesen, obwohl laut Compilerreport die
entsprechenden Speicherzellen reserviert wurden. Was mache ich falsch?
Liegts am Code oder Simuliere ich falsch?

Danke, Henrik

von xman (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Henrik

Deine Zuweisungen, wie Adressen. und Daten-Breite, funktionieren nicht,
diese musst du mit einem "generic map" festlegen. Am besten siehst du
dier dazu den Anhang an. Zudem solltest du dir die neuste Version vom
Quartus besorgen.

gruss xman

von Henrik (Gast)


Angehängte Dateien:

Lesenswert?

@xman:
Ersmal Danke. Die "Generic Map"-Zuweisung hat gut funktioniert, löste
aber leider mein Problem nicht. Ich habe den Quellcode geändert,
Compiliert und Simuliert. Das Ergebniss der Simulation war leider das
Gleiche wie vorher. Siehe Screenshot im Anhang und der der komplette
Code. Es gab noch eine Warnung: "Converted TRI buffer to OR Gate or
removed OPNDRN". Ich weis aber nicht, wie ich die enfernen kann.
Meine Version von Quartus habe ich erst vor 3 Wochen runtergeladen.
(Gibts wieder ne neue?)

Gruss Henrik

von Henrik (Gast)


Angehängte Dateien:

Lesenswert?

Sorry, fehler beim Upload, hier der Screenshot...

von Henrik (Gast)


Angehängte Dateien:

Lesenswert?

und der neue Code.

von xman (Gast)


Lesenswert?

Ich war da mit meiner Behauptung ein bisschen voreilig. Man kann
anscheinent die Grössen in der Dekleration festlegen, mir ist das neu.

Das Problem in deinem Code liegt an dieser Stelle:
  data<=dat_sig when(Enabled='1') else "ZZZZ";
Welchen Wert hat data_sig beim schreiben? Diese Zeile kannst du
weglassen, das Ram mach das intern schon richtig.
Die Altera FPGA's kennen elektrisch keinen hochohmigen Zustand
(intern), alle mehrfachen Zuweisungen werden über Multiplexer
implementiert. Daher wird vermutlich in der Simulation auch der Zweite
Bus dargestellt. Da du keine Mehrfachzuweisung machst, kommt beim
Fitten die Warnung.

gruss xman

von Henrik (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe es zuerst auch ohne diese Zeile versucht, so stand es auch in
einem Beispielcode (für MAX2..) aus den Internet. Das Schreiben ins Ram
funktionert ganz gut damit, nur das Auslesen nicht (siehe Bild). Da wo
der rote Kreis ist, sollte doch eigendlich auch "0A" stehen, also
genau das, was auf "data~result" steht. Oder interpretiere ich das
falsch?. Ich nehme an, das ich an "data" keine Daten auslesen kann,
weil dieser nur hochohmig ist.
Ich habe es auch schon über Signale versucht, führte aber auch nicht
zum gewünschten Ergebniss. Entweder mache ich etwas falsch, oder ich
interpretiere das Diagramm falsch. Die Lösung kann nur recht simpel
sein, aber komme einfach nicht drauf.

Gruss Henrik

von Henrik (Gast)


Angehängte Dateien:

Lesenswert?

Hier der Beispielcode aus dem Netz für MAXPlUS, unterscheidet sich
eigendlich nicht von dem, den ich ausprobiert habe.

von xman (Gast)


Lesenswert?

Es ist ein bisschen verwirrend. Um die Ausgabe der Simulation verstehen
zu können, musst du auch wissen wie inout Busse im FPGA implementiert
werden. Angenommen, wenn der Fitter nur ein Bus für inout
implementieren würde, hätte man mehr als einen Treiber der auf den Bus
schreibt. Die Folge währe, dass beim schreiben, alle anderen Treiber in
den Hochohmigen Zustand geschaltet werden müssten. Das geht aber bei
den Altera FPGA's intern nicht (bei den Pins sieht das natürlich
anders aus). Daher werden die inout Busse immer mindestens als zwei
Leitungspaaren implementiert, in deinem Beispiel als data und
data~result. Wenn du also einem Bus 'Z' zuweist, wird nichts in den
hochohmigen Zustand geschaltet, es wird nur der Multiplexer
umgeschaltet. Dein Beispiel funktioniert also, die Busse data und
data~result werden bei der Zuweisung an einen bidirektionalen Pin
wieder zusammengefasst. Probiere doch mal den Datenbus als, einen In.
und einen Out-Bus zu implementieren, das Ergebnis der Simulation sollte
das gleiche sein.

Gruss xman

von Henrik (Gast)


Lesenswert?

Danke xman, hat funktioniert. Nun gehts weiter, bis Anfang des Semesters
möchte ich in VHDL und Quartus fit sein ;-)

Henrik

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.