Obsah
1. Vznik mikrořadičů: čtyřbitový MCU Atmel MARC4
2. Mikrořadiče uvedené na trh po TMS 1000
3. Základní parametry mikrořadičů MARC4
4. Energetické nároky čipu v různých režimech činnosti
6. Paměti RAM, ROM, zásobníky a jejich použití
7. Programátorský model – sada registrů
8. Instrukční soubor čipů MARC4
13. Operace se zásobníkem operandů a zásobníkem návratových adres
1. Vznik mikrořadičů: čtyřbitový MCU Atmel MARC4
Čtyřbitový mikrořadič TMS 1000, s nímž jsme se seznámili v předchozí části seriálu o architekturách počítačů, patřil společně s čipem µCOM-4 mezi vůbec první mikrořadiče používané v různých řídicích aplikacích, pro ovládání jednoduchých displejů, počitadel, kalkulaček atd. I přes velký úspěch tohoto čipu, kterého se prodalo minimálně 100 milionů kusů (což je s ohledem na dobu vzniku skutečně velké číslo) se však po uvedení mikrořadiče Intel 8048 zdálo, že budoucnost bude patřit výkonnějším mikrořadičům založeným na osmibitové aritmeticko-logické jednotce. To se později skutečně vyplnilo, především po uvedení řady Intel 8051 (MCS 51), konkurenční 68HC05/68HC08 a taktéž mikrořadičů řady PIC 16×84 (zejména 16C84 a 16F84). Ovšem i pro zdánlivě překonané čtyřbitové mikrořadiče se našlo využití, a to v těch oblastech, kde je mikrořadič napájen z baterie, nemusí provádět žádnou složitou činnost a přitom se od něj vyžaduje funkčnost i v extrémnějších podmínkách. A právě v této oblasti se mj. prosadil čip MARC4.
Obrázek 1: Čtyřbitový mikrořadič TMS 1000 ve variantě s 28 piny. Kromě toho existují i rozšířené varianty se čtyřiceti piny.
2. Mikrořadiče uvedené na trh po TMS 1000
Na druhém obrázku, který naleznete pod tímto odstavcem, je zjednodušeně naznačen vývoj mikrořadičů, které byly běžně dostupné na trhu, tj. nejedná se o mikrořadiče, jenž by využíval pro své potřeby jen jejich výrobce (což byla například doména firmy Texas Instruments, která kvůli tomuto zvyku poněkud zaostala za Intelem). Žlutě označené mikrořadiče jsou čtyřbitové, zeleně označené mikrořadiče (u Motoroly i dva procesory, které mikrořadičům předcházely) osmibitové a modrou barvou jsou označeny mikrořadiče částečně či zcela šestnáctibitové. Toto rozdělení je založeno na porovnání šířky operandů zpracovávaných v aritmeticko-logických jednotkách, nikoli například na základě šířky instrukcí či šířky sběrnice programové paměti (i TMS 1000 měl osmibitové instrukce, mikrořadiče PIC mají šířku instrukcí 12, 14, 16 či 24 bitů). Mimochodem, všechny zeleně označené čipy již byly v tomto seriálu popsány.
Obrázek 2: Zjednodušený vývoj základních větví čtyřbitových, osmibitových a některých šestnáctibitových mikrořadičů.
3. Základní parametry mikrořadičů MARC4
Čipy MARC4 jsou určeny do zařízení napájených baterií a/nebo nekvalitními zdroji, protože nemají vysoký příkon a ani nevyžadují stabilizované napětí (ostatně vlastní stabilizátor by pravděpodobně měl větší spotřebu i cenu, než samotný mikrořadič). Na čipu je samozřejmě detektor poklesu napájecího napětí (brown out) s konfigurovatelným chováním. Tyto mikrořadiče lze používat v poměrně velkém rozsahu teplot od –40°C do 125°C. Kromě paměti programu (šířka osm bitů) a datové paměti (šířka čtyři bity) mají některé čipy i EEPROM a jedna varianta MARC4 obsahuje i RF vysílač. Další parametry jsou vypsány v následující tabulce:
Čip | ROM | RAM | EEPROM | I/O piny | RF vysílač |
---|---|---|---|---|---|
ATAR080 | 2048×8 | 256×4 | × | 12 | × |
ATAR080 | 2048×8 | 256×4 | × | 12 | × |
ATAR890 | 2048×8 | 256×4 | 32×16 | 12 | × |
ATAR092 | 2048×8 | 256×4 | × | 16 | × |
ATAR892 | 2048×8 | 256×4 | 32×16 | 16 | × |
ATAR510 | 4096×8 | 256×4 | × | 34 | × |
ATAR862 | 4096×8 | 256×4 | × | 11 | 315, 433, 868 a 915 MHz |
Mezi aplikační oblasti mikrořadičů MARC4 patří například vzdálené ovládání dveří (u garáže, vchodové dveře se zadáním kódu…), ovládání klimatizace (jak vlastní jednotky, tak i „krabičky“ s displeji), vzdálené zapínaní zásuvek, meteorologické stanice, počítače pro jízdní kola (tam se pravděpodobně používá dodnes), sledování a řízení jednodušších procesů ve výrobě, alarmy atd.
Poznámka: na rozdíl od většiny současných osmibitových mikrořadičů nenajdeme na čipech MARC4 velké množství periferních modulů – D/A a A/D převodníků, PWM atd. To opět odpovídá aplikační oblasti, v níž byly tyto čipy nasazovány.
4. Energetické nároky čipu v různých režimech činnosti
Jedním z velmi důležitých a pro mnohé aplikace i nejdůležitějších parametrů čtyřbitových mikrořadičů je jejich spotřeba. V případě čipů MARC4 je spotřeba určena především režimem, v němž se mohl mikrořadič nacházet a mezi nimiž se bylo možné přepínat. V následující tabulce je zobrazen typický proudový odběr čipů napájených napětím od 1,8 V (dnes by se asi použila technologie s ještě nižším napětím) ve čtyřech různých režimech:
Režim | Odběr | Oscilátor | Jádro | Periferní moduly | Poznámka |
---|---|---|---|---|---|
Deep-sleep | 0,1 µA | zastaven | zastaveno | zastaveny | čekání na přerušení |
Sleep | 0,6 µA | 32 kHz | běží | zastaveno | čekání na přerušení |
Power-down | 70 µA | 4 MHz | běží | zastaveno | čekání na přerušení |
Active | 300 µA | 4 MHz | běží | běží | × |
Poznámka: pokud by tyto čipy byly upraveny tak, aby používaly dnešní technologie s nižšími napájecími napětími, byla by samozřejmě jejich reálná spotřeba ještě nižší. Ovšem s obecným snížením spotřeby použitím lepší technologie se dosáhlo takového stavu, že se namísto čtyřbitových čipů začaly používat výkonnější čipy osmibitové, a to i v těch oblastech, kde se plně nevyužije jejich potenciál (to však samozřejmě není pro většinu aplikací to hlavní kritérium :-).
5. Architektura čipů MARC4
Zjednodušené schéma čtyřbitových mikrořadičů MARC4 je zobrazeno na třetím obrázku umístěném pod tímto odstavcem. Můžeme zde vidět všechny důležité části čipu, především pak:
- Programovou paměť (ROM) o kapacitě 2048×8 bitů nebo 4096×8 bitů.
- Datovou paměť (RAM) o kapacitě 256×4 bity.
- Čtyřbitovou aritmeticko-logickou jednotku (ALU).
- Programový čítač (PC).
- Čtveřici adresových registrů RP, SP, X a Y.
- Registr TOS obsahující prvek umístěný na vrcholu zásobníku operandů.
- Registr CCR s dvojicí příznaků carry a branch.
- Sběrnici, po níž se přenáší instrukce.
- Sběrnici, po níž se přenáší adresy do ROM.
- Sběrnici, po níž se přenáší data.
- Sběrnici, po níž se přenáší adresy do RAM.
Obrázek 3: Zjednodušené schéma čtyřbitových mikrořadičů MARC4.
6. Paměti RAM, ROM, zásobníky a jejich použití
Paměť ROM, tedy programová paměť, má strukturu 2048×8 bitů či 4096×8 bitů, tj. přistupuje se k ní po bajtech. Některé instrukce mají délku dvou bajtů a musí být zpracovány ve dvou cyklech. Naproti tomu datová paměť má strukturu 256×4 bity a běžné instrukce (až na několik výjimek) k ní skutečně takto přistupují – všechny operandy mají šířku pouhé čtyři bity (což je poměrně elegantní). Mezi zmíněné výjimky patří instrukce ukládající do RAM návratové adresy, které mají šířku 12 bitů.
Mikrořadič MARC4 se většinou neprogramuje přímo v assembleru, ale v programovacím jazyku FORTH, čemuž byla do značné míry podřízena i interní struktura čipu a současně i jeho instrukční sada. Pokud se podíváme na schéma MARC4 uvedené v předchozí kapitole, můžeme vidět, že k aritmeticko-logické jednotce je jak na vstup, tak i na výstup připojen registr TOS (Top of Stack), zatímco druhý operand je buď načten z paměti ROM (instrukce LIT) či z paměti RAM (velké množství instrukcí). Při načítání druhého operandu lze použít adresu umístěnou v registru SP, X, Y či RP – každý z těchto registrů je osmibitový a tudíž při adresování obsáhne celou RAM. Většina instrukcí tedy do ALU předává obsah čtyřbitového registru TOS (ten lze tedy považovat za akumulátor) a čtyřbitovou hodnotu načtenou z RAM. V průběhu ALU operace se navíc většinou modifikuje obsah jednoho adresového registru, většinou SP.
7. Programátorský model – sada registrů
Všechny registry viditelné programátorům jsme již viděli na třetím obrázku v páté kapitole. Šířky registrů a jejich popis je uveden v tabulce:
Registr | Šířka | Význam |
---|---|---|
PC | 12 (13) bitů | adresa následující instrukce načítané z paměti ROM. |
RP | 8 bitů | ukazuje na vrchol zásobníku návratových adres, který je umístěný v RAM |
SP | 8 bitů | ukazuje na druhý prvek uložený na zásobníku operandů, který je umístěný v RAM |
X | 8 bitů | obecný (index) registr použitý při adresování |
Y | 8 bitů | obecný (index) registr použitý při adresování |
TOS | 4 bity | obsahuje operand umístěný na vrcholu zásobníku operandů (rychlejší přístup) |
CCR | 4 bity | pouze dva bity jsou obsazeny příznaky carry a branch |
První tři registry se většinou používají nepřímo, protože registr PC je automaticky měněn jak při provádění sekvenčního programu, tak i při skocích, voláních subrutin (podprogramů) a návratech ze subrutin. Registr RP ukazuje na vrchol zásobníku návratových adres, takže se jeho hodnota mění při ukládání adres či dat na tento zásobník. Podobně je tomu u registru SP, jehož hodnota je modifikována při prakticky jakýchkoli aritmetických či logických instrukcích. Registry X a Y jsou dostupné programátorům, kteří je mohou používat při adresování (takže odpovídají běžným proměnným). Registr TOS je na čipu umístěn kvůli rychlejšímu provádění všech ALU instrukcí, protože obsahuje prvek na vrcholu zásobníku operandů (ten se tedy nemusí stále načítat a ukládat z/do RAM).
8. Instrukční soubor čipů MARC4
Základní instrukce čipů MARC4 mají šířku osmi bitů, takže se celý instrukční soubor může teoreticky skládat až z 256 instrukcí. Ve skutečnosti je instrukcí mnohem méně (cca 70), protože operační kód má šířku jen 2, 4 či 8 bitů, přičemž zbytek bajtu je použit pro data, ať již pro konstanty (literály) o šířce čtyř bitů, tak o adresy. Existuje celkem pět formátů instrukcí, přičemž u prvních třech formátů mají instrukce délku osm bitů (jeden bajt, jeden cyklus) a u posledních dvou formátů mají instrukce délku šestnácti bitů (dva bajty, dva cykly pro zpracování):
Typ instrukce | Operační kód | Data | Adresa | Celkem |
---|---|---|---|---|
Bez operandů | 8 | 0 | 0 | 8 |
Konstanta 4b | 4 | 4 | 0 | 8 |
Krátká adresa v ROM 6b | 2 | 0 | 6 | 8 |
Dlouhá adresa v ROM 12b | 4 | 0 | 12 | 16 |
Adresa v RAM 8b | 8 | 0 | 8 | 16 |
Poznámka: naprostá většina instrukcí pracuje s operandy uloženými na zásobníku a proto je u nich použit první formát. Třetí formát se taktéž používá často, neboť je použit u krátkých (short) skoků i pro volání blízkých subrutin – a takových skoků je díky velké hustotě kódu většina.
Obrázek 4: Obsazení všech 256 osmibitových kombinací instrukcemi (zdroj: Atmel).
9. Aritmetické instrukce
Čip MARC4 podporuje celkem sedm aritmetických instrukcí. Všechny tyto instrukce pracují s příznaky carry a branch, které nastavují shodně na hodnotu 1 (přenos) či 0 (bez přenosu). Výjimkou jsou poslední dvě instrukce INC a DEC, které nastaví příznak branch ve chvíli, kdy je výsledek nulový. Důvod je prostý – implementace počítaných programových smyček:
Instrukce | Význam |
---|---|
ADD | součet dvou operandů na nejvyšších místech zásobníku + nastavení příznaků |
ADDC | dtto, ale k součtu se připočte i hodnota příznaku carry |
SUB | rozdíl dvou operandů na nejvyšších místech zásobníku |
SUBB | dtto, ale navíc se přičte i znegovaná hodnota příznaku carry |
DAA | pokud je hodnota na TOS větší než 9, přičte se k ní konstanta 6 a nastaví se příznaky |
INC | zvýšení hodnoty uložené na TOS o jedničku + nastavení příznaku branch |
DEC | snížení hodnoty uložené na TOS o jedničku + nastavení příznaku branch |
Poznámka: přenos (logicky) nastane už ve chvíli, kdy je vypočtená hodnota větší než 15.
10. Logické instrukce
Následují logické instrukce prováděné nad jedním či dvěma čtyřbitovými nibbly uloženými na vrcholu zásobníku operandů. Tyto instrukce nastavují příznak branch podle toho, zda je výsledek instrukce nulový či naopak nenulový. Opět se jedná o praktické chování, neboť těmito instrukcemi lze implementovat například složitější podmínky v konstrukci if-then-else:
Instrukce | Význam |
---|---|
AND | logický součin nad čtyřbitovými nibbly uloženými na nejvyšších místech zásobníku |
OR | logický součet |
XOR | logická nonekvivalence |
NOT | negace nibblu uloženého na TOS |
11. Rotace a posuny
Instrukce pro rotace a posuny pracují s hodnotou uloženou na vrcholu zásobníku operandů a navíc i s příznaky branch a carry. Jedná se o tyto čtyři instrukce:
Instrukce | Význam |
---|---|
SHL | logický posun čtyřbitové hodnoty doleva, nejvyšší bit se vysune do carry/branch |
SHR | logický posun čtyřbitové hodnoty doprava, nejnižší bit se vysune do carry/branch |
ROL | rotace čtyřbitové hodnoty doleva přes carry (hodnota je na TOS) |
ROR | rotace čtyřbitové hodnoty doprava přes carry (hodnota je na TOS) |
12. Skoky, volání podprogramů
Dalších pět instrukcí je určeno pro provedení skoků, volání podprogramů (subrutin) a návrat z podprogramů. Povšimněte si, že skoky a volání podprogramů existují vždy ve dvou variantách – „dlouhé“ a „krátké“. Důvod jsme si již vysvětlili v osmé kapitole: krátké skoky používají instrukci o délce jednoho bajtu vykonané v jediném cyklu zatímco dlouhé skoky vyžadují dvoubajtové a dvoucyklové instrukce:
Instrukce | Význam |
---|---|
BRA | podmíněný skok při splnění branch==1 (dlouhá varianta s 12bitovou adresou) |
SBRA | podmíněný skok při splnění branch==1 (krátká varianta se šestibitovou adresou) |
CALL | volání podprogramu (dlouhá varianta s 12bitovou adresou) |
SCALL | volání podprogramu (krátká varianta se šestibitovou adresou) |
EXIT | návrat z podprogramu (obnova PC ze zásobníku návratových adres) |
Poznámka: jméno poslední instrukce EXIT sice může vypadat poněkud nepatřičně, protože na jiných architekturách se spíše setkáme s instrukcí RET, ovšem čipy MARC4 odvozují názvy instrukcí především od programovacího jazyka FORTH.
13. Operace se zásobníkem operandů a zásobníkem návratových adres
Poměrně velká skupina instrukcí je určena pro manipulaci se zásobníkem operandů. Nalezneme zde především instrukce odpovídající stejně či podobně pojmenovaným slovům z programovacího jazyka FORTH:
Instrukce | Význam |
---|---|
DUP | zduplikování hodnoty uložené na vrcholu zásobníku operandů |
DROP | odstranění hodnoty z vrcholu zásobníku operandů |
SWAP | prohození dvou nejvyšších prvků na vrcholu zásobníku operandů |
OVER | prvek pod TOS se zduplikuje a uloží na TOS (zásobník se zvětší o jeden prvek) |
ROT | rotace tří nejvyšších prvků (třetí prvek se přesune na TOS) |
DROPR | odstranění hodnoty z vrcholu zásobníku návratových adres |
2>R | přesun dvou prvků na zásobník návratových adres |
3>R | přesun tří prvků na zásobník návratových adres |
2R@ | přesun dvou prvků ze zásobníku návratových adres na zásobník operandů |
3R@ | přesun tří prvků ze zásobníku návratových adres na zásobník operandů |
14. Načtení konstant
V této kapitole se seznámíme s jedinou instrukcí určenou pro načtení čtyřbitové konstanty na vrchol zásobníku operandů. Tato instrukce je tvořena jediným bajtem, protože operační kód má šířku 4 bity a další čtyři bity jsou tvořeny vlastní konstantou, což je velmi elegantní řešení ukazující jednu z výhod čtyřbitových mikrořadičů (pokud nám samozřejmě stačí pracovat s čtyřbitovými hodnotami):
Instrukce | Význam |
---|---|
LITn | načtení čtyřbitové konstanty na TOS |
15. Další instrukce
Mezi další instrukce mikrořadiče MARC4 patří například instrukce určené pro přímou manipulaci s příznaky carry a branch, instrukce pro porovnání dvou operandů a nastavení příznaku branch na základě výsledku porovnání a především pak sada instrukcí typu LOAD & STORE, které používají adresovací režimy s registry X a Y. Podporovány jsou i instrukce, které po načtení či uložení operandu provedou automatickou inkrementaci či dekrementaci adresového registru atd. Nesmíme zapomenout ani na instrukce určené pro implementaci počítaných programových smyček, jejichž sémantika vychází z možností programovacího jazyka FORTH. Všechny zmíněné instrukce si podrobněji popíšeme v navazující části seriálu.
16. Odkazy na Internetu
- Zero-power Microcontrollers for Low-power and High-temperature Applications
http://en.wikichip.org/w/images/1/17/Atmel_MARC4_brochure.pdf - MARC4 Micro-Controller (Wikipedia)
https://en.wikipedia.org/wiki/MARC4_Micro-Controller - MARC4 – Atmel
https://en.wikichip.org/wiki/atmel/marc4 - MARC 4bit Microcontrollers Programmer's Guide
https://en.wikichip.org/w/images/4/44/MARC4_4-bit_Microcontrollers_Programmer%27s_Guide.pdf - MARC4 User's Guide qFORTH Compiler
https://en.wikichip.org/w/images/2/25/MARC4_User%27s_Guide_qFORTH_Compiler.pdf - Programovací jazyk Forth a zásobníkové procesory
http://www.root.cz/clanky/programovaci-jazyk-forth-a-zasobnikove-procesory/ - Seriál Programovací jazyk Forth
http://www.root.cz/serialy/programovaci-jazyk-forth/ - Programovací jazyk Factor
http://www.root.cz/clanky/programovaci-jazyk-factor/ - Grafický metaformát PostScript
http://www.root.cz/clanky/graficky-metaformat-postscript/ - PMOS
https://en.wikipedia.org/wiki/PMOS_logic - NMOS
https://en.wikipedia.org/wiki/NMOS_logic - CMOS
https://en.wikipedia.org/wiki/CMOS - Vacuum Fluorescent Display
https://en.wikipedia.org/wiki/Vacuum_fluorescent_display - Computer History Museum: TMS 1000 4-Bit microcontroller
http://www.computerhistory.org/collections/catalog/102711697 - Texas Instruments TMS1000 microcontroller family
http://www.cpu-world.com/CPUs/TMS1000/ - Invention History of Microcontroller
http://www.circuitstoday.com/microcontroller-invention-history - TMS1000 Series – TI
https://en.wikichip.org/wiki/ti/tms1000 - TMX1795 – TI
https://en.wikichip.org/wiki/ti/tmx1795 - Milton Bradley Microvision (U.S.) (1979, LCD, 9 Volt (1 or 2), Model# 4952)
http://www.handheldmuseum.com/MB/uVUS.htm - 8051 Microcontroller
http://www.circuitstoday.com/8051-microcontroller - 4-bit (computer architectures)
https://en.wikipedia.org/wiki/4-bit - TMS 1000 Data Manual
http://blog.kevtris.org/blogfiles/TMS_1000_Data_Manual.pdf - Considerations for 4-bit processing
http://www.embeddedinsights.com/channels/2010/12/10/considerations-for-4-bit-processing/ - Are you, or would you consider, using a 4-bit microcontroller?
http://www.embeddedinsights.com/channels/2010/11/24/are-you-or-would-you-consider-using-a-4-bit-microcontroller/ - MARC4 Micro-Controller
https://en.wikipedia.org/wiki/MARC4_Micro-Controller - The Texas Instruments TMX 1795: the (almost) first, forgotten microprocessor
http://www.righto.com/2015/05/the-texas-instruments-tmx-1795-first.html - O2 Homepage
http://www.the-nextlevel.com/odyssey2/ - Magnavox Odyssey2 (1978), Philips Videopac G7000 / C52 (1979)
http://www.mess.org/sysinfo:odyssey2 - The Video Game Critic's Odyssey 2 Reviews
http://videogamecritic.net/odd.htm - Computer Closet Collection: Magnavox Odyssey2
http://www.computercloset.org/MagnavoxOdyssey2.htm - PHILIPS Videopac C52
http://old-computers.com/museum/computer.asp?c=1060 - O2 Tech. Manual V.1.1 (PDF dokument)
http://www.atarihq.com/danb/files/o2doc.pdf - Magnavox Odyssey2
http://www.game-machines.com/consoles/odyssey2.php - Magnavox Odyssey2 (Wikipedia EN)
http://en.wikipedia.org/wiki/Odyssey2 - Magnavox Odyssey2 Games (Wikipedia EN)
http://en.wikipedia.org/wiki/List_of_Videopac_games