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