Hallo alles zusammen,
ich will hier einmal ein kleines Tutorial für das erstellen einfacher GAL Gleichungen erstellen für ATARI GAL Assembler.
Der GAL ist ein Programmierbarer Logic Schaltkreis eigentlich der einstieg zum FPGA er besitzt eingänge und entsprechend auch die Ausgänge.
Das GAL Listing besteht aus mehreren bestandteilen die der Entsprechenden Syntax unterliegen (von Assembler zu Assembler unterschiedlich)
DIe bestandteile
1. %Identification, hier steht ein einfacher String zur Identifzierung, dieser kann auch nach dem Programmieren ausgelesen werden
2. TYP - Hier steht der GAL Typ der vorausgesetzt wird
3. PINS - Die definition der Variablen für die i/O Pins hier bei dem Atari Assembler steht oben die Eingänge und Unten die Ausgänge, wenn nix angeschlossen ist steht da NC.
4. Natürlich die Logic
Hier das Beispiel des IDE Buffer
%IDENTIFICATION
IDEBuffer
%TYP
GAL16V8
%PINS
IOR IOW DMACKIN NC NC NC NC NC NC GND
NC EOUT DIROUT DMACKOUT NC NC NC NC NC VCC
%LOGIC
EOUT = IOR + /IOW
/DIROUT = IOR * /IOW
DMACKOUT = DMACKIN
%END
Ok zerlegen wir das ganze einmal
Die Operanten können ebenfalls bei verschiedenen Assemblern sich unterscheiden
= Zuweisung zu dem Pins
+ Oder
* UND
/ negierung bzw. bei Pindefinition bedeutet es das das Signal LOW Aktiv ist, das heißt bei Low Pegel ist das Signal Gesetzt und wahr
Ich schreibe das einfach mal aus
EOUT ist gleich IOR und nicht IOW
Um das ganze zu verdeutlichen machen wir einmal eine Tabelle
Logische UND verknüpfung
IOR /IOW EOUT
1 0 1 (die Null wird durch / negiert und wird somit zur eins und Logisch verknüpft 1 und 1 ergibt 1)
0 1 0 (die eins wird durch / negiert und wird somit zur null, und null und null ergibt 0)
Hier in dem fall kann es kein 0 0 oder 1 1 geben da entweder Lesen oder Schreiben gesetzt ist.
Jetzt versuche ich das ganze mal anhand einer Dekodierung einer Adresse zu erklären
Bsp.: Ich möchte den Adressbereich D700-D7ff dekotieren.
Am besten nehme ich dazu den Windows Taschenrechner, stelle ihn auf Wissenschaftlich, wähle HEX aus und gebe D700 ein, danach stelle ich Ihn auf BIN und erhalte die Binäre Adresse.
D700 = 1101011100000000
D7FF = 1101011111111111
Wie wir sehen sind die ersten Ziffern gleich also der Bereich 11010111
Wenn wir dies jetzt auf 16 Adressleitungen übertragen bedeutet das
A16 = 1
A15 = 1
A14 = 0
A13 = 1
A12 = 0
A11 = 1
A10 = 1
A09 = 1
Würde man diese Adressleitungen jetzt an die Eingänge eines GALS anschliessen könnte man dann damit die Adresse D700-D7FF dekodieren
Das würde dann die Logic so aussehen
AUSGANG = A16 * A15 * /A14 * A13 * /A12 * A11 * A10 * A09
Trifft die Gleichung in allen Punkten zu, ist der entsprechende Ausgang dann Aktiv also High
Jetzt will ich das ganze einmal erweitern, ich möchte jetzt zusätzlich den Bereich
DF00 - DFFF ausdekodieren
DF00 = 1101111100000000
DFFF = 1101111111111111
Also auch hier wieder
11011111 gleich
A16 = 1
A15 = 1
A14 = 0
A13 = 1
A12 = 1
A11 = 1
A10 = 1
A09 = 1
Dies kann man natürlich vereinfachen, für die die wissen wovon geredet wird, aber ich nutze es jetzt zur Demo
AUSGANG = A16 * A15 * /A14 * A13 * /A12 * A11 * A10 * A09
+ A16 * A15 * /A14 * A13 * A12 * A11 * A10 * A09
Nächstes Beispiel zur Demo, wir haben nun zwei Ausgänge! Der eine nennt sich Ausgang1 und der zweite Ausgang2
An beiden hängt eine LED.
Die LED an Ausgang eins soll immer dann leuchten wenn auf die Adressen D700-D7FF und DF00-D7FF gelesen wird
Auf jeden Computersystem gibt es das Read/Write Signal das bei Lesen also R High ist und Schreiben W LOW deshalb wird es meist so in den unterlagen beschrieben R/W das / ist hier kein Trennzeichen sondern die Negierung von W.
AUSGANG1 = A16 * A15 * /A14 * A13 * /A12 * A11 * A10 * A09 * RW
+ A16 * A15 * /A14 * A13 * A12 * A11 * A10 * A09 * RW
AUSGANG2 = A16 * A15 * /A14 * A13 * /A12 * A11 * A10 * A09 * /RW
+ A16 * A15 * /A14 * A13 * A12 * A11 * A10 * A09 * /RW
Das war eine kleine Einführung, wenn ihr die Möglichkeiten habt, dann baut doch eine Schaltung auf mit einem GAL und Testet doch mal aus. Wenn ihr nicht die Möglichkeit habt einen Computer dazu zu verwenden dann schließt an jeden Eingang des GALS einen 10K Wiederstand gegen Masse. Und zwischen Pin und Wiederstand geht ihr mit 5v die über einen Schalter geschaltet werden ran. An den Ausgängen jeweils eine LED.
Ich hoffe ihr könnt dem was ich hier geschrieben habe bisschen folgen!