Autor Thema: GAL Programmierung der einstieg  (Gelesen 44533 mal)

0 Mitglieder und 2 Gäste betrachten dieses Thema.

Offline tuxie

  • Benutzer
  • Beiträge: 6.835
  • Falcon! Milan! Schuetzt die Raubvoegel!
GAL Programmierung der einstieg
« am: Mi 09.06.2010, 21:51:25 »
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!
« Letzte Änderung: Mi 25.08.2010, 08:28:10 von tuxie »
Tschau Ingo

Offline tuxie

  • Benutzer
  • Beiträge: 6.835
  • Falcon! Milan! Schuetzt die Raubvoegel!
Re: GAL Programmierung der einstieg
« Antwort #1 am: Mi 09.06.2010, 21:52:22 »
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
« Letzte Änderung: Mi 09.06.2010, 22:00:09 von tuxie »
Tschau Ingo

Offline Arthur

  • Benutzer
  • Beiträge: 10.310
  • Mein Atari erinnert mich an die gute alte Zeit..
Re: GAL Programmierung der einstieg
« Antwort #2 am: Do 10.06.2010, 06:06:01 »
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.

Offline tuxie

  • Benutzer
  • Beiträge: 6.835
  • Falcon! Milan! Schuetzt die Raubvoegel!
Re: GAL Programmierung der einstieg
« Antwort #3 am: Do 10.06.2010, 08:02:25 »
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.
Tschau Ingo

Offline m0n0

  • Benutzer
  • Beiträge: 984
Re: GAL Programmierung der einstieg
« Antwort #4 am: Do 10.06.2010, 16:01:13 »
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...
« Letzte Änderung: Do 10.06.2010, 16:03:10 von m0n0 »

Offline tuxie

  • Benutzer
  • Beiträge: 6.835
  • Falcon! Milan! Schuetzt die Raubvoegel!
Re: GAL Programmierung der einstieg
« Antwort #5 am: Do 10.06.2010, 16:13:24 »
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...


Jaa also dann funktioniert die Logic natürlich nicht, muß natürlich eindeutig sein.

Oft ist es so das wenn man eine Hardware anschliesst um diese anzustuern, dann blendet man sie in einen bestimmten Speicherbereich ein. Diese angaben hast du dann oft auch in den Dokumentationan angegeben.  Den bereich 00-FF wird von der Hardware direkt decodiert.

Hmm ich muß ein beispiel raussuchen um das Darstellbar zu machen.


Tschau Ingo

Offline Arthur

  • Benutzer
  • Beiträge: 10.310
  • Mein Atari erinnert mich an die gute alte Zeit..
Re: GAL Programmierung der einstieg
« Antwort #6 am: Do 10.06.2010, 16:24:31 »
1. was passiert wenn ich widersprüche in die Logik einbringe, also z.b.:

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


Würde glaube ich, in diesem Fall sogar noch funktionieren, oder nicht? Aber davon mal abgesehen, wird das nicht von der Software getestet?

Offline tuxie

  • Benutzer
  • Beiträge: 6.835
  • Falcon! Milan! Schuetzt die Raubvoegel!
Re: GAL Programmierung der einstieg
« Antwort #7 am: Do 10.06.2010, 16:54:05 »
Nein die Plausibilität wird nicht getestet! Nur die Syntax muss stimmen.

Mir ist ein Beispiel für die Adressdecodierung eingefallen.

Ich möchte an meinen Computer einen Flash oder Eprom anschliessen. Dieser hat 16kb. Zur Adressierung von 16kb benötige ich 14 Adressleitungen.

Wenn ich diesen jetzt einfach so an den Bus des Rechner anschliessen würde, würde es einen Adresskonflikt geben weil in den ersten 16kb ja schon andere Hardwarekomponenten sich befinden. Also mache ich folgendes.

Ich suche mir einen Adressbereich der in meinem Computer frei ist raus. Da müßen 16kbyte rein passen.

Beim ST auf jedenfall von 10MB-14MB

(nur Beispiel die werte stimmen nicht)

10485760byte - 10502144byte

Hex
A00000 - A04000
Bin
1010 0000 0000 0000 0000 0000 -
1010 0000 0100 0000 0000 0000

An einem GAL wird nun die Leitungen

A15
A16
A17
A18
A19
A20
A21
A22
A23
A24
Angeschloßen

Mit dem GAL wird nun das Enable Signal für den Eprom generiert.

Enable = A24 * /A23 * A22 * /A21 * /A20 * /A19 * /A18 * /A17 * /A16 * /A15
              + A24 * /A23 * A22 * /A21 * /A20 * /A19 * /A18 * /A17 * /A16 * A15

Gut wenn wir es richtig machen, muß noch /AS mit angeschlossen werden, aber das lass ich jetzt mal weg.

Was passiert!

Die CPU legt eine Adresse auf den Bus

A00001
Bin
101000000000000000000001
Dez
10485761byte

Jetzt vergleicht der GAL, und stellt fest die gleichung ist war und schaltet den Enable Ausgang auf Aktiv.

Jetzt bekommt der Eprom das Enable Signal und fühlt sich angesprochen!  An seinen Pins liegt die Adresse

000 0000 0000 0001
A14                          A1

und führt die von ihm verlangte Operation aus.

Uff nun glüht mein Kopf, kann aber an der Wärme liegen.

Tschau Ingo

Offline m0n0

  • Benutzer
  • Beiträge: 984
Re: GAL Programmierung der einstieg
« Antwort #8 am: Do 10.06.2010, 16:58:23 »
Hallo,

danke für die Erweiterte Erklärung, jetzt peile ich es auch. :) !

Nur das mit der Fehlenden Überprüfung von der Logik finde ich heftig - was passiert denn mit dem GAL dann? Interner Kurzschluss oder sowas ?

Noch was, wird das Enable signal sofort wieder auf Low gesetzt, wenn der angegebene Zustand nicht mehr zutrifft, oder müsste man das explizit programmieren?
« Letzte Änderung: Do 10.06.2010, 17:01:49 von m0n0 »

Offline tuxie

  • Benutzer
  • Beiträge: 6.835
  • Falcon! Milan! Schuetzt die Raubvoegel!
Re: GAL Programmierung der einstieg
« Antwort #9 am: Do 10.06.2010, 16:59:04 »
Nein passiert nix, das tut ihm nicht weh!
Tschau Ingo

Offline m0n0

  • Benutzer
  • Beiträge: 984
Re: GAL Programmierung der einstieg
« Antwort #10 am: Do 10.06.2010, 17:02:52 »
Sorry, habe ich gerade beim edit geschrieben:

Noch was, wird das Enable signal sofort wieder auf Low gesetzt, wenn der angegebene Zustand nicht mehr zutrifft, oder müsste man das explizit programmieren?

z.B. so:

/Enable =/(  A24 * /A23 * A22 * /A21 * /A20 * /A19 * /A18 * /A17 * /A16 * /A15
              + A24 * /A23 * A22 * /A21 * /A20 * /A19 * /A18 * /A17 * /A16 * A15 )

... so in der art  ;D ;)

Offline tuxie

  • Benutzer
  • Beiträge: 6.835
  • Falcon! Milan! Schuetzt die Raubvoegel!
Re: GAL Programmierung der einstieg
« Antwort #11 am: Do 10.06.2010, 17:47:34 »
Nein wird sobald die Bedingung nichtmehr erfüllt ist natürlich wieder zurückgesetzt!.
Tschau Ingo

Offline tuxie

  • Benutzer
  • Beiträge: 6.835
  • Falcon! Milan! Schuetzt die Raubvoegel!
Re: GAL Programmierung der einstieg
« Antwort #12 am: Mo 14.06.2010, 10:50:13 »
Hmm, hätte eigentlich gedacht das sich mehr leute dafür Interessieren.
Tschau Ingo

Offline Ektus

  • Benutzer
  • Beiträge: 919
Re: GAL Programmierung der einstieg
« Antwort #13 am: Di 15.06.2010, 19:29:04 »
Hallo Ingo!

Hmm, hätte eigentlich gedacht das sich mehr leute dafür Interessieren.

Interessieren schon, aber derzeit habe ich keinen konkreten Bedarf dafür. Also lese ich nur mit und behalte das Ganze im Hinterkopf, falls doch mal was ansteht. Aber eigentlich bin ich eher der Fertiggeräte- oder höchstens Bausatzkäufer.


Mit freundlichen Grüßen
Ektus.

Offline tuxie

  • Benutzer
  • Beiträge: 6.835
  • Falcon! Milan! Schuetzt die Raubvoegel!
Re: GAL Programmierung der einstieg
« Antwort #14 am: Di 15.06.2010, 20:19:10 »
Hehe ok, na war ja net böse gemeint oder so!  ::)

Tschau Ingo

Offline m0n0

  • Benutzer
  • Beiträge: 984
Re: GAL Programmierung der einstieg
« Antwort #15 am: Di 15.06.2010, 22:49:47 »
Also ich finds auch interessant, und bei gelegenheit werde ich es auch mal ausprobieren - ich hab die GABI ja nicht umsonst gebaut ;)

Also ich finde Deinen Text sehr gut und finde es gut das Du das wichtigste zusammengefasst hast. So weiss man was wirklich zählt! :)

Offline tuxie

  • Benutzer
  • Beiträge: 6.835
  • Falcon! Milan! Schuetzt die Raubvoegel!
Re: GAL Programmierung der einstieg
« Antwort #16 am: Fr 18.06.2010, 11:37:23 »
So mal zur übung ne Aufgabe ;-)

Wann ist in diesem Beispiel DTACK gesetzt

DTACK = /AS*A23*A22*A21*/A20*/A19*/A18*RW
         +    A23*A22*A21*A20*/A19*/A18*/A17*/A16*/A15*/A14;

Zur Info AS (Acknowlege Strobe) ist Low Aktiv
Tschau Ingo

Offline m0n0

  • Benutzer
  • Beiträge: 984
Re: GAL Programmierung der einstieg
« Antwort #17 am: Fr 18.06.2010, 12:18:27 »
Hallo tuxie!

1.)  im GAL ASM kann ich ja sowas wie hier machen
%PINS  
/AS RW

%LOGIC
RW = /AS

Das würde bedeuten AS ist ein Active Low pin und ich müsste /AS nutzen um den High Zustand abzufragen, oder? In dem Fall
würde RW dann High wenn AS auch high ist ( d.h. Inaktiv)


Ansonsten, darf ich's auflösen ^^ ? Ich geh mal davon aus das meine Annahme richtig ist. :)

DTACK ist eingeschaltet wenn...:

AS  = Eingeschaltet ( Low  )
A23 = Eingeschaltet ( High )
A22 = Eingeschaltet ( High )
A21 = Eingeschaltet ( High )
A20 = Ausgeschaltet ( Low  )
A19 = Ausgeschaltet ( Low  )
A18 = Ausgeschaltet ( Low  )
RW  = Eingeschaltet ( High )

Oder:

A23 = Eingeschaltet ( High )
A22 = Eingeschaltet ( High )
A21 = Eingeschaltet ( High )
A20 = Eingeschaltet ( High )
A19 = Ausgeschaltet ( Low  )
A18 = Ausgeschaltet ( Low  )
A17 = Ausgeschaltet ( Low  )
A16 = Ausgeschaltet ( Low  )
A15 = Ausgeschaltet ( Low  )
A14 = Ausgeschaltet ( Low  )

Gruß!

Offline tuxie

  • Benutzer
  • Beiträge: 6.835
  • Falcon! Milan! Schuetzt die Raubvoegel!
Re: GAL Programmierung der einstieg
« Antwort #18 am: Fr 18.06.2010, 15:49:24 »
Hi,
naja!!

Ich versuch mal zu erklären wozu das /AS da ist.
Die CPU legt eine Adresse auf den Bus und die Entsprechenden Daten, sie setzt die R/W Leitung hier in unserem Beispiel auf High daher Lesen!

Sind alle Adressen und Leitungen gesetzt, setzt die CPU /AS auf Aktiv daher LOW.

Nun liegt an dem GAL 
AS  = Eingeschaltet ( Low  )
A23 = Eingeschaltet ( High )
A22 = Eingeschaltet ( High )
A21 = Eingeschaltet ( High )
A20 = Ausgeschaltet ( Low  )
A19 = Ausgeschaltet ( Low  )
A18 = Ausgeschaltet ( Low  )
RW  = Eingeschaltet ( High )

Oder:

A23 = Eingeschaltet ( High )
A22 = Eingeschaltet ( High )
A21 = Eingeschaltet ( High )
A20 = Eingeschaltet ( High )
A19 = Ausgeschaltet ( Low  )
A18 = Ausgeschaltet ( Low  )
A17 = Ausgeschaltet ( Low  )
A16 = Ausgeschaltet ( Low  )
A15 = Ausgeschaltet ( Low  )
A14 = Ausgeschaltet ( Low  )

Ensprechend an. Und welcher Adressbereich wäre das?
Tschau Ingo

Offline tuxie

  • Benutzer
  • Beiträge: 6.835
  • Falcon! Milan! Schuetzt die Raubvoegel!
Re: GAL Programmierung der einstieg
« Antwort #19 am: Fr 18.06.2010, 15:58:45 »
Tschau Ingo