VHDL: Altera lpm_ram benutzen unter Quartus 2 3.0 ?

Gast #84185
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
Angehängte Dateien:
Gast #84187
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
Angehängte Dateien:
Gast #84190
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
Gast #84191
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
Angehängte Dateien:
Gast #84193
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren