Hlavní navigace

Mikrořadiče a DSP společnosti Infineon – vylepšená šestnáctibitová jádra C166S V2

Pavel Tišnovský

Některé novější 16bitové mikrořadiče firmy Infineon jsou založeny na vylepšených jádrech C166S V2. Jedná se o třetí generaci jader z rodiny C166, která je zpětně kompatibilní, ovšem je výkonnější a obsahuje i modul pro DSP operace.

Doba čtení: 18 minut

Sdílet

11. Obejití funkce stránkových registrů DPP instrukcemi EXT??

12. DSP operace

13. Nové adresovací režimy pro DSP operace

14. Instrukce ATOMIC

15. Odkazy na Internetu

1. Mikrořadiče a DSP společnosti Infineon – vylepšená šestnáctibitová jádra C166S V2

Původní šestnáctibitová mikrořadičová jádra C166, s nimiž jsme se seznámili v předchozím článku, sice nabízela dostatečný výpočetní výkon pro mnoho řídicích aplikací, ovšem ve chvíli, kdy bylo nutné provádět nějaké DSP operace (zesílení/zeslabení, konvoluce, korelace, FIR) již bylo výhodnější přejít na výkonnější mikrořadič, digitální signálový procesor či ještě lépe na kombinaci MCU+DSP. Jádra pojmenovaná C166S V2 představují právě onu zajímavou kombinaci šestnáctibitového mikrořadiče a rychlé jednotky určené pro provádění DSP operací se šestnáctibitovými vstupy a čtyřicetibitovými mezivýsledky. I přesto, že se tato jádra jmenují V2, se ve skutečnosti jedná již o třetí (nikoli druhou) generaci jader C166, ovšem s odlišnou vnitřní architekturou a několika vylepšeními, která se týkají jak instrukční sady (nové instrukce, nové adresovací režimy), tak i například instrukční pipeline umožňující dokončit většinu instrukcí v jednom cyklu.

2. Centrální procesorová jednotka: ALU, MAC a ADU

Centrální procesorová jednotka použitá u čipů s jádry C166S V2 obsahuje následující moduly:

  1. ALU (Aritmeticko-logická jednotka doplněná o samostatnou násobičku a děličku)
  2. MAC (Modul Multiply Accumulate, ten je zcela oddělený od výše zmíněné násobičky a děličky)
  3. ADU (Address Data Unit)
  4. IPIP (instrukční pipeline)
  5. IFU (jednotka řídicí načítání instrukcí, práci se zásobníkem návratových adres atd.)
  6. WB (Write-back buffer pro data)
  7. RF (dvě interní sady pracovních registrů, viz další text)

Aritmeticko-logická jednotka se skládá z klasické ALU, ovšem doplněné o barrel shifter, násobičku a děličku (pracující podobně jako u C166) a taktéž o novou jednotku MAC popsanou v navazující kapitole. Dále se v centrální procesorové jednotce nachází dvě sady pracovních registrů a modul ADU (Address Data Unit), jenž kromě speciálních registrů použitých pro adresování (DPP0..DPP3, SPSEG, SP, STKOV..) obsahuje i dvojici samostatně (paralelně s hlavní ALU) pracujících sčítaček používaných pro postinkrement/dekrement a preinkrement/dekrement adresy.

3. MAC – Multiply Accumulate

Jednotka MAC (Multiply Accumulate) tvoří základ pro ty aplikace, v nichž je nutné nějakým způsobem zpracovávat signály (většinou plynulý tok dat). Interně se MAC skládá z rychlé násobičky se šestnáctibitovými vstupy, která je propojena s barrel shifterem a akumulátorem. Jak posuvný registr, tak i akumulátor mají šířku čtyřicet bitů, což efektivně umožňuje výpočty s hodnotami reprezentovanými v systému pevné řádové čárky (FX – Fixed Point). Výpočty je možné provádět s automatickou saturací výsledků (nedojde k přetečení) a vzhledem k tomu, že násobička dokončí operaci v jediném cyklu, mohou být DSP operace prováděné na C166S V2 až desetkrát rychlejší v porovnání s původními jádry C166 (samozřejmě pokud porovnáváme čipy se shodným hodinovým signálem).

Modul MAC je doplněn registry nazvané MAH, MAL a MAE s obsahem akumulátoru (první dva registry jsou šestnáctibitové, poslední je jen osmibitový), dále registr MRW použitý při opakování programových smyček, MCW (MAC Unit Control Word) pro nastavení režimu saturace i posunu mezivýsledku po násobení a MSW (MAC Unit Status Word), což je registr se stavem celé jednotky MAC (přenos, přetečení, záporný výsledek poslední operace, nulový výsledek apod.)

4. Instrukční pipeline

Instrukční pipeline je u jader C166S V2 rozdělena na dvě části, přičemž první část se stará o načtení instrukce (fetch) a část druhá o její vykonání. První část má dva řezy, část druhá pak pět řezů. Navíc první část obsahuje logiku pro predikci skoků a dvojici bufferů pro přednačtené instrukce. Podívejme se, jak tato první část instrukční pipeline vypadá, protože se jedná o zajímavé a současně i výkonné řešení:

Obrázek 1: První část instrukční pipeline jader C166 V2.

Na diagramu můžeme vidět, že pipeline na vstupu obsahuje relativně malý buffer, který může obsahovat až šest instrukcí. Instrukční kódy (popř. konstanty) jsou z paměti programu načítány po interní sběrnici o šířce 64 bitů, takže je možné (například po skoku) tento buffer naplnit relativně rychle. Za vstupním bufferem se nachází logika pro detekci skokových instrukcí a pro predikci skoků v prvních třech instrukcích z bufferu. Pokud je skok detekován a logika usoudí, že bude proveden, je možné přeskočit (bypass) další buffer a FIFO, u běžných instrukcí jsou pak instrukce ukládány přes další buffer do FIFO. Instrukce skoku jsou prováděny paralelně s instrukcí, která skoku předchází (což je opak klasického RISCového branch delay slotu), což ovšem znamená, že logika v této části pipeline musí instrukci skoku pozměnit (vypočítat absolutní adresu skoku atd.).

5. Predikce skoků a nápověda předaná překladačem či uživatelem

S instrukční pipeline, resp. přesněji řečeno s její první částí (prefetch) poměrně úzce souvisí predikce skoků. Ta je u jader C166S V2 řešena poměrně jednoduchým způsobem, který ovšem umožňuje, aby centrální procesorové jednotce mohl pomoci překladač či sám programátor používající assembler. Prediktor skoků rozděluje všechny skokové instrukce do několika kategorií a u jednotlivých kategorií určuje, v jakém případě se má skok provést. Navíc existuje i kategorie skokových instrukcí, u nichž je predikce provedena na základě bitu zapsaného do instrukčního slova. Tento bit nastavuje překladač (na základě statické či runtime analýzy) či přímo programátor pracující s assembleru:

  • U instrukcí JMPS a CALLS se předpokládá, že se skok vždy provede.
  • Totéž platí u instrukcí RET, RETS, RETP a RETI.
  • U instrukcí JMPI a CALLI se předpokládá, že se skok provede ve chvíli, kdy podmínka není zadána (suffix _UC), v ostatních případech se předpokládá, že se skok neprovede.
  • U relativních podmíněných skoků se předpokládá, že skok bude proveden ve chvíli, kdy se skáče směrem zpět (tj. skok je velmi pravděpodobně umístěn na konci programové smyčky).
  • Totéž platí u všech skokových instrukcí „booleovského procesoru“, tj. JB, JBC, JNB a JNBS.
  • U instrukcí JMPA a CALLA může programátor/překladač určit, zda skok bude či nebude pravděpodobně proveden. Zápis je jednoduchý: JMPA+ podmínka, adresa a JMPA- podmínka, adresa.

6. Rozšíření sady pracovních registrů, mapování registrů do paměti

U původních mikrořadičových jader C166 existovala sada šestnácti šestnáctibitových pracovních registrů, přičemž osm z těchto registrů bylo možné rozdělit na dvojice osmibitových registrů. U novějších jader C166S V2 existují hned tři sady (resp. přesněji řečeno banky) pracovních registrů, přičemž jedna banka se nazývá globální a zbylé dvě banky pak lokální. Globální banka registrů je mapována do operační paměti, takže tyto registry je vlastně možné považovat „jen“ za speciální formu offsetu použitého při adresování. To, ve které části paměti se tato banka nachází, je určeno obsahem registru CP (Context Pointer), v jehož horních čtyřech bitech jsou vždy uloženy jedničky, aby se zaručilo, že banka pracovních registrů bude vždy uložena v interní paměti.

Počáteční adresu globální banky registrů je možné nastavit instrukcí:

SCXT CP, #konstanta

Lokální banky nejsou mapovány do RAM (jsou součástí centrální procesorové jednotky) a tudíž je nelze adresovat nepřímo. To, která banka registrů je použita, je určeno dvěma novými bityPSW a protože je tento registr automaticky obnoven při ukončení přerušovací rutiny, je možné například jednu interní banku používat právě v přerušovacích rutinách a nestarat se o to, aby přerušovací rutina nenarušila obsah pracovních registrů používaných hlavním programem.

7. Rozšíření registru PSW (Program Status Word)

Původní jádra C166 obsahovala stavový registr, v němž nebyly některé bity využity. Jen pro připomenutí, struktura stavového registru PSW byla následující:

Bit Označení Význam
0 N příznak záporného výsledku
1 C příznak přenosu
2 V příznak přetečení
3 Z příznak nulovosti
4 E výsledkem operace je nejmenší hodnota (0×80 či 0×8000)
5 MULIP došlo k přerušení násobení či dělení (tyto operace lze přerušit během výpočtu)
6 USR0 uživatelsky nastavitelný bit
7 ×
8 ×
9 ×
10 HLDEN povolení externího řízení sběrnice jiným čipem přes signály BREQ, HOLD a HLDA
11 IEN povolení či zákaz přerušení
12 ILVL úroveň přerušení
13 ILVL úroveň přerušení
14 ILVL úroveň přerušení
15 ILVL úroveň přerušení

U jader C166S V2 se využily i zbývající tři bity, a to následujícím způsobem:

Bit Označení Význam
7 USR1 uživatelsky nastavitelný bit
8 BANK výběr banky pracovních registrů
9 BANK výběr banky pracovních registrů

Bity 8 a 9 společně určují, jaká banka pracovních registrů se použije:

Bit 9 a 8 PSW význam
00 globální banka (mapovaná do paměti)
01 rezervováno
10 první lokální banka registrů
11 druhá lokální banka registrů

8. Paměťový prostor větší než 64kB a rozdělení programové paměti na segmenty

Na rozdíl od některých dalších mikrořadičů se u jader C166S V2 používá jeden lineární adresový prostor společný jak pro datovou paměť, tak i pro paměť programu, což mj. zjednodušuje instrukční soubor. Konkrétně to znamená, že existuje prostor o maximální teoretické velikosti 16 MB, do něhož se mapuje interní ROM, interní paměť Flash, interní DRAM, speciální funkční registry (SFR) a popř. i všechny externí paměti. Na druhou stranu je však nutné kvůli této konfiguraci v