www.mikrocontroller.net

Forum: FPGA, VHDL & Co. SRAM beschreiben und auslesen


Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab das Spartan3 Starter Board und habe folgendes Problem.
Ich möchte das angeschlossene RAM ansteuern.
Hab mir auch einen kleinen VHDL-Code zusammengeschrieben mit dem man
eine Adresse und ein Datenwort erzeugen kann. (Quellcode folgt später,
da ich ihn im Moment nicht zur Hand habe).
Dieser Code funktioniert einwandfrei.
Mein Problem ist das Beschreiben bzw. Auslesen des RAMS nicht richtig
funktioniert.
Habe mir für das Schreiben und Lesen eine State-Machine gebaut die mit
dem Quarz (50 MHz) läuft.

Beim Schreiben mache ich folgendes :

Zustand 1 :
  OE des RAMS auf 1
  CE   "  "   auf 0
  WE   "  "   auf 0
  Datenbus mit Datenwort besetzen
  Adressbus setzen
  Zustand = 2

Zustand 2 :
  CE des RAMS auf 1
  Zustand = 3

Zustand 3:
  CE des RAMS auf 0
  Datenbus hochohmig (also Z) setzen
  Zustand = 0 (idle)

Beim Lesen passiert folgendes

Zustand 1 :
  OE des RAMS auf 0
  CE   "  "   auf 0
  WE   "  "   auf 1
  Datenbus hochohmig (also Z) setzen
  Adressbus setzen
  Zustand = 2

Zustand 2 :
  CE des RAMS auf 1
  Zustand = 3

Zustand 3:
  CE des RAMS auf 0
  Datenwort am Datenbus einlesen
  Zustand = 0 (idle)

Mein Problem ist das das Auslesen mit immer FF zurückliefert.
Wie gesagt den Quellcode schicke ich noch nach. Nur ich komm bei diesem
Problem einfach nicht weiter.

Gruß

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hatte das selbe Problem mit dem Spartan 3 Starter Kit. Hast du die
drei Jumper auf dem Board M0, M1, M2 auf den Wert 101 gesetzt, falls du
du mit JTAG Kabel programmierst? BZW. messe mal ob das Pin OE eine
physische Verbindung zum RAM hat. Mein erstes Board war deswegen
nämlich defekt.

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simuliere doch mal das ganze im ModelSim und
vergleich die Waves mit den Timing-Diagrammen
des RAMs (Datenblatt). Ist das alles OK?
CE ist ja meistens Lo-aktiv, deswegen wundert
mich die 0-1-0-Folge beim CE etwas.
Sind alle Setup- und Hold-Zeiten eingehalten?
Gib mal den RAM-Typ an und mach einen Screenshot
vom Modelsim-Wave-Fenster, jeweils für einen
Write- und Read-Zyklus !

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah Danke. Werd die Verbindung zwischen OE und RAM (wenn ich denn da dran
komme ;-)) messen.
Aber direkt noch mal ne Frage zum programmieren. Da ich erst am
Wochenende mit dem Board angefangen habe und die ganze Umgebung noch
etwas groß ist, habe ich bis jetzt nur die Möglichkeit gefunden das
Platform Flash über iMPACT zu programmieren. Gibt es nicht auch eine
Möglichkeit das .bit File direkt in den FPGA zu pusten ?
Wäre praktischer und schneller.
Sorry für diese einfache Frage, aber es fiel mir gerade eben ein als du
die M0-M2 Jumper erwähntest :-)

Aber vom Prinzip her müsste meine Statemachine doch funktionieren oder
?! Jedenfalls ist es ja nix wildes was da von statten geht.


Gruß
Rene

PS. Vielen dank für die schnelle Antwort

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Simulation hab ich mir der Einfachheit halber geklemmt.
Das ganze ist lediglich eine Statemachine mit 6 Zuständen (7 wenn man
Idle hinzurechnet).
Die Timings dürften unkritisch sein, da das RAM ein 10ns RAM ist und
der Quarz mit 50MHz (also 20 ns) läuft. Ausserdem dauert ja ein
Schreib/Lesezugriff insgesamt 60ns (3 Zustände * 20 ns).
Die Leitung CE ist laut Anleitung High-Aktiv (hat mich auch etwas
gewundert, aber OE und WE sind Low-Aktiv). Von daher müsste es
stimmen.
Ich werd euch aber den Code mal zuschicken (wahrscheinlich erst heut
Nachmittag)

Gruß
Rene

Autor: Michael Noll (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

imho ist deine Statemachine ein bischen falsch.

muesste so gehen:
In den SRAM schreiben
Z1: OE <= 1
    CE <= 1
    WE <= 1
    Daten- und Adressbus setzen
    -> Z2

Z2: OE <= 1
    CE <= 1
    WE <= 0
    -> Z3

Z3: OE <= 1
    WE <= 1  ,CE ( je nach Belieben 1 oder 0 )

Aus dem SRAM lesen:
Z1: siehe oben, jedoch Datenbus hochohmig

Z2: OE <= 0
    CE <= 1
    WE <= 1
    Datum vom Bus in Register (tmp-signal) speichern
     -> Z3

Z3: siehe oben

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versteh ich nicht so ganz. Löst nicht CE den Schreib bzw. Lese vorgang
aus ? (jedenfalls hab ich das so immer verstanden, das CS bzw. CE immer
eine Aktion auslöst, egal ob irgendwelche Peripherie oder RAM)

Gruß

Autor: Michael Noll (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CE steht fuer ChipEnable bzw CS fuer ChipSelect.
Damit bringst du deine Komponente aus dem Standby in den Aktiven
Zustand.

um eine "Aktion auszuloesen" sind die Signale WE bzw OE fuer
zustaendig.
Deine Datenblaetter sollten genau das wiedergeben.

Gruss

Autor: Michael Noll (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

es dauert eine Weile den Chip aus dem Standby wieder "hochzufahren"
und das sind bestimmt mehr als 60ns ... genau deshalb hast du auch nie
was in den Speicher geschrieben bzw. davon was gelesen ...

Autor: FPGA-User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tip:

ohne Simulation kann man beim kleinsten Design
voll daneben liegen. Und 10ns-Typ ist erstmal
nur ein Anhaltspunkt. Was meinst Du denn, wie
lange es dauert, bis Deine Adresse bzw. Daten
auf dem Bus sind ? Da können schnell mal zusätzliche
10 ns weg sein, und beim Lesen ist die Setup-Zeit
zu beachten, vielleicht auch > 5 ns...
Wenn keine IOB-Register verwendet werden, sind
die Zeiten noch länger.

In den Waves des ModelSim sehe ich die Fehler
jedenfalls viel schneller, als beim Lesen des
VHDL-Codes.

Autor: Jochen Pernsteiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ TheMason:

>Die Leitung CE ist laut Anleitung High-Aktiv

CE ist low-aktiv. Garantiert. Steht im Starterkit-Handbuch und im
Datenblatt des SRAMs.
Keine Ahnung was Du für eine Anleitung hast.


@ Michael Noll:

>es dauert eine Weile den Chip aus dem Standby wieder "hochzufahren"
>und das sind bestimmt mehr als 60ns

Bei einem asynchrones SRAM fährt gar nichts hoch.
Das ist einfach nur ein riesiges Array aus Latches mit einem
Adressdekoder vorne dran.
Die Zeiten nach dem man CE auf Low legt und man lesen und schreiben
kann liegen bei diesem SRAM bei 10 ns.

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@fpga-user :

mmh da gebe ich dir recht. werde mal versuchen das timing langsamer zu
machen (so 1 us). mit der simulation werd ich mich später noch
beschäftigen. mir geht es erstmal darum einen einstieg zu finden, und
wenn ich z.b. das 7 Segment-Display ansteuern möchte oder einfach nur
den Master-Clock runterteilen möchte ist eine Simulation nicht wirklich
notwendig. Und beim Ansteuern des RAMs braucht man (wenn man das dingen
nicht gerade wirklich am maximum betreibt) das ja auch nicht wirklich.
aber danke trotzdem für die tipps. mit den iobs wusste ich auch noch
nicht.

@jochen :

Hab nur in der Anleitung zum Starter-Kit geguckt. und da steht
oe# - Output Enable
we# - Write Enable
ce - Chip Enable
lb - Lower Byte
ub - Upper Byte

Hab einfach nur wegen dem # auf invertiert geschlossen. Folglich müsste
CE also High-Aktiv sein. (wundert mich aber trotzdem, da ich
gefühlsmässig sagen würde CE ist Low-Aktiv).
Genaue Daten zu den RAMs hab ich der Starter-Kit Anleitung nicht
entnehmen können (oder nicht gefunden). Werd mir mal das Datenblatt aus
dem Netz laden.

@michael

Bin mir auch recht sicher das CE nicht heißt das der Chip aus dem
Standby hochfährt. RAMs haben i.d.R. kein Power-Managment (und das
würde ja eher auf einen Standby-Modus schließen).
Für mich ist CE immer noch dasselbe wie CS (nur halt eine andere
Bezeichnung). Die Bezeichnung CE findet man ja auch bei der ganzen
alten Peripherie, und die hatte mit Standby ja noch gar nichts anner
Mütze :-))

Danke für die vielen Infos. Werde mit Sicherheit noch einige Fragen
stellen. Hier gibts ja echt super-kompetente Leute die auch recht
schnell antworten :-)) Danke Jungs.

Autor: Michael Noll (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CE = aktiv ansonsten hochohmig, bei allen aktuellen Chips auch
gleichzeitig stromsparen ... das ist fuer mich standby ;-)

siehe datenblatt fuer einen SRAM hier:
http://www.chipcatalog.com/Datasheet/CFD5315B10630...
siehe seite 2 Tabelle oben bzw. Seite 3 Tabelle oben

das der vllt doch nicht so lange braucht um auf eine CE-Aenderung zu
reagieren ist wohl ein Irrtum meinerseits ... naja hatte mit SRAMs
jetzt lange Zeit nix zu tun.

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@martin

hey cool. wusste ich auch noch nicht das die bei hochohmigkeit in
standby gehen. coool :-)
danke für die info. (bin bei meinen experimenten zwar immer eine
stromschleuder, da power management noch nie meine stärke war ggg
aber vllt bau ich mal irgendwann sowas ein).

hoffe das ich das problem mit dem Ram gelöst bekomme (nach möglichkeit
auch ohne simulation, da ich mich erst noch in modelsim einarbeiten muß
:-((, aber da komme ich über kurz oder lang eh nicht drum herum)
man möchte sich diese gigantischen speichermengen gg ja auch mal
zunutze machen, vor allem bei soviel speed von den fpgas.

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

Bewertung
0 lesenswert
nicht lesenswert
Aus Nachmittag ist nun Abend geworden ....

Das ZIP File enthält alles notwendige incl. npl + ucf fürs Starter Kit.
Zum simulieren bin ich noch nicht gekommen.

Autor: Hannes Hering (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Michael Noll:
Bei "aktuellen Chips" ist der stationäre Zustand so gut wie immer der
"Stromspar" Zustand, weil die meisten Logik-Chips in CMOS-Technik
aufgebaut sind. Der einzige Strom, der verbraten wird, wenn man die
/CE-Leitung auf 0 setzt ist der Leckstrom, der zusätzlich in die
/CE-Leitung reinfließt (oder aus ihr raus).

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.