Kooder

Kooder ehk kodeerimisseade on seade, mis viib signaali või informatsiooni kodeeritud kujule. Nagu dekooder, on ka kooder kombinatsioonloogikaahel, ent tema funktsionaalsus on dekoodri omale vastupidine. Koodri põhieesmärk on edastada infot kompaktsemalt, kasutades sama teabe edasi andmiseks väiksemat arvu bitte. Seetõttu kasutatakse koodreid digitaalsüsteemides peamiselt informatsiooni ülekandmisel ühest kohast teise, et vähendada signaali edastamiseks vajalike andmeliinide arvu.
Koodril saab olla maksimaalselt "2n" sisendit ning "n" väljundit. Kooder väljastab kahendkoodis arvu, mis vastab aktiivsele sisendile, tavaliselt on selleks sisend, millel olev signaal on kõrge. Seega muudab kooder "2n" sisendist koosneva signaali "n" bitist koosnevaks koodiks. Lihtkoodri puhul on ainult üks sisenditest korraga aktiivses olekus. Lihtkoodrid on näiteks 4-2 bitine kahendkooder, 8-3 bitine kahendkooder, kümnendarv-BCD kooder ja kaheksandarv-kahendarv kooder. Lisaks lihtkoodritele on olemas ka prioriteedi koodrid, kus igal sisendsignaalil on kindel prioriteet väljundsignaali määramisel ning korraga võib aktiivses olekus olla mitu sisendit.
Koodrid on väga levinud elektroonikalülitustes. Näiteks kalkulaatorites kasutatakse neid selleks, et sisestatud kümnendarvud teisendada kahendkujule, et nendega erinevaid tehteid saaks sooritada. Samuti saab koodri abil genereerida digitaalseid signaale, mis vastavad mingile mehaanilisele liikumisele, näiteks klaviatuuri klahvivajutusele. Koodrit koos vastava positsioonikoodriga saab kasutada ka näiteks võlli positsiooniandurina. Sel juhul on positsioonikoodri ketas jaotatud sarnaselt malelauaga aladeks. Alade paigutus sõltub kodeerimisviisist ja sellest, mitme bitist kodeeringut kasutatakse. Sellise anduri puuduseks on väike täpsus ja suur andmemaht (iga biti kohta on üks fotoelement).
Lihtkoodrid.
4-2 bitine kahendkooder.
4-2 bitise kahendkoodri puhul on tegu koodriga, millel on 4 sisendit ja 2 väljundit. Sellise koodri blokkdiagramm (vt joonis 1) ja tõetabel (vt tabel 1) on toodud allpool. Kuigi 4 sisendiga saab kirjeldada 24 erinevat väärtust, on tõetabelil ainult 4 rida, sest 4-2 bitise kahendkoodri puhul tohib vaid üks sisenditest korraga aktiivses olekus olla. Koodri väljundiks on aktiivse sisendi indeks (näiteks kui sisend W0 on aktiivne, on väljundis signaal 00, kui W1 on aktiivne, siis on väljundis 01 jne). Tabelist on näha, et väljund Y0 on kõrge siis, kui kas sisend W1 või W3 on kõrge, ning väljund Y1 on kõrge siis, kui kas sisend W2 või W3 on kõrge. 
4-2 bitise kahendkoodri väljund genereeritakse joonisel 2 toodud loogikalülitust kasutades. Lülitus kasutab kahte VÕI-väratit. Joonisel on koodri väljund 00 nii juhul, kui I0 on aktiivne kui ka juhul, kui I0 ei ole aktiivne. Kuna sellise koodri puhul ei saa väljundi põhjal üheselt sisendsignaalide väärtusi tuletada, siis lisatakse vahel koodrile kolmas väljund, mis on kõrge siis, kui sisendsignaal I0 on kõrge (koodri väljund 00 loetakse kehtivaks vaid siis, kui kolmas väljund on kõrge).
Kümnendarv-BCD kooder.
Kümnendarv-BCD kooder koosneb tavaliselt 10-st sisendsignaalist ja 4-st väljundsignaalist. Iga sisendsignaal vastab ühele numbrile 0-9 ning 4 väljundsignaali vastavad BCD-koodile. Seega kodeerib kümnendarv-BCD kooder kümnendsüsteemi numbri BCD koodiks, näiteks kui kõrge on kuues sisendsignaal, väljastatakse arvule 6 vastav binaarkood. Kümnendarv-BCD koodrit saab realiseerida ka 9 sisendsignaaliga, sellisel juhul tähistab arvu 0 olukord, kus kõik sisendsignaalid on võrdsed 0-ga. Kui tähistame sisendsignaalid D0-D9 ja väljundsignaalid Y0-Y3, siis 10 sisendi ja 4 väljundiga koodri tõeväärtuste tabel on toodud tabelis 2.
Tabelist näeme, et igale väljundile Yi saab vastavusse seada Boole'i funktsiooni, mis on saadud nende sisenditega VÕI-tehte sooritamisel, mille kõrge olek tagab konkreetse väljundi kõrge oleku. Näiteks väljundi Y0 kõrge oleku tagavad sisendid, mille indeks on paaritu. Seega:
formula_1
Analoogiliselt saame, et:
formula_2
formula_3
formula_4
Lihtkoodri piirangud.
Lihtkoodri, näiteks 4-2 bitise kahendkoodri ja kümnendarv-BCD koodri puhul on sisendsignaale kuni "2n," kus "n" on väljundite arv. Kui tegelik sisendite arv on "m", kusjuures "m ≤ n," siis on erinevaid sisendsignaalide kombinatsioone "2m." Et ainult üks sisenditest saab korraga kõrge olla, on ka lubatud sisendsignaalide kombinatsioone ainult "m" tükki. Seega on "2m - m" sisendsignaalide kombinatsiooni, mida üldse ei kasutata. Lihtkoodri puhul jääb kasutamata 24 - 4 = 12 kombinatsiooni ning kümnendarv-BCD koodri puhul 210 - 10 = 1014 signaali. Kasutamata signaalide arv kasvab sisendite arvu kasvades eksponentsiaalselt.
Samuti tekib probleem, kui aktiivne sisend on signaal indeksiga 0 - nimelt on sellisel juhul kõikidel väljundsignaalidel madal olek ning tuleb vahet teha, kas madal olek on tingitud kõrgest sisendsignaalist liinil indeksiga 0 või kõrgete sisendsignaalide puudumisest. Kahtluse kõrvaldamiseks lisatakse koodrile lisaväljund, mis on kõrge siis, kui sisendsignaal liinil indeksiga 0 on kõrge.
Prioriteedi kooder.
Lihtkoodri piirangute vältimiseks kasutatakse tihti koodrit, kus igale sisendile vastab kindel prioriteet. Sellist koodrit nimetatakse prioriteedi koodriks. Kui mitu sisendit on korraga kõrges olekus, siis prioriteedi kooder arvestab ainult kõige kõrgema prioriteediga sisendit, kõiki madalama prioriteediga aktiivseid sisendeid ignoreeritakse. Praktilistes rakendustes kasutataksegi prioriteedi koodrit kõrgeima tähtsusega signaalide valimiseks. Sellist valimisprotsessi nimetatakse arbitreerimiseks. Üks arbitreerimise levinumaid näiteid on arvutisüsteem, kus mitu sisendseadet üritavad samaaegselt arvutile andmeid saata. Sellisel juhul valib prioriteedi kooder välja kõrgeima prioriteediga sisendseadme ning selle seadme saadetud andmed edastatakse süsteemile.
4-2 bitine prioriteedi kooder.
Nagu 4-2 bitise kahendkoodri puhul, on ka 4-2 bitise prioriteedi koodri puhul 4 sisendit ning 2 väljundit. Erinevalt lihtkoodrist saavad aga mitu sisendsignaali korraga aktiivsed olla, ilma et koodri väljund kannataks. Lisaks on 4-2 bitisel prioriteedi koodril lisaväljund "V", mis on validatsioonibitt ning mis seatakse kõrgeks, kui üks või mitu sisendit on aktiivses olekus. Validatsioonibitt on 0, kui ükski sisendsignaal pole aktiivses olekus ning seega koodril tervikuna puudub kehtiv sisend.
Antud koodri tõetabeli (vt tabel 3) järgi on kõige kõrgema indeksiga sisendisignaal ühtlasi kõige kõrgema prioriteediga sisend. Seega koodri sisendil tervikuna on kõrgeim bitt kõrgeima prioriteediga. Kui sisendsignaal D3 on aktiivne, on koodri väljund 11, sõltumata teiste sisendsignaalide väärtustest. Prioriteedilt järgmine sisend on D2. Kui sisend D3 on 0 ning sisend D2 on 1, on väljund 10, sõltumata teiste sisendite väärtustest. Prioriteedilt järgmine sisendsignaal on D1 ning kõige madalama prioriteediga on D0. Üldiselt kokku võttes väljastatakse prioriteedi koodri puhul madalama prioriteediga sisendile vastav väljund ainult siis, kui kõrgema prioriteediga sisendsignaalid on 0 ehk mitteaktiivses olekus. Tõetablis on igal real need bitid, mida antud real kirjeldatud sisendite kombinatsiooni puhul arvesse ei võeta, tähistatud x-ga.
Ülaloleva tabeli põhjal saab kahele väljundile (väljundit "V" arvestamata) vastava Boole'i funktsiooni kirja panna järgmiselt:
formula_5
formula_6
Lisaväljundile "V" vastav Boole'i funktsioon on:
formula_7
Loogikalülitusena saab vastava koodri realiseerida kolme VÕI-, üht JA- ning üht EI-lülitust kasutades (vt joonis 3).
Koodrite kasutusalad.
Koodritest leiavad kõige suuremat kasutust prioriteedi koodrid. Suuri prioriteedi koodreid saab luua mitme väiksema prioriteedi koodri kombineerimisel, seega ei pea üksikud koodrid ülemäära suured olema. Prioriteedi koodrit saab kasutada näiteks tavalise QWERTY-klaviatuuri juures, mis on ühendatud arvutiga. Arvuti peab aru saama, millist klahvi parajasti vajutati, aga klahve on 104 ning ilma koodrita oleks vaja 104 juhet klaviatuurist arvutisse, et klahvi tuvastada. Praktilisem viis klahvi välja selgitamiseks on kodeerida klaviatuuri 104-st sisendist koosnev signaal tavaliseks 7-bitiseks ASCII koodiks (täisarvulise väärtusega 0 kuni 127), mis suudab väljendada kõiki klaviatuuril leiduvaid sümboleid ja klahve. Sel viisil on vaja klaviatuuri ja arvuti vahele vaid 7 juhet.
Prioriteedi koodreid kasutatakse palju ka magnetilises positsiooni määramises, mis leiab rakendust näiteks laevade navigeerimisel ning robotkäe positsioneerimisel. Näiteks saab kompassi magnetnõela pöördenurga või asendi koodri abil teisendada digitaalseks koodiks, mis antakse sisendiks navigeerimissüsteemi arvutile. Arvuti dekodeerib saadud koodi sellele vastavaks ilmakaareks ning kasutab saadud infot navigeerimisarvutuste tegemisel. Kui tegu on kaheksat ilmakaart näitava kompassiga (põhi, kirre, ida, kagu, lõuna, edel, lääs, loe), saab kompassinõela asendi kodeerida kolmest bitist koosnevaks koodiks 8-3 bitist kahendkoodrit kasutades. Kompassinõela asendi tuvastamiseks saab ilmakaartele vastavates kompassi punktides kasutada näiteks magneteid ja keelreleesid.
Ka mikroprotsessorrakendustes saab kasutada prioriteedi koodrit, täpsemalt eri perifeeriaseadmete katkestussoovide haldamiseks. Sel juhul kasutab mikroprotsessor katkestusi selleks, et lubada lisaseadmetel, nt optilisel seadmel, skanneril, hiirel või printeril endale andmeid saata. Kui mikroprotsessor saab korraga "rääkida" vaid ühe lisaseadmega, peab andma perifeeriaseadmetele prioriteedid ning kasutama prioriteedi koodrit, et juhul, kui mitu lisaseadet tahab protsessorile samal ajal andmeid saata, valitaks suhtlemiseks kõige olulisem seade. Perifeeriaseadmed annavad oma suhtlemissoovist märku katkestuse tekitamisega ehk katkestussoovi või IRQ signaali saatmisega. Seadmete prioriteet protsessoriga suhtlemisel sõltub seadme olulisusest, näiteks süsteemi sisemine kell on tõenäoliselt kõrgema prioriteediga kui hiir.