Architektura VLIW a rodina DSP čipů TI TMS320C6× (adresování a instrukční soubor)

12. 1. 2017
Doba čtení: 17 minut

Sdílet

V dalším článku o architektuře VLIW a o rodině procesorů TMS320C6× společnosti Texas Instruments se budeme věnovat popisu instrukční sady těchto čipů a samozřejmě též způsobům zajištění paralelního spouštění instrukcí.

Obsah

1. Architektura VLIW a rodina DSP čipů TI TMS320C6× (pokračování)

2. Stavové a řídicí registry

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

16. Odkazy na Internetu

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:

bitcoin_skoleni

             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

  1. VLIW: Very Long Instruction Word: Texas Instruments TMS320C6×
    http://www.ecs.umass.edu/e­ce/koren/architecture/VLIW/2/ti1­.html
  2. An Introduction To Very-Long Instruction Word (VLIW) Computer Architecture
    Philips Semiconductors
  3. VLIW Architectures for DSP: A Two-Part Lecture (PDF, slajdy)
    http://www.bdti.com/MyBDTI/pub­s/vliw_icspat99.pdf
  4. Very long instruction word (Wikipedia)
    https://en.wikipedia.org/wi­ki/Very_long_instruction_word
  5. A VLIW Approach to Architecture, Compilers and Tools
    http://www.vliw.org/book/
  6. VEX Toolchain (VEX = VLIW Example)
    http://www.hpl.hp.com/downloads/vex/
  7. Elbrus (computer)
    https://en.wikipedia.org/wi­ki/Elbrus_%28computer%29
  8. Super Harvard Architecture Single-Chip Computer
    https://en.wikipedia.org/wi­ki/Super_Harvard_Architec­ture_Single-Chip_Computer
  9. Digital Signal Processors (stránky TI)
    http://www.ti.com/lsds/ti/pro­cessors/dsp/overview.page
  10. Introduction to DSP
    http://www.ti.com/lit/wp/spry281/spry­281.pdf
  11. The Evolution of TMS (Family of DSPs)
    http://www.slideshare.net/mo­to_modx/theevo1
  12. Datasheet k TMS32010
    http://www.datasheetarchi­ve.com/dlmain/49326c32a52050140ab­ffe6f0ac4894aa09889/M/TMS32010
  13. 1979: Single Chip Digital Signal Processor Introduced
    http://www.computerhistory­.org/siliconengine/single-chip-digital-signal-processor-introduced/
  14. The TMS32010. The DSP chip that changed the destiny of a semiconductor giant
    http://www.tihaa.org/histo­rian/TMS32010–12.pdf
  15. Texas Instruments TMS320 (Wikipedia)
    https://en.wikipedia.org/wi­ki/Texas_Instruments_TMS320
  16. 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
  17. Great Microprocessors of the Past and Present (V 13.4.0)
    http://jbayko.sasktelwebsi­te.net/cpu.html
  18. Introduction to DSP – DSP processors:
    http://www.bores.com/courses/in­tro/chips/index.htm
  19. The Scientist and Engineer's Guide to Digital Signal Processing:
    http://www.dspguide.com/
  20. Digital signal processor (Wikipedia EN)
    http://en.wikipedia.org/wi­ki/Digital_signal_processor
  21. Digitální signálový procesor (Wikipedia CZ)
    http://cs.wikipedia.org/wi­ki/Digitální_signálový_pro­cesor
  22. Digital Signal Processing FAQs
    http://dspguru.com/dsp/faqs
  23. Reprezentace numerických hodnot ve formátech FX a FP
    http://www.root.cz/clanky/fixed-point-arithmetic/
  24. IEEE 754 a její příbuzenstvo: FP formáty
    http://www.root.cz/clanky/norma-ieee-754-a-pribuzni-formaty-plovouci-radove-tecky/
  25. Č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/
  26. Základní aritmetické operace prováděné v FX formátu
    http://www.root.cz/clanky/zakladni-aritmeticke-operace-provadene-ve-formatu-fx/
  27. 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/
  28. FIR Filter FAQ
    http://dspguru.com/dsp/faqs/fir
  29. Finite impulse response (Wikipedia)
    http://en.wikipedia.org/wi­ki/Finite_impulse_response
  30. DSPRelated
    http://www.dsprelated.com/
  31. Addressing mode (Wikipedia)
    https://en.wikipedia.org/wi­ki/Addressing_mode
  32. Orthogonal instruction set
    https://en.wikipedia.org/wi­ki/Orthogonal_instruction_set
  33. TI 16-bit and 32-bit microcontrollers
    http://www.ti.com/lsds/ti/mi­crocontrollers16-bit32-bit/overview.page
  34. TMS 32010 Assembly Language Programmer's Guide (kniha na Amazonu)
    https://www.amazon.com/32010-Assembly-Language-Programmers-Guide/dp/0904047423
  35. COSC2425: PC Architecture and Machine Language, PC Assembly Language
    http://www.austincc.edu/rblac­k/courses/COSC2425/index.html

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.