Hlavní navigace

Vznik mikrořadičů: čtyřbitový MCU Atmel MARC4

Pavel Tišnovský

Mikrořadič TMS 1000, s nímž jsme se seznámili minule, nebyl jediným zástupcem čtyřbitových mikrořadičů. Novějším čipem založeným na čtyřbitové ALU je mikrořadič nazvaný MARC4.

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

5. Architektura čipů MARC4

6. Paměti RAM, ROM, zásobníky a jejich použití

7. Programátorský model – sada registrů

8. Instrukční soubor čipů MARC4

9. Aritmetické instrukce

10. Logické instrukce

11. Rotace a posuny

12. Skoky, volání podprogramů

13. Operace se zásobníkem operandů a zásobníkem návratových adres

14. Načtení konstant

15. Další instrukce

16. Odkazy na Internetu

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:

  1. Programovou paměť (ROM) o kapacitě 2048×8 bitů nebo 4096×8 bitů.
  2. Datovou paměť (RAM) o kapacitě 256×4 bity.
  3. Čtyřbitovou aritmeticko-logickou jednotku (ALU).
  4. Programový čítač (PC).
  5. Čtveřici adresových registrů RP, SP, X a Y.
  6. Registr TOS obsahující prvek umístěný na vrcholu zásobníku operandů.
  7. Registr CCR s dvojicí příznaků carry a branch.
  8. Sběrnici, po níž se přenáší instrukce.
  9. Sběrnici, po níž se přenáší adresy do ROM.
  10. Sběrnici, po níž se přenáší data.
  11. 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 carrybranch

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

  1. Zero-power Microcontrollers for Low-power and High-temperature Applications
    http://en.wikichip.org/w/i­mages/1/17/Atmel_MARC4_brochu­re.pdf
  2. MARC4 Micro-Controller (Wikipedia)
    https://en.wikipedia.org/wi­ki/MARC4_Micro-Controller
  3. MARC4 – Atmel
    https://en.wikichip.org/wi­ki/atmel/marc4
  4. MARC 4bit Microcontrollers Programmer's Guide
    https://en.wikichip.org/w/i­mages/4/44/MARC4_4-bit_Microcontrollers_Program­mer%27s_Guide.pdf
  5. MARC4 User's Guide qFORTH Compiler
    https://en.wikichip.org/w/i­mages/2/25/MARC4_User%27s_Gu­ide_qFORTH_Compiler.pdf
  6. Programovací jazyk Forth a zásobníkové procesory
    http://www.root.cz/clanky/programovaci-jazyk-forth-a-zasobnikove-procesory/
  7. Seriál Programovací jazyk Forth
    http://www.root.cz/serialy/pro­gramovaci-jazyk-forth/
  8. Programovací jazyk Factor
    http://www.root.cz/clanky/programovaci-jazyk-factor/
  9. Grafický metaformát PostScript
    http://www.root.cz/clanky/graficky-metaformat-postscript/
  10. PMOS
    https://en.wikipedia.org/wi­ki/PMOS_logic
  11. NMOS
    https://en.wikipedia.org/wi­ki/NMOS_logic
  12. CMOS
    https://en.wikipedia.org/wiki/CMOS
  13. Vacuum Fluorescent Display
    https://en.wikipedia.org/wi­ki/Vacuum_fluorescent_dis­play
  14. Computer History Museum: TMS 1000 4-Bit microcontroller
    http://www.computerhistory­.org/collections/catalog/102711697
  15. Texas Instruments TMS1000 microcontroller family
    http://www.cpu-world.com/CPUs/TMS1000/
  16. Invention History of Microcontroller
    http://www.circuitstoday.com/mi­crocontroller-invention-history
  17. TMS1000 Series – TI
    https://en.wikichip.org/wi­ki/ti/tms1000
  18. TMX1795 – TI
    https://en.wikichip.org/wi­ki/ti/tmx1795
  19. Milton Bradley Microvision (U.S.) (1979, LCD, 9 Volt (1 or 2), Model# 4952)
    http://www.handheldmuseum­.com/MB/uVUS.htm
  20. 8051 Microcontroller
    http://www.circuitstoday.com/8051-microcontroller
  21. 4-bit (computer architectures)
    https://en.wikipedia.org/wiki/4-bit
  22. TMS 1000 Data Manual
    http://blog.kevtris.org/blog­files/TMS_1000_Data_Manual­.pdf
  23. Considerations for 4-bit processing
    http://www.embeddedinsights­.com/channels/2010/12/10/con­siderations-for-4-bit-processing/
  24. Are you, or would you consider, using a 4-bit microcontroller?
    http://www.embeddedinsights­.com/channels/2010/11/24/a­re-you-or-would-you-consider-using-a-4-bit-microcontroller/
  25. MARC4 Micro-Controller
    https://en.wikipedia.org/wi­ki/MARC4_Micro-Controller
  26. The Texas Instruments TMX 1795: the (almost) first, forgotten microprocessor
    http://www.righto.com/2015/05/the-texas-instruments-tmx-1795-first.html
  27. O2 Homepage
    http://www.the-nextlevel.com/odyssey2/
  28. Magnavox Odyssey2 (1978), Philips Videopac G7000 / C52 (1979)
    http://www.mess.org/sysinfo:odyssey2
  29. The Video Game Critic's Odyssey 2 Reviews
    http://videogamecritic.net/odd.htm
  30. Computer Closet Collection: Magnavox Odyssey2
    http://www.computercloset­.org/MagnavoxOdyssey2.htm
  31. PHILIPS Videopac C52
    http://old-computers.com/museum/compu­ter.asp?c=1060
  32. O2 Tech. Manual V.1.1 (PDF dokument)
    http://www.atarihq.com/dan­b/files/o2doc.pdf
  33. Magnavox Odyssey2
    http://www.game-machines.com/consoles/odyssey2.php
  34. Magnavox Odyssey2 (Wikipedia EN)
    http://en.wikipedia.org/wi­ki/Odyssey2
  35. Magnavox Odyssey2 Games (Wikipedia EN)
    http://en.wikipedia.org/wi­ki/List_of_Videopac_games
Našli jste v článku chybu?
7. 4. 2017 23:13
mhi (neregistrovaný)

Elegantni mi prijde zejmena ta moznost dynamicky menit instrukce, napr. si dodefinovat nejake bitove operace pro sifrovani, nebo jine vypocetne narocne veci (to ma na 4bitu fungujicim treba na 10MHz smysl, ze ? :) ).

Post o sin/cos/nasobic­ce/apod mne inspiroval k tomu, ze by mozna stalo za to tam dat ROM/RAMku na lookupy hodnot! Do mikrokodu to cpat je blbost, ale udelat bit na pripojeni lookupovaci fce(ROM/RAM) na sbernici uz smysl dava.

7. 4. 2017 20:21
atarist (neregistrovaný)

No pro ctyrbitovyho svaba zadnou ALU ani nepotrebujes, staci dostatecne velka ROM 2^12x4 bity:

- 2 bity adresy pro vyber operace - 4 bity pro prvni operand - 4 bity pro druhy operand

Co se precte z ROM je vysledek. Klidne si tak muzes udelat i nasobicku.

PS: kurnik to zacina vypadat dost elegantne, asi si 4bit taky udelam!