Hardware > Hardware (Classic 16-/32-Bit)

GAL Programmierung der einstieg

(1/11) > >>

tuxie:
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

--- Code: ---
%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
 
--- Ende Code ---

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!

tuxie:
wäre auch gern bereit mit euch mal paar GAL Listings zu zerlegen wie die vom IDE Interface!

Hab nochwas gefunden

http://www.arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm

Arthur:
Hallo Ingo, sehr schöner und kompakter GAL-Guide. Ich kann mir kaum vorstellen das da noch viel fehlt. Einzig die  Laufzeiten der verschiedenen binären Gleichungen würde mich noch interessieren.

tuxie:
Guten Morgen,

naja die sollten eigentlich den der Angaben auf dem GAL sein. Also 7ns, 10ns, 15ns, 25ns je nach TYP. Für meinen PowerUP hatte ich mir 7ns GALS besorgt.

Aber da fehlt noch ne ganze menge, es sind keine Register beschrieben. Dann kein open collector Schaltung. Und so einiges, aber ich denk das was ich jetzt beschrieben habe ist das wichtigste.

m0n0:
Hallo,

dankeschön für die kleine Einführung! :)

Ich frage mich nur:

1. was passiert wenn ich widersprüche in die Logik einbringe, also z.b.:

/DIROUT   = IOR * /IOW
/DIROUT   = /IOR * IOW

oder auch:

/DIROUT   = IOR * /IOW
DIROUT   = IOR * /IOW

?

Dann noch eine Frage bezüglich der Adressdekodierung... Ich verstehe nicht genau was Du mit dekodieren meinst... ich meine, Du identifizierst zwar ob Adressen im bereich D700-D7ff  "eingegeben" wird, aber was genau soll das bringen? Und müsste man dann nicht noch was mit den D7XX (ich meine die XX en) machen? Ich meine, in deinem Beispiel lässt Du die XX ja einfach wegfallen... Sorry wenn ich mich unglücklich ausdrücke...

Unter Dekodierer habe ich immer verstanden das man z.b. eine 8 Bit zahl eingibt, und das wird dann auf 256 Leitungen gelegt...

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln