www.mikrocontroller.net

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


Autor: Henrik (Gast)
Datum:
Angehängte Dateien:

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

Autor: xman (Gast)
Datum:
Angehängte Dateien:

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

Autor: Henrik (Gast)
Datum:
Angehängte Dateien:

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

Autor: Henrik (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, fehler beim Upload, hier der Screenshot...

Autor: Henrik (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
und der neue Code.

Autor: xman (Gast)
Datum:

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

Autor: Henrik (Gast)
Datum:
Angehängte Dateien:

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

Autor: Henrik (Gast)
Datum:
Angehängte Dateien:

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

Autor: xman (Gast)
Datum:

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

Autor: Henrik (Gast)
Datum:

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

Henrik

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.