Hallo an Alle,
für mein kleines CPLD-Projekt brauche ich ein Interface für ein SRAM
128K*8Bit.
Das Interface hat einen internen Adresscounter, der über ein Clock
Leitung sowei Reset gesteuert wird. Auserdem gibt es eine Leitung, die
bestimmt, ob vom Ram gelesen oder ins Ram geschrieben werden soll. Das
Interface soll einen Dateneingang und einen Datenausgang haben ( also
nicht Tri-State ).
Hier mein erster Entwurf, vielleicht kann mir jemand sagen, ob es so
gehen könnte:
Das mit dem Einprozessmodell hast du offenbar extrem weit gefasst :-/
Es ist nicht "State of the Art", einen getakteten und einen
kombinatorischen Teil zusammen in einen Prozess zu packen. Du wirst
daran später sicher noch deine Freude haben. Nur mal angenommen, du
änderst irgendwann was, machst die Änderungen wieder raus und bekommst
sowas:
dataOut<=ramData;-- Daten vom Ram auf Interface output
15
else-- Daten in Ram schreiben
16
ramNOE<='1';-- Ram Ausgang ausschalten
17
ramNWE<='0';-- Ram write enable
18
ramData<=dataIn;-- Daten vom Interface ins RAM schreiben
19
endif;
20
endif;
21
endprocessEinProzessModell;
Na, siehst du den Fehler auf Anhieb?
Das Ein-, Zwei- usw. Modell gilt ugs. nur für State-Machines, nicht für
allgemeine Beschreibungen ;-)
Schreibs besser so:
dataOut<=ramData;-- Daten vom Ram auf Interface output
21
else-- Daten in Ram schreiben
22
ramNOE<='1';-- Ram Ausgang ausschalten
23
ramNWE<='0';-- Ram write enable
24
ramData<=dataIn;-- Daten vom Interface ins RAM schreiben
25
endif;
26
endprocess;
BTW:
Du solltest das Datenblatt deines SRAMs mal genau anschauen, ob du nach
einem Schreibzugriff sofort wieder lesen darfst. Da gibt es durchaus
Einschränkungen :-o
>Na, siehst du den Fehler auf Anhieb?
Ich vermute Du meinst die Empfindlichkeitsliste?
>Du solltest das Datenblatt deines SRAMs mal genau anschauen, ob du nach>einem Schreibzugriff sofort wieder lesen darfst.
Ein wenig problematisch ist meine Implementierung wahrscheinlich schon.
Bei den SRAMs wird das Schreiben normalerweise über ein low/high Flanke
am WE (write enable pin, bei mir ramNWE ) gesteuert. Die Adressen und
Daten müssen eine bestimmte Zeit vorher schon anliegen. Ich habe den WE
pin quasi fix auf den Wert ReadOrNSample geklemnnt, der für das lesen
von n-Samples auf 0 gelegt wird. Meine Hoffnung ist, dass durch das
Weiterschalten der Adresse die Daten auch schon so übernommen werden.
Zugegebenermaßen etwas murksig, aber ich dachte mir, so kann ich eine
State-Machine für das korrekte toggeln der Signale sparen. Vor allen
Dingen, weil das lesen der N-Samples mit vollem Systemtakt erfolgen
soll.
Ein weiteres Problem, bei dem ich mir noch nicht so sicher bin, ist, ob
die Datenübertragung vom VHDL-Speicherinterface zur Restlogik
zuverlässig funktioniert, oder ob man dafür noch zusätzliche Ein und
Ausgangslatches einbauen sollte.
Auch das Output Enable des FPGA's wirkt nicht sofort, sondern mit einer
gewissen Verzögerung, die größer ist, als die Laufzeit eines "normalen"
Pins.
DataIn erscheint deshalb am Pin später als z.B. ramNWE.
Das mußt Du auch beim Hochohmig schalten berücksichtigen.
Wenn ramNWE zurück auf high geht, und das SRAM wieder die Ausgänge
aktiviert, aber das FPGA noch nicht hochohmig ist, kommt es zu
Konflikten auf dem Bus.
>Auch das Output Enable des FPGA's wirkt nicht sofort, sondern mit einer>gewissen Verzögerung, die größer ist, als die Laufzeit eines "normalen">Pins.
Deshalb hier eine neue Version des SRAM-Interfaces. Hier habe ich
versucht, das Timing von WE und OE so hinzuschieben, dass kein
Buskonflickt auftritt. Vom Timing her scheint das Ganze jetzt
einigermaßen zu stimmen, aber irgendwie klappt es nicht den Datenport
des CPLDs laut Simulation hochohmig zu schalten ( ramData = "ZZZZZZZZ"
). Habt Ihr eine Idee, woran es liegen könnte?