Obsah
1. Architektura VLIW a rodina DSP čipů TI TMS320C6× (pokračování)
3. Registry, které mohou být použity pro adresování
4. Řídicí registr AMR (Addressing Mode Register)
5. VLIW a explicitní paralelizace instrukcí
6. Ukázka sériově, paralelně a sério-paralelně prováděných instrukcí
7. Zápis paralelně prováděných instrukcí v assembleru
8. Podmíněné provádění instrukcí a kódy podmínek
9. Zápis kódu podmínky v assembleru
10. Rozdělení instrukcí podle výkonných jednotek
11. Instrukce pro jednotky L1 a L2
12. Instrukce pro jednotky S1 a S2
13. Instrukce pro jednotky M1 a M2
14. Instrukce pro jednotky D1 a D2
15. Malá ukázka na závěr – FIR Filtr
1. Architektura VLIW a rodina DSP čipů TI TMS320C6× (pokračování)
V dnešní části seriálu o architekturách počítačů a procesorů navážeme na předchozí díl, v němž jsme si řekli základní informace o architektuře VLIW (Very Long Instruction Word) i o vnitřním uspořádání čipů TMS320C6×. Dnes se zaměříme na popis instrukční sady těchto DSP, především na způsob určení, které instrukce mohou být spuštěny paralelně (každá instrukce ovšem může být spuštěna v jiném výkonném bloku – jednotce). Taktéž si popíšeme některé důležité řídicí a stavové registry, především pak registr nazvaný AMR neboli Addressing Mode Register, protože jeho konkrétní nastavení má velký vliv na způsob adresování dat (připomeňme si, že DSP typicky zpracovávají vektory hodnot, někdy se též používá nelineární způsob adresování).
Obrázek 1: Interní struktura digitálních signálových procesorů TMS řady 320C64×.
2. Stavové a řídicí registry
DSP obsahují několik stavových a řídicích registrů, které jsou vypsány v následující tabulce. Pro přesuny dat mezi těmito registry a registry pracovními se používá instrukce nazvaná MVC. Většina těchto registrů je určena pro práci s přerušovacím subsystémem:
Jméno | Význam zkratky | Stručný popis |
---|---|---|
AMR | Addressing mode register | určuje způsob adresování, viz text níže |
CSR | Control status register | obsahuje různá bitová pole: ID procesoru, režim saturace, režim řízení spotřeby apod. |
ICR | Interrupt clear register | zápisem umožňuje vymazat příznak o maskovatelných přerušeních z IFR |
IER | Interrupt enable register | povolení/zákaz jak maskovatelných, tak i nemaskovatelných přerušení |
IFR | Interrupt flag register | pouze pro čtení, obsahuje příznaky přerušení, pokud nastanou (lze vymazat přes ICR) |
IRP | Interrupt return pointer register | adresa pro návrat z maskovatelného přerušení instrukcí B IRP |
ISR | Interrupt set register | opačný význam než ICR, nastavení příznaku přerušení |
ISTP | Interrupt service table pointer register | adresa tabulky s vektory přerušení |
NRP | Nonmaskable interrupt return pointer register | dtto jako IRP, ale pro nemaskovatelná přerušení |
PCE1 | Program counter | 32bitový programový čítač |
3. Registry, které mohou být použity pro adresování
Pro adresování lze použít libovolný pracovní registr (každý má šířku 32 bitů), ovšem pro kruhové adresování je možné využít pouze registry A4..A7 a B4..B7 (viz též následující kapitolu). Navíc je většina instrukcí, v nichž se adresují operandy uložené v operační paměti, určena pouze pro výkonné jednotky D1 a D2, které mohou pracovat paralelně. Operandy lze načítat a ukládat do paměti instrukcemi LDx a STx (podobně jako na RISCových procesorech), ovšem existují také instrukce ADDAx a SUBAx, které jeden operand načtou z paměti, což je pro mnohé DSP algoritmy ideální. Pokud se pro adresování používá pracovní registr, je možné zvolit, jak a kdy se má modifikovat jeho hodnota: pre-inkrement, pre-dekrement, post-inkrement a post-dekrement, což přibližně odpovídá céčkovým výrazům ++i, –i, i++, i–.
Speciálním a v oblasti zpracování signálů velmi užitečným adresováním je takzvané kruhové adresování (circular addressing). Jedná se o obdobu klasického lineárního adresování, kdy se adresa uložená v pracovním registru postupně zvyšuje, ale po dosažení velikosti bloku se začíná adresovat od začátku. Tímto způsobem lze realizovat plovoucí okno používané v klasických algoritmech pro výpočet konvoluce a korelace.
Velikost bloku se zadává pětibitovou hodnotou, která představuje mocninu dvou:
00000 - velikost = 2 00001 - velikost = 4 00010 - velikost = 8 ... ... ... 11111 - velikost = 2^32
4. Řídicí registr AMR (Addressing Mode Register)
Registr AMR, kterým se řídí adresování, má, podobně jako ostatní řídicí a stavové registry, šířku 32 bitů, přičemž těchto 32 bitů je rozděleno do několika bitových polí:
Bity | Význam |
---|---|
31..26 | rezervováno pro budoucí rozšíření |
25..21 | velikost bloku pro kruhové adresování (blok1) |
20..16 | velikost bloku pro kruhové adresování (blok2) |
15..14 | adresovací režim při použití registru B7 |
13..12 | adresovací režim při použití registru B6 |
11..10 | adresovací režim při použití registru B5 |
9..8 | adresovací režim při použití registru B4 |
7..6 | adresovací režim při použití registru A7 |
5..4 | adresovací režim při použití registru A6 |
3..2 | adresovací režim při použití registru A5 |
1..0 | adresovací režim při použití registru A4 |
Adresovací režim je určen dvojicí bitů, které volí mezi lineárním adresováním, kruhovým adresováním používajícím blok1 (tedy velikost filtru) a kruhovým adresováním používajícím blok2. Čtvrtá možnost je rezervována pro budoucí rozšíření.
5. VLIW a explicitní paralelizace instrukcí
Architektura VLIW (Very Long Instruction Word), která je mj. používána i v digitálních signálových procesorech řady TMS320C6×, vyžaduje, aby se při tvorbě strojového kódu explicitně určilo, které instrukce uložené v „dlouhém“ slovu mohou být spuštěny paralelně a které nikoli. Může totiž dojít k situaci, kdy nějaká instrukce používá výsledek instrukce spuštěné dříve a bylo by zajisté škoda, kdyby například polovina bitových polí ve slovu obsahovala pouze NOPy (NOP=No Operation, jde o výplň jednoho bitového pole či většího množství bitových polí). Připomeňme si, že všechna instrukční slova mají šířku 256 bitů (ano, skutečně VLIW) a jsou načítány z adresy dělitelné 32. Celý 256bitový vektor instrukčního slova je rozdělen na osm částí, z nichž každá má šířku 32 bitů. Každá z těchto částí může tvořit instrukci pro vybranou výkonnou jednotku (L1, S1, M1, D1, L2, S2, M2, D2), přičemž samozřejmě je možné každé jednotce předat jedinou instrukci.
Celé „dlouhé“ slovo vypadá takto:
31 0 31 0 31 0 31 0 31 0 31 0 31 0 31 0 +--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+ | INS #1 |p| INS #2 |p| INS #3 |p| INS #4 |p| INS #5 |p| INS #6 |p| INS #7 |p| INS #8 |p| +--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+ 255 223 191 159 127 95 63 31 0
V horní části jsou zapsány indexy bitů v rámci jedné instrukce (tedy jednoho bitového pole), v části spodní pak indexy bitu v rámci celého „dlouhého“ slova. Pro explicitní paralelizaci je důležitý bit p, který je umístěn v každé instrukci. Pokud je tento bit v instrukci s indexem i nastavený na jedničku, znamená to, že instrukce i a i+1 se spustí paralelně (tyto bity jsou zpracovávány zleva doprava). Vzhledem k tomu, že paralelní zpracování je omezeno pouze na jedno „dlouhé“ slovo, je bit s indexem 0 vždy nastavený na nulu (žádná další instrukce po něm stejně nenásleduje).
6. Ukázka sériově, paralelně a sério-paralelně prováděných instrukcí
Ukažme si nyní některé možné kombinace všech osmi bitů p. Nejprve bude ukázáno „dlouhé“ slovo s instrukcemi, které budou spuštěny sekvenčně, což je samozřejmě ta horší varianta (ke které v praxi nebude docházet příliš často):
31 0 31 0 31 0 31 0 31 0 31 0 31 0 31 0 +--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+ | INS #1 |0| INS #2 |0| INS #3 |0| INS #4 |0| INS #5 |0| INS #6 |0| INS #7 |0| INS #8 |0| +--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+ 255 223 191 159 127 95 63 31 0
Spouštění instrukcí vypadá následovně:
Cyklus | Instrukce |
---|---|
1 | INS #1 |
2 | INS #2 |
3 | INS #3 |
4 | INS #4 |
5 | INS #5 |
6 | INS #6 |
7 | INS #7 |
8 | INS #8 |
Na druhé straně výkonnostního spektra je „dlouhé“ slovo, jehož instrukce se spustí současně. Tato situace je ideální a jak programátoři používající assembler, tak i překladače (typicky překladač C) se snaží o organizaci kódu takovým způsobem, aby se využily všechny výkonné jednotky. Povšimněte si, že poslední bit p musí být stále nastaven na nulu:
31 0 31 0 31 0 31 0 31 0 31 0 31 0 31 0 +--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+ | INS #1 |1| INS #2 |1| INS #3 |1| INS #4 |1| INS #5 |1| INS #6 |1| INS #7 |1| INS #8 |0| +--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+ 255 223 191 159 127 95 63 31 0
Spouštění instrukcí:
Cyklus | Instrukce |
---|---|
1 | INS #1 + INS #2 + INS #3 + INS #4 + INS #5 + INS #6 + INS #7 + INS #8 |
Možné jsou i všechny ostatní kombinace, jichž je 126. Například:
31 0 31 0 31 0 31 0 31 0 31 0 31 0 31 0 +--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+ | INS #1 |0| INS #2 |0| INS #3 |1| INS #4 |1| INS #5 |0| INS #6 |1| INS #7 |1| INS #8 |0| +--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+--------+-+ 255 223 191 159 127 95 63 31 0
Spouštění jednotlivých instrukcí nyní vypadá takto:
Cyklus | Instrukce |
---|---|
1 | INS #1 |
2 | INS #2 |
3 | INS #3 + INS #4 + INS #5 |
4 | INS #6 + INS #7 + INS #8 |
To je poměrně dobrá úroveň paralelizace. Musíme si totiž uvědomit, že i když nejsou všechny instrukce spuštěny současně, stále jsme ušetřili minimálně dvě fáze fetch a decode, které by se provedly na běžném RISCovém procesoru (tyto fáze se samozřejmě provedou i na VLIW, ale pro celou osmici instrukcí, nikoli postupně).
7. Zápis paralelně prováděných instrukcí v assembleru
Zápis instrukcí v assembleru digitálních signálových procesorů řady TMS320C6× je v některých ohledech odlišný od běžného sekvenčního zápisu, na nějž jsme zvyklí z RISCových či CISCových procesorů. Největším rozdílem je samozřejmě nutnost spojovat vždy osm instrukcí do jednoho VLIW a taktéž nutnost specifikace, které instrukce se skutečně mohou spustit paralelně. V assembleru TMS320C6× se pro tento účel zavedla dvojice znaků || zapisovaných před mnemotechnické jméno instrukce. Slovo, v němž se všechny instrukce provedou paralelně, se zapíše takto:
INS #1 || INS #2 || INS #3 || INS #4 || INS #5 || INS #6 || INS #7 || INS #8
Sério-paralelně prováděné instrukce z předchozí kapitoly budou zapsány způsobem:
INS #1 INS #2 INS #3 || INS #4 || INS #5 INS #6 || INS #7 || INS #8
8. Podmíněné provádění instrukcí a kódy podmínek
Prakticky všechny instrukce obsahují ve svém bitovém poli čtveřici bitů, které určují, za jakých podmínek se instrukce vykoná. Do značné míry se to podobá podmínkovým bitům známým z mikroprocesorů ARM, ovšem s tím rozdílem, že podmínky v DSP jsou značně zjednodušeny na porovnání vybraného pracovního registru s nulou či jedničkou. Výběr pracovního registru je proveden na základě bitů Creg, typ porovnání (nulovost, nenulovost) pak bitem z. Jak bity Creg, tak i bit z je součástí instrukce (v každém VLIW je tedy těchto podmínek celkem osm):
Podmínka | Creg | z |
---|---|---|
provedeno vždy | 000 | 0 |
rezervováno | 000 | 1 |
B0≠0 | 001 | 0 |
B0=0 | 001 | 1 |
B1≠0 | 010 | 0 |
B1=0 | 010 | 1 |
B2≠0 | 011 | 0 |
B2=0 | 011 | 1 |
A1≠0 | 100 | 0 |
A1=0 | 100 | 1 |
A2≠0 | 101 | 0 |
A2=0 | 101 | 1 |
Poznámka: další pracovní registry nelze takto jednoduše použít.
9. Zápis kódu podmínky v assembleru
V assembleru se podmínka zapisuje do složených závorek uvedených před vlastní instrukci, například:
[B1] ADD operandy
Popř. opačná podmínka:
[!B1] ADD operandy
Samozřejmě je možné (a nutné) kombinovat podmínku se znaky pro paralelní zpracování instrukcí:
... ... || [B1] ADD .S2 -1, B0, B0 || [!B1] B .S1 LOOP
Poznámka: modifikátory .S2 a .S1 specifikují, které výkonné jednotky mají danou instrukci spustit.
10. Rozdělení instrukcí podle výkonných jednotek
Minule jsme si řekli, že celý procesor je rozdělený na dvě části pojmenované datapath A a datapath B. Každá z těchto částí obsahuje sadu pracovních registrů (konkrétně je v každé sadě umístěno šestnáct 32bitových registrů, celkem tedy již zmíněných 32 registrů) a čtyři výkonné jednotky (.L1, .S1, .M1, .D1 pro část A a .L2, .S2, .M2, .D2 pro část B):
+-----------------+-----------------+ | Registry Ax | Registry Bx | +-----------------+-----------------+ ⇅ ⇅ ⇅ ⇅ ⇅ ⇅ ⇅ ⇅ +---+---+---+---+ +---+---+---+---+ |.L1|.S1|.M1|.D1| |.D2|.M2|.S2|.L2| +---+---+---+---+ +---+---+---+---+
Vzhledem k odlišným vlastnostem výkonných jednotek jsou i instrukce rozděleny do čtyř skupin, což je téma, kterému se budeme věnovat v navazujících čtyřech kapitolách.
11. Instrukce pro jednotky L1 a L2
Výkonné jednotky L1 a L2 jsou určeny především pro provádění základních operací v aritmeticko-logické jednotce, přičemž operandy mohou mít šířku 32 bitů či v některých případech i 40 bitů (což umožňuje například akumulaci výsledků při filtraci signálů apod.). Tyto jednotky mohou zpracovávat následující instrukce:
Zkratka | Instrukce |
---|---|
ABS | výpočet absolutní hodnoty se saturací |
ADD | součet bez saturace |
ADDU | součet bez saturace dvou hodnot bez znaménka |
AND | operace logického součinu prováděná bit po bitu |
CMPEQ | porovnání na relaci =, do výsledného registru se uloží 0 či 1 |
CMPGT | porovnání na relaci >, čísla se znaménky |
CMPGTU | dtto, ale pro čísla bez znaménka |
CMPLT | porovnání na relaci <, čísla se znaménky |
CMPLTU | dtto, ale pro čísla bez znaménka |
LMBD | nalezení prvního bitu s nastavenou hodnotou (0 či 1) zleva (od nejvyššího bitu) |
MV | přesun dat mezi dvojicí pracovních registrů |
NEG | negace operandu (*-1) |
NORM | vrací počet redundantních bitů znaménka (počet shodných bitů počítáno od 32.bitu) |
NOT | logická operace negace prováděná bit po bitu |
OR | operace logického součtu prováděná bit po bitu |
SADD | součet se saturací |
SAT | konverze 40.bit → 32.bit (se saturací) |
SSUB | rozdíl se saturací (čísla se znaménkem) |
SUB | rozdíl bez saturace |
SUBC | rozdíl (s podmínkou) + bitový posun, pro operaci dělení |
SUBU | rozdíl se saturací (čísla bez znaménka) |
XOR | operace logické nonekvivalence prováděná bit po bitu |
ZERO | vynulování registru (rozdíl registru se sebou samým) |
12. Instrukce pro jednotky S1 a S2
Výkonné jednotky S1 a S2 se v některých ohledech podobají výše zmíněným jednotkám L1 a L2, ovšem jejich možnosti jsou větší, protože do těchto jednotek byly přidány shiftery (pro bitové posuny) a taktéž modul pro podmíněné a nepodmíněné skoky. Instrukce, které jsou v těchto jednotkách zpracovávány, jsou vypsány v následující tabulce:
Zkratka | Instrukce |
---|---|
ADD | součet bez saturace |
ADDK | součet registru s konstantou |
ADD2 | součet dvou 16bitových operandů |
AND | operace logického součinu prováděná bit po bitu |
B displacement | skok s použitím konstanty pro výpočet adresy |
B register | skok s použitím pracovního registru pro výpočet adresy |
B IRP | skok s použitím registru IRP pro výpočet adresy |
B NRP | skok s použitím registru NRP pro výpočet adresy |
CLR | vynulování bitu/bitů v bitovém poli |
EXT | získání hodnoty z bitového pole, znaménkové rozšíření na 32bitové slovo |
EXTU | získání hodnoty z bitového pole, bezznaménkové rozšíření na 32bitové slovo |
MV | přesun dat mezi dvojicí pracovních registrů |
MVC | přesun dat mezi řídicími registry a pracovními registry |
MVK | načtení konstanty do registru (znaménkové rozšíření) |
MVKH | načtení konstanty do registru (horních 16bitů) |
MVKL | načtení konstanty do registru (horních 16bitů, znaménkové rozšíření) |
MVKLH | načtení konstanty do registru (horních 16bitů) |
NEG | negace operandu (*-1) |
NOT | logická operace negace prováděná bit po bitu |
OR | operace logického součtu prováděná bit po bitu |
SET | nastavení bitu/bitů v bitovém poli |
SHL | aritmetický posun doleva |
SHR | aritmetický posun doprava |
SHRU | logický posun doprava |
SSHL | posun doleva se saturací |
SUB | rozdíl bez saturace |
SUB2 | rozdíl dvou 16bitových operandů |
XOR | operace logické nonekvivalence prováděná bit po bitu |
ZERO | vynulování registru (rozdíl registru se sebou samým) |
13. Instrukce pro jednotky M1 a M2
Jednotky M1 a M2 tvoří jádro celého DSP, protože tyto jednotky v první řadě obsahují násobičky. Z tohoto důvodu jsou všechny instrukce orientovány právě na použití násobiček, což je jasně patrné z následující tabulky. U instrukcí lze vybrat jak typ operandů (bez znaménka: unsigned, se znaménkem: signed), tak i tu část registru, která se použije (spodních 16 bitů: LSB, horních 16 bitů: MSB):
Zkratka | Instrukce | Operand 1 | Operand 2 |
---|---|---|---|
MPY | násobení 16×16 bitů | Signed LSB | Signed LSB |
MPYH | násobení 16×16 bitů | Signed MSB | Signed MSB |
MPYHL | násobení 16×16 bitů | Signed MSB | Signed LSB |
MPYHLU | násobení 16×16 bitů | Unsigned MSB | Unsigned LSB |
MPYHSLU | násobení 16×16 bitů | Signed MSB | Unsigned LSB |
MPYHSU | násobení 16×16 bitů | Signed MSB | Unsigned MSB |
MPYHU | násobení 16×16 bitů | Unsigned MSB | Unsigned MSB |
MPYHULS | násobení 16×16 bitů | Unsigned MSB | Signed LSB |
MPYHUS | násobení 16×16 bitů | Unsigned MSB | Signed MSB |
MPYLH | násobení 16×16 bitů | Signed LSB | Signed MSB |
MPYLHU | násobení 16×16 bitů | Unsigned LSB | Unsigned MSB |
MPYLSHU | násobení 16×16 bitů | Signed LSB | Unsigned MSB |
MPYLUHS | násobení 16×16 bitů | Unsigned LSB | Signed MSB |
MPYSU | násobení 16×16 bitů | Signed LSB | Unsigned LSB |
MPYU | násobení 16×16 bitů | Unsigned LSB | Unsigned LSB |
MPYUS | násobení 16×16 bitů | Unsigned LSB | Signed LSB |
SMPY | násobení + posun + saturace | Signed LSB | Signed LSB |
SMPYH | násobení + posun + saturace | Signed MSB | Signed MSB |
SMPYHL | násobení + posun + saturace | Signed MSB | Signed LSB |
SMPYLH | násobení + posun + saturace | Signed LSB | Signed MSB |
14. Instrukce pro jednotky D1 a D2
Význam výkonných jednotek D1 a D2 spočívá v tom, že umožňují načítání a ukládání operandů z a do operační paměti. Ovšem – což je poměrně zajímavé – i zde nalezneme jednoduché aritmeticko-logické jednotky, což může být v některých algoritmech výhodné (teoreticky lze spustit až osm součtů současně):
Zkratka | Instrukce |
---|---|
ADD | součet bez saturace |
ADDAB | součet, jeden operand (bajt) je načten z paměti |
ADDAH | součet, jeden operand (16bitové slovo) je načten z paměti |
ADDAW | součet, jeden operand (32bitové slovo) je načten z paměti |
LDB memory | načtení bajtu z operační paměti |
LDBU memory | dtto, bezznaménkové rozšíření |
LDH memory | načtení 16bitového slova z operační paměti |
LDHU memory | dtto, bezznaménkové rozšíření |
LDW memory | načtení 32bitového slova z operační paměti |
MV | přesun dat mezi dvěma pracovními registry |
STB memory | uložení bajtu do operační paměti |
STH memory | uložení 16bitového slova do operační paměti |
STW memory | uložení 32bitového slova do operační paměti |
SUB | rozdíl bez saturace |
SUBAB | rozdíl, jeden operand (bajt) je načten z paměti |
SUBAH | rozdíl, jeden operand (16bitové slovo) je načten z paměti |
SUBAW | rozdíl, jeden operand (32bitové slovo) je načten z paměti |
ZERO | vynulování registru (rozdíl registru se sebou samým) |
15. Malá ukázka na závěr – FIR Filtr
Na závěr si uveďme implementaci jádra FIR filtru tak, jak je popsána v materiálech TI. Vidíme, že se jedná o jediné „široké“ slovo obsahující osm paralelně spouštěných instrukcí (žádná instrukce není NOP). Výkonné jednotky L1 a L2 provádí součet operandů uložených v pracovních registrech, jednotky M1 a M2 samozřejmě provádí násobení, jednotky D1 a D2 načítání vzorků signálu a koeficientů h(n) z operační paměti, poslední dvě jednotky S1 a S2 zajišťují snížení hodnoty počitadla a podmíněný skok na začátek smyčky:
LOOP: ADD .L1 A0, A3, A0 || ADD .L2 B1, B7, B1 || MPYHL .M1X A2, B2, A3 || MPYLH .M2X A2, B2, B7 || LDW .D2 *B4++, B2 || LDW .D1 *A7--, A2 || [B0] ADD .S2 -1, B0, B0 || [B0] B .S1 LOOP
Poznámka: operandy instrukcí se zapisují v pořadí zdroj, zdroj, cíl, takže například první instrukce:
ADD .L1 A0, A3, A0
provádí operaci: A0 + A3 → A0 a předposlední instrukce:
[B0] ADD .S2 -1, B0, B0
provádí operaci: if B0 ≠ 0 then B0– (neboli –1 + B0 → B0).
16. Odkazy na Internetu
- VLIW: Very Long Instruction Word: Texas Instruments TMS320C6×
http://www.ecs.umass.edu/ece/koren/architecture/VLIW/2/ti1.html - An Introduction To Very-Long Instruction Word (VLIW) Computer Architecture
Philips Semiconductors - VLIW Architectures for DSP: A Two-Part Lecture (PDF, slajdy)
http://www.bdti.com/MyBDTI/pubs/vliw_icspat99.pdf - Very long instruction word (Wikipedia)
https://en.wikipedia.org/wiki/Very_long_instruction_word - A VLIW Approach to Architecture, Compilers and Tools
http://www.vliw.org/book/ - VEX Toolchain (VEX = VLIW Example)
http://www.hpl.hp.com/downloads/vex/ - Elbrus (computer)
https://en.wikipedia.org/wiki/Elbrus_%28computer%29 - Super Harvard Architecture Single-Chip Computer
https://en.wikipedia.org/wiki/Super_Harvard_Architecture_Single-Chip_Computer - Digital Signal Processors (stránky TI)
http://www.ti.com/lsds/ti/processors/dsp/overview.page - Introduction to DSP
http://www.ti.com/lit/wp/spry281/spry281.pdf - The Evolution of TMS (Family of DSPs)
http://www.slideshare.net/moto_modx/theevo1 - Datasheet k TMS32010
http://www.datasheetarchive.com/dlmain/49326c32a52050140abffe6f0ac4894aa09889/M/TMS32010 - 1979: Single Chip Digital Signal Processor Introduced
http://www.computerhistory.org/siliconengine/single-chip-digital-signal-processor-introduced/ - The TMS32010. The DSP chip that changed the destiny of a semiconductor giant
http://www.tihaa.org/historian/TMS32010–12.pdf - Texas Instruments TMS320 (Wikipedia)
https://en.wikipedia.org/wiki/Texas_Instruments_TMS320 - Great Microprocessors of the Past and Present: Part IX: Signetics 8×300, Early cambrian DSP ancestor (1978):
http://www.cpushack.com/CPU/cpu2.html#Sec2Part9 - Great Microprocessors of the Past and Present (V 13.4.0)
http://jbayko.sasktelwebsite.net/cpu.html - Introduction to DSP – DSP processors:
http://www.bores.com/courses/intro/chips/index.htm - The Scientist and Engineer's Guide to Digital Signal Processing:
http://www.dspguide.com/ - Digital signal processor (Wikipedia EN)
http://en.wikipedia.org/wiki/Digital_signal_processor - Digitální signálový procesor (Wikipedia CZ)
http://cs.wikipedia.org/wiki/Digitální_signálový_procesor - Digital Signal Processing FAQs
http://dspguru.com/dsp/faqs - Reprezentace numerických hodnot ve formátech FX a FP
http://www.root.cz/clanky/fixed-point-arithmetic/ - IEEE 754 a její příbuzenstvo: FP formáty
http://www.root.cz/clanky/norma-ieee-754-a-pribuzni-formaty-plovouci-radove-tecky/ - Čtyři základní způsoby uložení čísel pomocí FX formátů
http://www.root.cz/clanky/binarni-reprezentace-numerickych-hodnot-v-fx-formatu/ - Základní aritmetické operace prováděné v FX formátu
http://www.root.cz/clanky/zakladni-aritmeticke-operace-provadene-ve-formatu-fx/ - Aritmetické operace s hodnotami uloženými ve formátu FP
http://www.root.cz/clanky/aritmeticke-operace-s-hodnotami-ve-formatu-plovouci-radove-carky/ - FIR Filter FAQ
http://dspguru.com/dsp/faqs/fir - Finite impulse response (Wikipedia)
http://en.wikipedia.org/wiki/Finite_impulse_response - DSPRelated
http://www.dsprelated.com/ - Addressing mode (Wikipedia)
https://en.wikipedia.org/wiki/Addressing_mode - Orthogonal instruction set
https://en.wikipedia.org/wiki/Orthogonal_instruction_set - TI 16-bit and 32-bit microcontrollers
http://www.ti.com/lsds/ti/microcontrollers16-bit32-bit/overview.page - TMS 32010 Assembly Language Programmer's Guide (kniha na Amazonu)
https://www.amazon.com/32010-Assembly-Language-Programmers-Guide/dp/0904047423 - COSC2425: PC Architecture and Machine Language, PC Assembly Language
http://www.austincc.edu/rblack/courses/COSC2425/index.html