Bericht des FSM Generators
Anschlüsse:
~~~~~~~~~~~
ZRQ: In Zyklus starten
RACK: In zyc0 ACK Signal
BANK: In gesetzt, wenn Bank vollständig (s.u.)
DONE: In gesetzt, wenn Zyklus vollständig (s.u.)
RRQ: Out Reg Request zum zyc0 GAL
CNCLK: Out Reg Clock Signal des Counters
OUTL: Out Reg Ausgangsdaten Latchen
ZACK: Out Reg Zyklus erfolgreich beendet
C0: None Counter Bit 0
... bis
C7: None Counter Bit 7
D5O: In gespeichertes D5 Bit
D6O: In gespeichertes D6 Bit
IP: In Impulssignal
FWD: Out Vorwärts Impuls
RVD: Out Rückwärts Impuls
L2EN: In Latch 2 Enable Signal
A8: Out Adressleitung A8 des dual-ported RAM
A9: None Adressleitung A9 des dual-ported RAM
Zustände:
~~~~~~~~~
IDLE: Ruhezustand. Kein Request liegt an (ZRQ=0). Sobald ZRQ=1
wird, befindet sich die SM im START Zustand.
START: Von hier geht's direkt nach RQ
RQ: readb anfragen: RRQ -> 1. Die SM bleibt in diesem Zustand bis
RACK signalisiert wird. Danach geht's nach LOOP falls BANK =
0 oder nach BANK falls BANK = 1.
LOOP: Hier geht's weiter falls die Bank noch nicht vollständig ist.
CLK: Den Zähler takten: CNCLK -> 1. Von hier geht's wieder nach
START um das nächste Bit zu berechnen.
BANK: Hier landen wir, sobald eine Bank vollständig ist.
OUT: Die berechneten Werte werden im Output-Latch
zwischengespeichert. Je nachdem, ob diese die letzte Bank war
(DONE=1) oder nicht (DONE=0), geht's jetzt nach DELAY oder
DONE.
DELAY: Es kommen noch weitere Bänke. Also warten wir, bis das
Output-Latch die aktuellen Werten übernommen hat. Dann geht's
nach CLK, um den Zähler zu takten.
DONE: Wir haben alle 256 Impulse berechnet. Wir warten wie unter
DELAY bis die berechneten Werte gespeichert sind.
LCLK: Dann geben wir noch einen CNCLK Impuls ab. Jetzt sollte der
Zähler wieder auf 0 stehen.
ACK: Wir sind fertig: Z8ACK -> 1. Die SM bleibt in diesem Zustand,
bis Z8RQ zurückgenommen wird.
_ZRQ _RACK _BANK _DONE RRQ CNCLK OUTL ZACK
---------------------------------------------------------------------
IDLE 0 X X X L L L L
->IDLE, START
START 1 X X X 0 0 0 0
RQ 1 0 X X 1 0 0 0
-> RQ, LOOP, BANK
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LOOP 1 1 0 X 1 0 0 0
CLK 1 X X X 0 1 0 0
-> START
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BANK 1 1 1 X 1 0 0 0
OUT 1 X X X 0 0 1 0
-> DELAY, DONE
DELAY 1 X X 0 0 0 0 0
-> CLK
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DONE 1 X X 1 0 0 0 0
LCLK 1 X X X 0 1 0 0
ACK 1 X X X 0 0 0 1
IDLE - IDLE
START - RQ - RQ
LOOP - CLK - START
BANK - OUT - DELAY - CLK
DONE - LCLK - ACK - ACK
Dauer:
~~~~~~
Bei synchronem ZRQ Signal
keine Contention
steigenden bis fallende Flanke ZRQ: 4897 (Simulationsergebnis)
Daraus folgt bei
8 MHz GAL-Taktfrequenz
16 MHz muC Taktfrequenz
1280 Hz Impulsfrequenz (= 80 Hz pro 16 Impulse, 20 Hz pro 64 Impulse)
Dauer eines zyc8-Zyklus: 612 us = 820 Buszyklen
Intervall zwischen zwei zyc8 Zyklen: 781 us = 910 Buszyklen
Zeit für die Interruptbehandlung: 169 us = 90 Buszyklen
Zusätzliche Gleichungen:
~~~~~~~~~~~~~~~~~~~~~~~~
Das BANK Signal gibt an, dass die aktuelle Bank vollständig berechnet
wurde. BANK wird VOR dem Hochzählen des Zählers signalisiert, also
müssen wir auf C0-C3=1 prüfen.
BANK := C0*C1*C2*C3
DONE signalisiert, dass der Zyklus beendet ist. Auch DONE wird VOR dem
Hochzählen des Zählers überprüft. Wieder müssen wir auf C4-C7=1
prüfen.
DONE := C4*C5*C6*C7
Und wir müssen den Vorwärts und Rückwärts Impuls berechnen.
FWD = IP*/D6O
RVD = IP*D6O
Die Adressleitungen für den dual-ported RAM müssen noch bestimmt werden
A8 = L2EN*D5O
A9 := L2EN
Summe: In: 4, Out: 4, Int: 1 für Zustandsautomat
~~~~~~ In: 4, Out: 3 für Zusatzgleichungen
-----------------------
In: 8, Out: 8 gesamt
Also: 1x GAL16V8
~~~~~
Korrigierte Zustandstabelle:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_ZRQ _RACK _BANK _DONE RRQ CNCLK OUTL ZACK Z1
----------------------------------------------------------------------------------------
IDLE 0 X X X L L L L h 256
START 1 X X X o 0 o o 1 64
RQ 1 0 X X 1 o o o 0 32
LOOP 1 1 0 X 1 o o o 0 16
CLK 1 X X X o 1 o o 1 64
BANK 1 1 1 X 1 o o o 0 16
OUT 1 X X X 0 o 1 o 0 32
DELAY 1 X X 0 0 0 0 0 0 4
DONE 1 X X 1 0 0 0 0 0 4
LCLK 1 X X X 0 1 0 o 0 16
ACK 1 X X X 0 0 0 1 0 8
----------------------------------------------------------------------------------------
512
Berechnete Gleichungen:
~~~~~~~~~~~~~~~~~~~~~~~
A8 = D5O*L2EN
CNCLK = /CNCLK*/OUTL*/RRQ*/Z1*/ZACK*_ZRQ
+ /_BANK*_RACK*RRQ*/Z1*_ZRQ
FWD = /D6O*IP
OUTL = _BANK*_RACK*RRQ*/Z1*_ZRQ
RRQ = /CNCLK*Z1*_ZRQ
+ /_RACK*RRQ*/Z1*_ZRQ
RVD = D6O*IP
Z1 = /_ZRQ
+ /CNCLK*/_DONE*/OUTL*/RRQ*/Z1*/ZACK
+ CNCLK*Z1
+ /_BANK*_RACK*RRQ*/Z1
ZACK = /OUTL*/RRQ*/Z1*ZACK*_ZRQ
+ CNCLK*/OUTL*/RRQ*/Z1*_ZRQ
zurück