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


von TheMason (Gast)


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ß

von Tobias (Gast)


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.

von FPGA-User (Gast)


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 !

von TheMason (Gast)


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

von TheMason (Gast)


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

von Michael Noll (Gast)


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

von TheMason (Gast)


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ß

von Michael Noll (Gast)


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

von Michael Noll (Gast)


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 ...

von FPGA-User (Gast)


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.

von Jochen Pernsteiner (Gast)


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.

von TheMason (Gast)


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.

von Michael Noll (Gast)


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/CFD5315B106306F379B36F9A8BB16B08.htm
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.

von TheMason (Gast)


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.

von TheMason (Gast)


Angehängte Dateien:

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.

von Hannes Hering (Gast)


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).

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.