Szóval voltak először a
PLA-k / FPLA-k. (Utóbbi egyszer programozható, előbbi maszkprogramozott, ha minden igaz.) A már ismerősebb verzió a
PAL, ebből nagyon sok verzió létezik. (Ezek is egyszer programozható tokok.) A
GAL-ok úgy lettek felépítve, hogy a régi PAL-ok igen nagy részét pár GAL típussal egy-az-egyben helyettesíteni lehessen, ezért ebből már csak pár fajta készült. (Van olyan szoftver, ami a PAL-ok "tartalmát" konvertálni tudja a hozzá passzoló GAL-hoz, amivel így ki lehet váltani az eredeti PAL-t.)
A PAL/GAL egy "ÉS kapcsolatok VAGY kapcsolata" típusú mátrixszal kezdődik. Vegyük az alap GAL16V8-at. (Itt a számok azt jelentik, hogy 16 bemeneted, illetve 8 kimeneted lehet maximum, egy 20 lábú tokban nyilvánvalóan nem egyszerre.) A mátrixnak van 2×16 bemenete, ezek legyenek az oszlopok. (A 2×16 az úgy jön ki, hogy van a 16 bemeneted (amik a lábak a tokon), illetve ugyanezeknek a negáltja. A mátrix oszlopaira úgy vannak bevezetve, hogy garantált az, hogy a jel ponált illetve negált oszlopa ugyanannyit késleltet, ezt tutira lehet venni.) A mátrix egy sorához tartozik egy - esetünkben - 32 bemenetű ÉS kapu, amibe a 32 oszlopból azokat kötöd be egyszerre, amelyiket akarod. (Nyilván ha egy ÉS kapuba bekötöd egy jel ponált illetve negált oszlopát is, akkor az ÉS kapu kimenete mindig 0 lesz. Ha egy ilyen sort a mátrixból nem használnak, akkor az összes bemenetet (mind a 32-t) be szokták kötni, így az a sor nem szól bele a végeredménybe.
)
Tehát van egy ilyen 32 bemenetes ÉS kapud, ez tartozik egy sorhoz. Ebből (még mindig a 16V8-nál vagyunk) össze van fogva 8 sor, a 8 ÉS kapu kimenete bele van kötve egy 8 bemenetű VAGY kapuba. (Ha nem kell 8 bemenet, a fölösleges sor(ok) a fent említett módon "ki vannak kapcsolva".) Ennek a VAGY kapunak a kimenetével sok minden történhet. A legalapvetőbb dolog, hogy simán ki van vezetve egy kimeneti lábra.
A 16V8-as GAL-nak maximum 8 kimenete lehet, tehát van 8 db. ilyen 8 bemenetű VAGY kapuba bekötött 32 bemenetű ÉS kapus blokkod. (32×8×8 = 2048. "Érdekes" módon a régi PAL-ok pont egy 2048 bites táblázattal programozhatók...
)
A régi PAL-okból azért volt sok fajta, mert a "kimeneti blokk"-ból volt sok fajta, tehát ott a VAGY kapuk kimenete nem biztos, hogy közvetlenül ki volt vezetve. A szimpla eset ott is az volt, hogy a VAGY kapu után még jött egy inverter, amivel így negatív logikás jeleket lehetett előállítani. A GAL-ban a VAGY kapu kimenete egy XOR kapura van kötve, aminek a másik lába programozható, így megmondhatod hogy ponált vagy negált kimenetet akarsz-e. Illetve van egy FlipFlop is a kimeneten, amit szintén használhatsz ha akarsz, de ki is lehet kerülni. (A régi PAL-ok esetén ilyen volt a "regiszteres" kimenet, típusjelben (pl. PAL12R4) az R jelentette ezt, ha jól emlékszem.)
Aztán a kimenet lehet tri-state is (talán az engedélyező jel az fix láb, de ez most nem tuti), de ez is kapcsolható. Mint ahogy az is, hogy maga a láb bemenet vagy kimenet-e. (A 16V8 egy 20 lábú tok, Ha 16 bemenetet akarok, akkor már csak két kimeneti lábam marad. Természetesen ezt is tudni kell konfigurálni.) A kimeneti blokk pontos felépítéséhez az adott tok katalógusát célszerű tanulmányozni.
A 16V8-on kívül van még pár típus, ahol a mátrix oszlopok száma esetleg más, illetve a kimenetenként összefogott ÉS-kapuk száma is változhat. (8 fölötti sor is előfordul, a GAL22V10-ben a különböző kimenetekhez más-más mennyiség tartozik!)
Szóval a "program kreálás" lényege az, hogy ezt a táblázatot kell szépen feltölteni. Vannak erre szoftverek, de ha nagyon akarja az ember, ez még működik kézzel is. (Csináltam ilyet, onnan tudom. De azért nem erőltetném...) A CPLD-k esetén ez a táblázat (mármint hogy melyik bit mit csinál benne) már nem nyilvános, ott az ember "kénytelen" a gyári SW-t használni, GAL esetén a merészeknek megteszi egy szövegszerkesztő is.
(Az alap fájlformátum, amit a programozók használni szoktak ehhez, a ".JED", ez egy szöveges fájl, egy sorban van egy cím, illetve 0 és 1-ek formájában a "bitek", amik gyakorlatilag egy-egy összekötést jelölnek a PAL/GAL-on belül. A logika ugyanaz mint az EPROM-oknál; a nem programozott "bit" az 1, a programozott a 0. Ha a mátrixban egy pontot össze akarsz kötni, a hozzá tartozó "bit"-et programozni (0-ra állítani) kell.)
Most így hirtelen ennyi jut az eszembe, de ezer dolgot kihagytam tuti.