Mikrokood

Protsessori disainis toimib mikrokood vahekihina, mis asub keskseadme (CPU) riistvara ja arvuti programmeerijale nähtava käsustiku, mida tuntakse ka masinkoodina, vahel. See koosneb riistvarataseme käskude komplektist, mis rakendavad kõrgema taseme masinkoodi käske või juhivad sisemise lõpliku olekumasina järjestamist paljudes digitaalsetes töötluskomponentides . Mikrokoodi kasutatakse tänapäevastes laua- ja sülearvutite Inteli ja AMD üldotstarbelistes protsessorites, kuid see toimib vaid varuvariandina olukordades, kus kiirem riistvaraline juhtseade hakkama ei saa. 
Mikrokood, mis on paigutatud spetsiaalsesse kiirmälusse, tõlgib masina juhised, olekumasinate andmed või muud sisendandmed üksikasjalikeks ahelatasemel toimingute jadadeks. See eraldab masina juhised aluseks olevast elektroonikast, võimaldades seeläbi suuremat paindlikkust juhiste kavandamisel ja muutmisel. Lisaks sellele hõlbustab see keeruliste mitmeastmeliste juhiste koostamist, vähendades samal ajal arvutilülituste keerukust. Mikrokoodi kirjutamist nimetatakse sageli "mikroprogrammeerimiseks" ja mikrokoodi konkreetses protsessori rakenduses nimetatakse mõnikord "mikroprogrammiks".
Ulatusliku mikroprogrammeerimise abil saavad väiksema ulatuse ja lihtsamad mikroarhitektuurid emuleerida robustsemaid arhitektuure laiema sõnapikkuse, täiendavate täitmisüksuste jne abil. See lähenemisviis pakub suhteliselt lihtsat meetodit, et tagada tarkvara ühilduvus erinevate toodete vahel ühe protsessoriperekonna piires.
Mõned riistvaratootjad, eelkõige IBM ja Lenovo, kasutavad terminit "mikrokood" vaheldumisi "püsivaraga". Selles kontekstis nimetatakse mikrokoodiks kogu seadmes olevat koodi, olenemata sellest, kas tegemist on mikrokoodi või masinkoodiga. Näiteks kõvaketta mikrokoodi uuendused hõlmavad sageli nii mikrokoodi kui ka püsivara värskendusi. 
Ülevaade.
Käsustikudud.
Riistvaralisel tasandil sisaldavad protsessorid mitut eraldiseisvat vooluahela ala ehk „üksust“, mis täidavad erinevaid ülesandeid. Tavaliselt leidub selliseid üksusi nagu aritmeetika-loogikaüksus (ALU), mis täidab selliseid käske nagu liitmine või kahe arvu võrdlemine, ahelad andmete lugemiseks ja kirjutamiseks välismällu ning väikesed pardamälu alad, mis salvestavad neid väärtusi töötlemise ajal. Enamikus konstruktsioonides kasutatakse täiendavat suure jõudlusega mälu, registrifaili, ajutiste väärtuste, mitte ainult jooksva käsu jaoks vajalike väärtuste salvestamiseks. 
Käskude nõuetekohaseks täitmiseks peavad erinevad ahelad olema aktiveeritud järjestikku. Näiteks ei ole võimalik liita kahte arvu, kui need ei ole veel mälust laetud. RISC disainides sõltub nende käskude õige järjestus suuresti programmeerijast või vähemalt selle programmeerimiskeele kompilaatorist, mida ta kasutab . Näiteks kahe arvu liitmiseks võib kompilaator anda välja juhised, et laadida üks väärtustest ühte registrisse, teine teise registrisse, kutsuda ALU-s liitmisfunktsiooni ja seejärel kirjutada tulemus tagasi mällu. 
Kuna selle kõrgema taseme kontseptsiooni „liida need kaks arvu mälus“ täitmiseks vajalike käskude jada võib nõuda mitut käsku, võib see kujutada endast jõudluse kitsaskohta, kui need käsud on salvestatud põhimällu . Nende juhiste ükshaaval lugemine võtab aega, mida võiks kasutada tegelike andmete lugemiseks ja kirjutamiseks. Sel põhjusel on mitte-RISCi disainilahendustes tavaline, et neil on palju erinevaid juhiseid, mis erinevad suuresti selle poolest, kus nad andmeid salvestavad. Näiteks MOS 6502-l on kaheksa varianti liitmiskäsust ADC, mis erinevad ainult selle poolest, kust nad otsivad kahte operandi. 
Kasutades käsu varianti ehk "opkoodi", mis vastab kõige paremini lõplikule operatsioonile, saab käskude arvu vähendada ühele, säästes programmi koodis kasutatavat mälu ja parandades jõudlust, jättes andmesiini teistele operatsioonidele avatuks. Sisemiselt ei ole need juhised siiski eraldi operatsioonid, vaid üksuste poolt tegelikult sooritatavate operatsioonide jadad. Üksiku mälust loetud käsu teisendamine sisemiste toimingute jadaks on protsessori teise üksuse, juhtseadme, ülesanne. 
Mikrokood.
Mikrokoodi põhiidee on asendada käskude järjestamist rakendav kohandatud riistvaraloogika protsessori „mikrokoodimootoris“ käivitatud lihtsate käskude rea abil. Kui kohandatud loogikasüsteemis võib olla rida dioodi ja väravaid, mis väljastavad mitmesugustel juhtliinidel pingeid, siis mikrokoodimootor on ühendatud nende liinidega ning need lülitatakse sisse ja välja, kui mootor loeb järjestikku mikrokoodi juhiseid. Mikrokoodi juhised on sageli nendele liinidele bittkodeeritud, näiteks kui bitt 8 on tõene, võib see tähendada, et ALU peaks andmete ootamiseks pausi tegema. Selles suhtes on mikrokood mõnevõrra sarnane mängijaklaveri paberirullidega, kus augud tähistavad, millist klahvi tuleks vajutada.
Erinevus kohandatud loogika ja mikrokoodi vahel võib tunduda väike, üks kasutab dioodide ja väravate mustrit, et dekodeerida käsk ja toota signaalide jada, samas kui teine kodeerib signaalid mikrokäsudena, mida loetakse järjestikku, et saada sama tulemus. Kriitiline erinevus seisneb selles, et kohandatud loogika disainis nõuavad üksikute sammude muudatused riistvara ümberprojekteerimist. Mikrokoodi kasutamisel muutub ainult mikrokoodi sisaldavasse mällu salvestatud kood. See muudab probleemide parandamise mikrokoodiga süsteemis palju lihtsamaks. See tähendab ka seda, et käskude keerukusele ei ole tegelikku piirangut, seda piirab ainult mälu hulk, mida ollakse valmis kasutama..
Kõige madalam kiht arvuti tarkvaraplaanis on traditsiooniliselt protsessori masinkoodi käsud. Mikrokoodiga protsessorites võib nende käskude kättesaamine ja dekodeerimine ning nende täitmine toimuda mikrokoodi abil. Segaduse vältimiseks eristatakse iga mikroprogrammiga seotud elementi eesliitega micro: microinstruction, microassembler, microprogrammer jne.
Komplekssed digitaalprotsessorid võivad kasutada ka rohkem kui ühte (võimalik, et mikrokoodipõhist) juhtseadet, et delegeerida alamülesandeid, mida tuleb põhimõtteliselt asünkroonselt paralleelselt täita. Näiteks VAX 9000-l on juhtmega ühendatud IBox-üksus käskude toomiseks ja dekodeerimiseks, mis seejärel edastatakse mikrokodeeritud EBox-üksusele täitmiseks ja VAX 8800-l on nii mikrokodeeritud IBox kui ka mikrokodeeritud EBox. 
Kõrgetasemeline programmeerija või isegi assemblerkeele programmeerija tavaliselt mikrokoodi ei näe ega muuda. Erinevalt masinkoodist, mis sageli säilitab teatud tagasiühilduvuse ühe protsessoriperekonna erinevate protsessorite vahel, töötab mikrokood ainult täpselt sellel elektroonikalülitusel, mille jaoks see on loodud, kuna see moodustab lahutamatu osa konkreetse protsessori disainist endast.
Disain.
Tavaliselt kirjutavad insenerid mikrokoodi protsessori disainifaasis, salvestades selle kirjutuskaitstud mällu (ROM) või programmeeritavasse loogikamassiivi (PLA) struktuuri või mõlema kombinatsioonina . Siiski on olemas ka masinaid, mille mikrokood on osaliselt või täielikult salvestatud staatilisse muutmällu (SRAM) või välkmällu . Arvutite kontekstis tähistatakse seda traditsiooniliselt "kirjutatava juhtmäluna", mis võib olla kas kirjutuskaitstud või kirjutuskaitstud mälu . Viimasel juhul laadib protsessori initsialiseerimisprotsess mikrokoodi juhtmälusse teiselt salvestuskandjalt, võimalusega muuta mikrokoodi käskude komplekti vigade parandamiseks või uute masinakäskude rakendamiseks.
Mikroprogrammid.
Mikroprogrammid koosnevad mikroinstruktsioonide seeriatest, mis juhivad protsessorit riistvaraahelate väga põhilisel tasemel. Näiteks võib üks tüüpiline "horisontaalne" mikrokäsk määrata järgmised toimingud:
Protsessori kõigi funktsioonide samaaegseks juhtimiseks ühes tsüklis on mikroinstruktsioon sageli laiem kui 50 bitti; nt 128 bitti 360/85-l emulaatorifunktsiooniga. Mikroprogrammid on hoolikalt kavandatud ja optimeeritud võimalikult kiireks täitmiseks, kuna aeglane mikroprogramm tooks kaasa aeglase masinkäsu ja halvenenud jõudluse seotud rakendusprogrammides, mis selliseid käske kasutavad.
Põhjendus.
Mikrokood töötati algselt välja arvuti juhtimisloogika arendamise lihtsama meetodina. Algselt olid protsessori juhiste komplektid sisseehitatud . Iga masinajuhiste toomiseks, dekodeerimiseks ja täitmiseks vajalikku sammu (sealhulgas operandi aadressi arvutusi, lugemisi ja kirjutamisi) kontrolliti otse kombineeritud loogika ja üsna minimaalse järjestikuse olekumasina vooluringi abil. Kuigi sellised kõvakettaga protsessorid olid väga tõhusad, muutis võimsate, mitmeastmelise adresseerimise ja keerukate toimingutega käskude komplektide vajadus ("vt allpool") nende disaini ja silumise keeruliseks; sellele võivad kaasa aidata ka tugevalt kodeeritud ja erineva pikkusega käsud, eriti väga ebaregulaarsete kodeeringute kasutamisel.
Mikrokood lihtsustas tööd, võimaldades suure osa protsessori käitumisest ja programmeerimismudelist defineerida mikroprogrammirutiinide, mitte spetsiaalse vooluringi abil. Isegi disainiprotsessi hilisemas etapis sai mikrokoodi hõlpsasti muuta, samas kui juhtmega protsessori disainide muutmine oli väga tülikas. Seega hõlbustas see oluliselt protsessori disai
1940. aastatest kuni 1970. aastate lõpuni tehti suur osa programmeerimisest assemblerkeeles ; kõrgema taseme käsud tähendasid programmeerija suuremat tootlikkust, seega oli mikrokoodi oluline eelis see, et võimsaid masinkäske saab defineerida suhteliselt lihtsalt. Selle lõplik laiendus on "otseselt täidetavad kõrgetasemelised keeled", kus iga kõrgetasemelise keele, näiteks PL/I, lause täidetakse täielikult ja otse mikrokoodi abil ilma kompileerimiseta. Selle näited on IBM Future Systemsi projekt ja Data General Fountainhead Processor. 1970. aastatel kasvasid protsessori kiirused kiiremini kui mälu kiirused ja selle leevendamiseks kasutati arvukalt tehnikaid, nagu mäluplokkide ülekanne, mälu eellaadimine ja mitmetasandiline vahemälu . Mikrokoodi abil võimalikuks tehtud kõrgetasemelised masinjuhised aitasid veelgi kaasa, kuna vähem keerukamaid masinjuhiseid vajab vähem mälu ribalaiust. Näiteks saab märgijadaga tehtava toimingu teha ühe masinkäsuna, vältides seega mitme käsu hankimist.
Komplekssete mikroprogrammide abil rakendatud käskude komplektidega arhitektuuride hulka kuulusid IBM System/360 ja Digital Equipment Corporation VAX . Üha keerukamate mikrokoodiga rakendatud käskude komplektide lähenemisviisi nimetati hiljem keerukate käskude komplektidega arvutiks (CISC). Alternatiivne lähenemisviis, mida kasutatakse paljudes mikroprotsessorites, on kasutada käskude dekodeerimiseks ühte või mitut programmeeritavat loogikamassiivi (PLA) või kirjutuskaitstud mälu (ROM) (kombinatsiooniloogika asemel) ja lasta lihtsal olekumasinal (ilma suure või olematu mikrokoodita) teha suurem osa sekveneerimisest. MOS Technology 6502 on näide mikroprotsessorist, mis kasutab käskude dekodeerimiseks ja järjestamiseks PLA-d. PLA on nähtav kiibi mikrofotodel ja selle toimimist saab näha transistori tasemel simulatsioonis.
Mikroprogrammeerimist kasutatakse tänapäevastes protsessorite disainides endiselt. Mõnel juhul asendatakse pärast mikrokoodi silumist simulatsioonis juhtmälu loogikafunktsioonidega. Loogikafunktsioonid on sageli kiiremad ja odavamad kui samaväärne mikroprogrammimälu.
Kasu.
Protsessori mikroprogrammid töötavad primitiivsemal, täiesti erineval ja palju riistvaralisemal arhitektuuril kui tavalistele programmeerijatele nähtavad assemblerjuhised. Riistvaraga kooskõlas rakendab mikrokood programmeerijale nähtavat arhitektuuri. Aluseks oleval riistvaral ei pea olema nähtava arhitektuuriga fikseeritud suhet. See lihtsustab antud käskude komplekti arhitektuuri rakendamist paljudele alusriistvara mikroarhitektuuridele.
IBM System/360-l on 32-bitine arhitektuur 16 üldotstarbelise registriga, kuid enamik System/360 implementatsioone kasutab riistvara, mis rakendab palju lihtsamat aluseks olevat mikroarhitektuuri; näiteks System/360 mudelil 30 on 8-bitised andmeteed aritmeetilise-loogikaüksusesse (ALU) ja põhimällu ning üldotstarbelised registrid on rakendatud spetsiaalses kiirema põhimälu üksuses, ja System/360 mudelil 40 on 8-bitised andmeteed ALU-sse ja 16-bitised andmeteed põhimällu ning üldotstarbelised registrid on samuti rakendatud spetsiaalses kiirema põhimälu üksuses. Mudelil 50 on täielikud 32-bitised andmeteed ja üldotstarbelised registrid on rakendatud spetsiaalses kiirema põhimälu üksuses. Mudelitel 65 kuni mudelil 195 on pikemad andmesideteed ja üldotstarbelised registrid on rakendatud kiiremates transistoriahelates. Sel viisil võimaldas mikroprogrammeerimine IBM-il kujundada palju System/360 mudeleid oluliselt erineva riistvaraga ning laia hinna ja jõudluse vahemikuga, muutes need kõik arhitektuuriliselt ühilduvaks. See vähendab dramaatiliselt iga mudeli jaoks kirjutatavate unikaalsete süsteemitarkvaraprogrammide arvu.
Sarnast lähenemisviisi kasutas Digital Equipment Corporation (DEC) oma VAX arvutiperekonnas. Seetõttu kasutavad erinevad VAX-protsessorid erinevaid mikroarhitektuure, kuid programmeerijale nähtav arhitektuur ei mu
Mikroprogrammeerimine vähendab ka protsessori vigade (vigade) parandamiseks vajalike muudatuste kulusid; vea saab sageli parandada mikroprogrammi osa asendamise, mitte riistvaraloogika ja juhtmestiku muutmise teel.
Ajalugu.
Varased näited.
1947. aastal tutvustas MIT Whirlwindi disain juhtploki kontseptsiooni, et lihtsustada arvutidisaini ja liikuda kaugemale "ad hoc" meetoditest. Juhtmälu on dioodmaatriks : kahemõõtmeline võre, kus üks dimensioon võtab vastu protsessori sisemiselt kellalt "juhtimisaja impulsse" ja teine ühendub väravate ja muude vooluringide juhtsignaalidega. "Impulssijaotur" võtab protsessori kella genereeritud impulsid ja jagab need kaheksaks eraldi ajaimpulsiks, millest igaüks aktiveerib võre erineva rea. Kui rida aktiveeritakse, aktiveeritakse sellega ühendatud juhtsignaalid. 
1951. aastal täiustas Maurice Wilkes seda kontseptsiooni, lisades "tingimusliku täitmise", mis on sarnane arvutitarkvara tingimusliku täitmise kontseptsiooniga. Tema esialgne teostus koosnes kahest maatriksist: esimene genereeris signaale Whirlwindi juhtmälu viisil, teine maatriks aga valis, millist signaalirida (niiöelda mikroprogrammi käsusõna) järgmisel tsüklil kutsuda. Tingimuslaused rakendati nii, et üks rida juhtsalves sai valida teise maatriksi alternatiivide hulgast. See muutis juhtsignaalid sõltuvaks tuvastatud sisemisest signaalist. Wilkes lõi selle funktsiooni kirjeldamiseks ja lihtsast juhtsalvestusest eristamiseks termini "mikroprogrammeerimine" .
360.
Mikrokood jäi arvutidisainis suhteliselt haruldaseks, kuna koodi salvestamiseks vajaliku ROM-i maksumus ei erinenud oluliselt kohandatud juhtimisloogika maksumusest. See muutus 1960. aastate alguses, kui turule toodi masstootmises olev põhimälu ja põhikaabel, mis oli palju odavam kui dioodimassiividel või sarnastel lahendustel põhinev spetsiaalne loogika. Esimene, kes seda tegelikult ära kasutas, oli IBM oma 1964. aasta System/360 seerias. See võimaldas masinatel omada väga keerukat käskude komplekti, mis sisaldas operatsioone, mis sobisid kõrgetasemeliste keelekonstruktsioonidega, näiteks binaarväärtuste vormindamine kümnendstringideks, kodeerides selle ülesande jaoks vajalikke keerulisi sisemisi samme odavas mälus. 
Kuid 360 seeria tegelik väärtus seisnes selles, et sai ehitada rea masinaid, mis olid sisemiselt täiesti erinevad, kuid käitasid sama ISA-d. Madalama klassi masina puhul võidakse kasutada 8-bitist ALU-d, mis nõuab ühe 32-bitise liitmise lõpetamiseks mitut tsüklit, samas kui kõrgema klassi masinal võib olla täielik 32-bitine ALU, mis teeb sama liitmise ühe tsükliga. Neid erinevusi saaks rakendada juhtimisloogikas, kuid iga masina jaoks täiesti erineva dekoodri rakendamine oleks liiga kulukas. Mikrokoodi kasutamine tähendas, et muutus ainult ROM-is olev kood. Näiteks võib üks masin sisaldada ujukomaühikut ja seega võib selle kahe arvu korrutamiseks mõeldud mikrokood olla vaid paar rida pikk, samas kui samal masinal ilma ujukomaüksuseta oleks see programm, mis teeks sama mitme liitmise abil, ja ainus, mis muutuks, oleks ROM. 
Selle disaini tulemuseks oli see, et kliendid said oma tarkvara arendamiseks kasutada perekonna odavamat mudelit, teades, et kui kunagi peaks vaja minema suuremat jõudlust, saavad nad minna üle kiiremale versioonile ja miski muu ei muutu. See alandas sisenemisbarjääri ja 360 oli meeletu edu. Kümnendi lõpuks oli mikrokoodi kasutamine suurarvutite tööstuses "kohustuslik".
Liikudes reast ülespoole.
Varased miniarvutid olid mikrokoodi vajamiseks liiga lihtsad ning olid oma käskude komplektide ja dekodeerimisviisi poolest sarnasemad varasemate suurarvutitega. Kuid peagi hakkasid nende disainerid kasutama võimsamaid integraallülitusi, mis võimaldasid keerukamaid ISA-sid. 1970. aastate keskpaigaks kasutas enamik uusi mini- ja superminiarvuteid samuti mikrokoodi, näiteks enamik PDP-11 mudeleid ja, mis kõige tähelepanuväärsem, enamik VAX-i mudeleid, mis sisaldasid kõrgetasemelist õpet, mis sarnanes 360-s leiduvatele. 
Sama põhiline areng toimus ka mikroprotsessoritega. Varased disainid olid väga lihtsad ja isegi võimsamatel 8-bitistel 1970. aastate keskpaiga disainidel, nagu Zilog Z80, olid juhiste komplektid, mis olid piisavalt lihtsad, et neid saaks spetsiaalses loogikas rakendada. Selleks ajaks sai juhtimisloogika olla mustritud samale kiibile kui protsessor, mistõttu ROM-i ja loogika hinnavahe pole enam nii suur probleem. Siiski ei läinud kaua aega, kui ka need ettevõtted seisid silmitsi probleemiga, kuidas tutvustada suurema jõudlusega disainilahendusi, kuid soovisid siiski pakkuda tagasiühilduvust . Üks mikrokoodi varajastest näidetest mikrosüsteemides oli Intel 8086. 
Üks mikroprotsessorites mikrokoodi lõplikke rakendusi on Motorola 68000. See pakkus väga ortogonaalset käskude komplekti laia valiku adresseerimisrežiimidega, mis kõik olid rakendatud mikrokoodis. See ei tulnud ilma kuludeta, varajaste artiklite kohaselt moodustab mikrokoodisüsteem umbes 20% kiibi pindalast (ja seega ka maksumusest) ja süsteemidest 68 000 transistori olid osa mikrokoodisüsteemist.
RISC.
Kuigi ettevõtted jätkasid konkureerimist oma käskude komplektide keerukuse osas ja mikrokoodi kasutamine nende rakendamiseks oli vaieldamatu, tekitas IBM-i siseprojekt 1970. aastate keskel tõsiseid küsimusi kogu kontseptsiooni kohta. Osana projektist, mille eesmärk oli arendada välja suure jõudlusega täisdigitaalne telefonikommutaator, hakkas John Cocke'i juhitud meeskond uurima tohutul hulgal jõudlusandmeid oma klientide 360 (ja System/370 ) programmidest. See pani nad märkama kummalist mustrit: kui ISA esitas käsust mitu versiooni, kasutas kompilaator peaaegu alati kõige lihtsamat, mitte seda, mis koodi kõige otsesemalt esindas. Nad said teada, et see oli nii, kuna need juhised olid alati riistvaras rakendatud ja seega töötasid need kõige kiiremini. Teise käsu kasutamine võis mõne masina puhul pakkuda paremat jõudlust, kuid polnud mingit võimalust teada, millisel masinal need töötavad. See nullis mikrokoodi kasutamise eesmärgi, milleks oli nende erinevuste varjamine. 
Selle avastuse tulemuseks oli see, mida tänapäeval tuntakse RISC -kontseptsioonina. Kompleksne mikrokoodimootor ja sellega seotud ROM on vähendatud või täielikult eemaldatud ning need vooluringid on selle asemel pühendatud sellistele asjadele nagu lisaregistrid või laiem ALU, mis suurendab iga programmi jõudlust. Kui on vaja keerulisi käskude jadasid, jäetakse see kompilaatori hooleks, mis ongi kompilaatori kasutamise eesmärk. Põhikontseptsiooni võtsid peagi omaks California ülikooli teadlased, kus simulatsioonid näitasid, et sellised konstruktsioonid edestavad triviaalselt isegi kiireimaid tavapäraseid konstruktsioone. Just üks selline projekt California Ülikoolis Berkeleys tutvustas terminit RISC.
Tööstus reageeris RISC kontseptsioonile nii segaduse kui ka vaenulikkusega, sealhulgas avaldas Digitali VAX-i meeskond kuulsa halvustava artikli. Peamine vaidluspunkt oli see, et käskude rakendamine väljaspool protsessorit tähendas, et protsessor kulutaks nende käskude lugemisele mälust palju rohkem aega, aeglustades seeläbi üldist jõudlust olenemata sellest, kui kiiresti protsessor ise töötas. Pooldajad tõid välja, et simulatsioonid näitasid selgelt, et käskude arv ei olnud palju suurem, eriti kompileeritud koodi puhul. 
Arutelu möllas kuni esimeste kommertslike RISC-disainide ilmumiseni 1980. aastate teisel poolel, mis edestasid kergesti teiste ettevõtete kõige keerukamaid disainilahendusi. 1980. aastate lõpuks oli see läbi; isegi DEC loobus oma DEC Alpha disainides mikrokoodist ja CISC protsessorid läksid paljude funktsioonide täitmiseks üle mikrokoodi asemel juhtmega vooluringidele. Näiteks Intel 80486 kasutab käskude toomiseks ja dekodeerimiseks juhtmega vooluringi, täites käske ainult mikrokoodi abil; registritevahelise liikumise ja aritmeetilised käsklused vajasid ainult ühte mikrokäsku, mis võimaldas neid täita ühe taktsükli jooksul. Pentium Pro protsessori toomise ja dekodeerimise riistvara toob käsud ja dekodeerib need mikrooperatsioonide seeriateks, mis edastatakse täitmisüksusele, mis ajastab ja käivitab mikrooperatsioonid, tehes seda võimalik , et vales järjekorras . Keerulisi juhiseid rakendatakse mikrokoodi abil, mis koosneb eelnevalt määratletud mikrooperatsioonide järjestustest. 
Mõned protsessori disainid kasutavad spetsiaalses režiimis töötavat masinkoodi, millel on spetsiaalsed juhised, mis on saadaval ainult selles režiimis ja millel on juurdepääs protsessorist sõltuvale riistvarale, et rakendada juhiste komplekti mõningaid madala taseme funktsioone. DEC Alpha, mis on puhas RISC-disain, kasutas PALcode'i selliste funktsioonide rakendamiseks nagu translation lookaside bufferi (TLB) möödalaskmiste ja katkestuste käsitlemine , samuti pakkus Alpha-põhistele süsteemidele, mis käitavad OpenVMS-i, juhiseid, mis nõuavad blokeeritud mälule juurdepääsu ja on sarnased VAX- arhitektuuri pakutavate juhistega . CMOS-protsessorid IBM System/390 protsessorid, alates G4 protsessorist, ja z/Architecture protsessorid kasutavad mõnede käskude rakendamiseks millikoodi . 
* B700 "mikroprotsessor" täidab rakendustaseme koode, kasutades põhimällu salvestatud 16-bitiste mikroinstruktsioonide jadasid; igaüks neist on kas registri laadimise operatsioon või kaardistatud üheks 56-bitiseks "nanokoodi" käsuks, mis on salvestatud kirjutuskaitstud mällu. See võimaldab suhteliselt lihtsal riistvaral toimida kas suurarvuti välisseadme kontrollerina või olla pakendatud eraldiseisva arvutina.
* B1700 on rakendatud radikaalselt erineva riistvaraga, sealhulgas bitiaadresseeritava põhimäluga, kuid sellel on sarnane mitmekihiline organisatsioon. Operatsioonisüsteem laadib eelnevalt üles tõlgi mis tahes keele jaoks. Need interpretaatorid esitlevad erinevaid virtuaalmasinaid COBOLi, Fortrani jne jaoks.
Rakendamine.
Mikroprogrammi iga mikrokäsklus annab bitid, mis kontrollivad funktsionaalseid elemente, mis sisemiselt moodustavad protsessori. Eeliseks kõvakoodiga protsessori ees on see, et protsessori sisemine juhtimine muutub arvutiprogrammi spetsialiseeritud vormiks. Mikrokood muudab seega keerulise elektroonilise disaini ülesande (protsessori juhtimine) vähem keeruliseks programmeerimisülesandeks. Selle eelise ärakasutamiseks on protsessor jagatud mitmeks osaks:
Samuti võib olla mälu aadressiregister ja mälu andmeregister, mida kasutatakse arvuti põhimälule juurdepääsuks. Koos moodustavad need elemendid " täitmisüksuse ". Enamikul tänapäevastel protsessoritel on mitu täitmisüksust. Isegi lihtsatel arvutitel on tavaliselt üks seade mälu lugemiseks ja kirjutamiseks ning teine kasutajakoodi käivitamiseks. Neid elemente saab sageli ühendada üheks tervikuks. See kiip on fikseeritud laiusega, mis moodustaks teostusüksusest "viilu". Neid tuntakse " bitiviilude " kiipidena. AMD Am2900 perekond on üks tuntumaid bitiviiluelementide näiteid. Täitmisüksuste osad ja terviküksused on omavahel ühendatud juhtmete kimbuga, mida nimetatakse siiniks .
Programmeerijad arendavad mikroprogramme, kasutades põhilisi tarkvaratööriistu. Mikroassembler võimaldab programmeerijal bittide tabelit sümboolselt defineerida. Tänu oma tihedale seosele alusarhitektuuriga on "mikrokoodil mitu omadust, mis raskendavad selle genereerimist kompilaatori abil." Simulaatorprogramm on mõeldud bittide täitmiseks samamoodi nagu elektroonika ning see annab mikroprogrammi silumiseks palju suurema vabaduse. Pärast mikroprogrammi valmimist ja põhjalikku testimist kasutatakse seda mõnikord sisendina arvutiprogrammile, mis loob loogika samade andmete genereerimiseks. See programm sarnaneb programmeeritava loogikamassiivi optimeerimiseks kasutatavatele programmidele. Isegi ilma täielikult optimaalse loogikata võib heuristiliselt optimeeritud loogika transistoride arvu oluliselt vähendada kirjutuskaitstud mälu (ROM) juhtsalvestuse jaoks vajalikust arvust. See vähendab protsessori tootmiskulusid ja selle poolt tarbitavat elektrit.
Mikrokoodi saab iseloomustada "horisontaalse" või "vertikaalsena", viidates peamiselt sellele, kas iga mikroinstruktsioon juhib protsessori elemente vähese või ilma dekodeerimiseta (horisontaalne mikrokood) või nõuab enne seda ulatuslikku dekodeerimist kombinatoorse loogika abil (vertikaalne mikrokood). Järelikult on iga horisontaalne mikroinstruktsioon laiem (sisaldab rohkem bitte) ja võtab rohkem salvestusruumi kui vertikaalne mikroinstruktsioon.
Horisontaalne mikrokood.
„Horisontaalses mikrokoodis on mitu eraldiseisvat mikrooperatsiooni, mis on kombineeritud üheks mikrokäsuks, et töötada samaaegselt.“ Horisontaalne mikrokood sisaldub tavaliselt üsna laias juhtimismälus; ei ole haruldane, et iga sõna on 108 bitti või rohkem. Iga järjestikuse taktimuutuse ajal loetakse mikrokoodi sõna, dekodeeritakse ja kasutatakse protsessori funktsionaalsete elementide juhtimiseks.
Tüüpilises rakenduses koosneb horisontaalne mikroprogrammi sõna üsna täpselt määratletud bitide rühmadest. Näiteks võib üks lihtne paigutus olla järgmine:
Sellise mikrokoodi puhul võib mikrokood nõuda kahe taktimuutust, et rakendada JUMP-käsklust, mille aadress järgneb opkoodile. Seda projekteeriv insener kirjutaks mikroassembleri lähtekoodi, mis näeb välja umbes nii:
 # Iga rida, mis algab numbrimärgiga, on kommentaar.
 # See on lihtsalt silt, tavaline viis, kuidas assemblerid sümboolselt esitavad
 # mälu aadressi.
 InstructionJUMP:
 # Järgmise käsu ettevalmistamiseks on käsu dekodeerimise mikrokood juba
 # liigutanud programmi loenduri mälu aadressiregistrisse. See käsk hangib
 # hüppekäsu sihtaadressi mälusõnast, mis järgneb mälusõnale
 # hüppe opkoodi, kopeerides mälu andmeregistrist mälu aadressiregistrisse.
 # See annab mälusüsteemile kaks taktimõõtu järgmise taktimõõtu noppimiseks
 # käsk mäluandmete registrisse, et seda saaks kasutada käsu dekodeerimiseks.
 # Järjekorra käsk „next“ tähendab lihtsalt 1 lisamist juhtimissõna aadressile.
 MDR, NONE, MAR, COPY, NEXT, NONE
 # See paigutab järgmise käsu aadressi PC-sse.
 # See annab mälusüsteemile tiksu, et lõpetada otsing, mida alustati
 # eelmise mikrokäsuga.
 # Järjekorra käsk on hüpata käsu dekodeerimise algusesse.
 MAR, 1, PC, ADD, JMP, InstructionDecode
 # Käskude dekodeerimine ei ole näidatud, sest see on tavaliselt segadus, väga konkreetne
 # täpselt emuleeritavale protsessorile. Isegi see näide on lihtsustatud.
 # Paljudel protsessoritel on mitmeid viise aadressi arvutamiseks, mitte ainult väljavõtete tegemiseks.
 # seda op-koodile järgnevast sõnast. Seega, selle asemel, et ainult üks
 # hüppekäsu asemel on neil protsessoritel perekond seotud hüppekäske.
Iga takti puhul on tavaline, et kasutatakse ainult osa protsessorist, ülejäänud mikrokäskude bittide rühmad on no-ops. Hoolika riistvara- ja mikrokoodidisaini korral saab seda omadust ära kasutada, et sooritada paralleelseid operatsioone, kasutades protsessori eri piirkondi; näiteks ülaltoodud juhul ei ole ALU-d esimese taktimuutuse ajal vaja, seega võib seda potentsiaalselt kasutada varasema aritmeetilise käsu täitmiseks.
Vertikaalne mikrokood.
Vertikaalses mikrokoodis on iga mikrokäsklus oluliselt kodeeritud, st bittiväljad läbivad üldiselt vahepealset kombineerimisloogikat, mis omakorda genereerib protsessori sisemiste elementide (ALU, registrid jne) juhtimis- ja järjestussignaalid. See on vastupidine horisontaalsele mikrokoodile, kus bittiväljad kas toodavad otse juhtimis- ja järjestussignaalid või on ainult minimaalselt kodeeritud. Sellest tulenevalt nõuab vertikaalne mikrokood väiksemat käsu pikkust ja vähem salvestusruumi, kuid selle dekodeerimiseks kulub rohkem aega, mille tulemuseks on aeglasem protsessoritakt. 
Mõni vertikaalne mikrokood on lihtsalt lihtsa tavalise arvuti assemblerkeel, mis emuleerib keerukamat arvutit. Mõned protsessorid, näiteks DEC Alpha protsessorid ja hilisemate IBM-i suurarvutite System/390 ja z/Architecture CMOS-mikroprotsessorid, kasutavad masinkoodi, mis töötab spetsiaalses režiimis, mis annab sellele juurdepääsu spetsiaalsetele käskudele, registritele ja muudele riistvararessurssidele, mis tavalisele masinkoodile kättesaamatud pole, et rakendada mõningaid käske ja muid funktsioone näiteks leheküljetabelite vahel käimisi Alpha protsessorites. Alpha protsessoritel nimetatakse seda PALcode'iks ja IBM-i suurarvuti protsessoritel millicode'iks .
Väljaga "select" valitakse, millist protsessori osa see juhtimissalvestuse sõna kontrollib. Välja väärtus kontrollib seda osa protsessorist. Seda tüüpi mikrokoodi puhul otsustab projekteerija selgesõnaliselt teha aeglasema protsessori, et säästa raha, vähendades kasutamata bitide arvu juhtimissalves; vähendatud keerukus võib aga suurendada protsessori taktsagedust, mis vähendab suurenenud tsüklite arvu mõju ühe käsu kohta.
Kuna transistorid muutusid odavamaks, hakkas mikrokoodi kasutavate protsessorite projekteerimisel domineerima horisontaalne mikrokood ja vertikaalset mikrokoodi kasutati harvemini.
Kui kasutatakse nii vertikaalset kui ka horisontaalset mikrokoodi, võib horisontaalset mikrokoodi nimetada nanokoodiks või pikokoodiks. 
Kirjutatav juhtmälu.
Mõned arvutid ehitati kirjutatavat mikrokoodi kasutades. Selle konstruktsiooni puhul salvestatakse mikrokood ROMi või kõvakoodiga ühendatud loogika asemel mikrokood RAM-i, mida nimetatakse kirjutatavaks kontrollsalveks (WCS). Sellist arvutit nimetatakse mõnikord kirjutatavaks käsurea arvutiks (WISC). 
Paljud eksperimentaalsed prototüüparvutid kasutavad kirjutatavaid juhtmäluseadmeid ; on ka kommertsmasinaid, mis kasutavad kirjutatavat mikrokoodi, näiteks Burroughs Small Systems, varased Xeroxi tööjaamad, DEC VAX 8800 ( "Nautilus" ) perekond, Symbolics L- ja G-masinad, mitmed IBM System/360 ja System/370 rakendused, mõned DEC PDP-10 masinad ja Data General Eclipse MV/8000 . 
IBM System/370 sisaldab funktsiooni "Initial-Microprogram Load" ( "IML" või "IMPL" ) , mida saab käivitada konsoolist, "sisselülituslähtestuse" ( "POR" ) osana või mõnelt teiselt protsessorilt tihedalt seotud mitmeprotsessorilises kompleksis.
Mõnedel kommertsmasinatel, näiteks IBM 360/85- on mikrokoodi jaoks nii kirjutuskaitstud kui ka kirjutatav juhtmälu.
WCS pakub mitmeid eeliseid, sealhulgas mikroprogrammi paikamise lihtsust ja teatud riistvarapõlvkondade puhul kiiremat juurdepääsu kui ROM-id suudavad pakkuda. Kasutaja programmeeritav WCS võimaldab kasutajal masinat konkreetseteks eesmärkideks optimeerida.
Alates Pentium Pro-st 1995. aastal on mitmel x86 protsessoril kirjutatav Inteli mikrokood . See on näiteks võimaldanud parandada Intel Core 2 ja Intel Xeoni mikrokoodide vigu nende mikroprogrammide lappimise teel, selle asemel et nõuda tervete kiipide väljavahetamist. Teine silmapaistev näide on mikrokoodiparanduste komplekt, mida Intel pakkus mõnele oma kuni 10 aasta vanusele protsessoriarhitektuurile, et võidelda 2018. aasta alguses avalikuks tulnud disainilahendustes – Spectre ja Meltdown – avastatud turvanõrkustega Mikrokoodi värskenduse saab installida Linuxi, FreeBSD, Microsoft Windowsi või emaplaadi BIOS-i kaudu.
Mõned masinad pakuvad lisavarustusena kasutaja programmeeritavaid kirjutatavaid juhtmäluseadmeid, sealhulgas HP 2100, DEC PDP-11/60, TI-990 /12 ja Varian Data Machines V-70 seeria miniarvutid .
Võrdlus VLIW ja RISC-ga.
Tugevalt mikrokodeeritud ja keerukate käskudega protsessorite väljatöötamise suundumus algas 1960ndate alguses ja jätkus umbes 1980ndate keskpaigani. Sel ajal hakkas RISC-kujundusfilosoofia üha enam esile kerkima.
Mikrokoodi kasutaval protsessoril kulub ühe käsu täitmiseks tavaliselt mitu taktsüklit, üks taktsükkel iga sammu kohta selle käsu mikroprogrammis. Mõned CISC-protsessorid sisaldavad juhiseid, mille täitmine võib võtta väga kaua aega. Sellised variatsioonid häirivad nii katkestuste latentsust kui ka, mis on kaasaegsetes süsteemides palju olulisem, pipelinegi .
Uue protsessori projekteerimisel on juhtmega juhtimisega RISC-l mikrokodeeritud CISC-i ees järgmised eelised:
On ka vastuväiteid:
Paljud RISC- ja VLIW -protsessorid on loodud iga käsu (kui see on vahemälus) täitmiseks ühe tsükli jooksul. See on väga sarnane sellele, kuidas mikrokoodiga protsessorid täidavad ühe mikroinstruktsiooni tsükli kohta. VLIW protsessoritel on juhised, mis käituvad sarnaselt väga laia horisontaalse mikrokoodiga, kuigi tavaliselt puudub neil selline peenhäälestatud kontroll riistvara üle nagu mikrokoodil. RISC-käsud on mõnikord sarnased kitsa vertikaalse mikrokoodiga.
Mikrokood on olnud populaarne rakenduspõhistes protsessorites, näiteks võrguprotsessorites, digitaalsignaaliprotsessorites, kanalikontrollerites, kettakontrollerites, võrguliidese kontrollerites, välkmälu kontrollerites, graafikaprotsessorites ja muus riistvaras.
Mikrooperatsioonid.
Kaasaegsed CISC implementatsioonid, näiteks x86 perekond alates NexGen Nx586-st, Intel Pentium Pro ja AMD K5-st, dekodeerivad käsud dünaamiliselt puhverdatud mikrooperatsioonideks, kasutades RISC-i või traditsioonilise mikrokoodiga sarnast käskude kodeeringut. Juhtmega ühendatud käskude dekodeerimisüksus väljastab otse mikrooperatsioone tavaliste x86 käskude jaoks, kuid keerukamate või harva kasutatavate käskude jaoks kasutab see traditsioonilisemat mikrokoodi ROM-i, mis sisaldab mikrooperatsioone. 
Näiteks võib x86 otsida mikrokoodist mikrooperatsioone, et käsitleda keerulisi mitmeastmelisi operatsioone, nagu tsükli- või stringikäsud, ujukomaühiku transtsendentaalsed funktsioonid või ebatavalised väärtused, näiteks ebanormaalsed arvud, ja eriotstarbelised käsud, näiteks CPUID .