Prof. Ing. Jiří Tůma, CSc. Signálové procesory firmy Analog Device rodiny ADSP-21xx



Podobné dokumenty
19 Jednočipové mikropočítače

PROCESORY. Typy procesorů

NÁVOD K OBSLUZE MODULU VIDEO 64 ===============================

Mikroprocesor Intel 8051

SRF08 ultrazvukový dálkoměr

Zkouška z předmětu Počítačové systémy

13. Sítě WAN. Rozlehlé sítě WAN. Počítačové sítě I. 1 (6) KST/IPS1. Studijní cíl. Představíme rozlehlé sítě typu WAN. Doba nutná k nastudování

Podrobný postup pro doplnění Žádosti o dotaci prostřednictvím Portálu Farmáře. 1. kolo příjmu žádostí Programu rozvoje venkova ( )

Ėlektroakustika a televize. TV norma ... Petr Česák, studijní skupina 205

I/O modul univerzální rozhraní

Adresace paměti. 11.přednáška

Číslicová technika 3 učební texty (SPŠ Zlín) str.: - 1 -

Poukázky v obálkách. MOJESODEXO.CZ - Poukázky v obálkách Uživatelská příručka MOJESODEXO.CZ. Uživatelská příručka. Strana 1 / 1. Verze aplikace: 1.4.

Uživatelská dokumentace

ZÁKLADY AUTOMATIZACE TECHNOLOGICKÝCH PROCESŮ V TEORII

Úvod do programování a práce s počítačem

Architektury počítačů na bázi sběrnice PCI. Cíl přednášky: Obsah přednášky:

TECHNICKÉ KRESLENÍ A CAD

Mikrořadiče fy ATMEL

Mikromarz. CharGraph. Programovatelný výpočtový měřič fyzikálních veličin. Panel Version. Stručná charakteristika:

CL232. Převodník RS232 na proudovou smyčku. S galvanickým oddělením, vysokou komunikační rychlostí a se zvýšenou odolností proti rušení

Algoritmizace a programování

Android Elizabeth. Verze: 1.3

NÁVRHOVÝ PROGRAM VÝMĚNÍKŮ TEPLA FIRMY SECESPOL CAIRO PŘÍRUČKA UŽIVATELE

ČÁST PÁTÁ POZEMKY V KATASTRU NEMOVITOSTÍ

-1- N á v r h ČÁST PRVNÍ OBECNÁ USTANOVENÍ. 1 Předmět úpravy

Zařízení má několik částí.

Sbírka úloh pro elektronickou stavebnici. Stručný popis programovacího jazyka Bascom AVR

VERZE: 01 DATUM: 05/2014

účetních informací státu při přenosu účetního záznamu,

ALLEX FX Programovatelný logický automat. Katalogový list. říjen Programovatelné logické automaty

1. LINEÁRNÍ APLIKACE OPERAČNÍCH ZESILOVAČŮ

PŘIJÍMACÍ ŘÍZENÍ. Strana

MI-3 přístroj na zjištění indexu tavení

1.2.5 Reálná čísla I. Předpoklady:

Microsoft Office Project 2003 Úkoly projektu 1. Začátek práce na projektu 1.1 Nastavení data projektu Plánovat od Datum zahájení Datum dokončení

WEBDISPEČINK NA MOBILNÍCH ZAŘÍZENÍCH PŘÍRUČKA PRO WD MOBILE

Algoritmizace a programování

c sin Příklad 2 : v trojúhelníku ABC platí : a = 11,6 dm, c = 9 dm, α = Vypočtěte stranu b a zbývající úhly.

Manuál uživatele čipové karty s certifikátem

MOBILNÍ KOMUNIKACE STRUKTURA GSM SÍTĚ

Výzva pro předložení nabídek k veřejné zakázce malého rozsahu s názvem Výměna lina

KX-TDA verze Rozšiřte kapacitu a schopnosti Vašeho systému KX-TDA povýšením na verzi 2.02.

řadič počítače část(jednotka) počítače/procesoru,

UŽIVATELSKÁ PŘÍRUČKA REGISTR CHMELNIC NA EAGRI ZÁKLADNÍ POPIS FUNKCÍ A FORMULÁŘŮ. CCV, s. r. o.

Katedra obecné elektrotechniky Fakulta elektrotechniky a informatiky, VŠB - TU Ostrava 16. ZÁKLADY LOGICKÉHO ŘÍZENÍ

Počítačové sítě 1 Přednáška č.4 Síťová vrstva

Návod k použití aplikace MARKETINGOVÉ PRŮZKUMY.CZ

PŘÍLOHA 1.6 SMLOUVY O PŘÍSTUPU K VEŘEJNÉ PEVNÉ KOMUNIKAČNÍ SÍTI LOGISTIKA KONCOVÝCH ZAŘÍZENÍ

ÚČEL zmírnit rázy a otřesy karosérie od nerovnosti vozovky, zmenšit namáhání rámu (zejména krutem), udržet všechna kola ve stálém styku s vozovkou.

V této části manuálu bude popsán postup jak vytvářet a modifikovat stránky v publikačním systému Moris a jak plně využít všech možností systému.

SO 182 DIO NA RYCHLOST. SILNICI R4 PS, km 9,196-11,926

Programový komplet pro evidence provozu jídelny v modul Sklad Sviták Bechyně Ladislav Sviták hotline: 608/

Systém MCS II. Systém MCS II < 29 >

VYR-32 POKYNY PRO SPRÁVNOU VÝROBNÍ PRAXI - DOPLNĚK 6

ZADÁVACÍ DOKUMENTACE

KAPITOLA 6.3 POŽADAVKY NA KONSTRUKCI A ZKOUŠENÍ OBALŮ PRO INFEKČNÍ LÁTKY KATEGORIE A TŘÍDY 6.2

Výsledky přijímacích zkoušek

Textové editory a procesory

PALETOVÉ REGÁLY SUPERBUILD NÁVOD NA MONTÁŽ

HMP Regulátor odběru elektrické energie TX RX COM L N V~ 6x relé 250V/8A + -

Cesta kolem světa za 80 dní. Cesta kolem světa pro 2-6 hráčů od 10 let od Michaela Rienecka, Kosmos 2004

NÚOV Kvalifikační potřeby trhu práce

1.7. Mechanické kmitání

Pokyn D Sdělení Ministerstva financí k rozsahu dokumentace způsobu tvorby cen mezi spojenými osobami

Úprava tabulek v MS Word. Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T. G. Masaryka, Kostelec nad Orlicí

Data v počítači EIS MIS TPS. Informační systémy 2. Spojení: jan.skrbek@tul.cz tel.: Konzultace: úterý

Steinbrenerova 6, VIMPERK. odbor výstavby a územního plánování Ú Z E M N Í R O Z H O D N U T Í

Aplikace počítačů v provozu vozidel 9

POPIS VÝROBKU A ZAMÝŠLENÉ POUŽITÍ

TIP: Pro vložení konce stránky můžete použít klávesovou zkratku CTRL + Enter.

Řízení kalibrací provozních měřicích přístrojů

I. Objemové tíhy, vlastní tíha a užitná zatížení pozemních staveb

S M L O U V U o poskytnutí účelové dotace č. MAS 8/2015

Integrovaný Ekonomický Systém Zakázkový list - IES WIN 2006

Vyřizuje: Tel.: Fax: Datum: Oznámení o návrhu stanovení místní úpravy provozu na místní komunikaci a silnici

Cvičná firma: studijní opora. Brno: Tribun EU 2014, s

Metody hodnocení rizik

Obvody a architektura počítačů. Jednoprocesorové počítače

Software IS Řízení stavebních zakázek

Žáci mají k dispozici pracovní list. Formou kolektivní diskuze a výkladu si osvojí grafickou minimalizaci zápisu logické funkce

Pokyny České pošty pro označování Doporučených zásilek čárovými kódy

Z{kladní struktura počítače

rozlišení obrazovky 1024 x 768 pixelů operační systém Windows 2000, Windows XP, Windows Vista 1 volný sériový port (volitelný) přístup na internet

L 110/18 Úřední věstník Evropské unie

Praktické úlohy- zaměření specializace

animeo Compact animeo Compact

Ekvitermní regulátory, prostorová regulace a příslušenství

Paralelní systémy. SIMD jeden tok instrukcí + více toků dat jedním programem je zpracováváno více různých souborů dat

A. PODÍL JEDNOTLIVÝCH DRUHŮ DOPRAVY NA DĚLBĚ PŘEPRAVNÍ PRÁCE A VLIV DÉLKY VYKONANÉ CESTY NA POUŽITÍ DOPRAVNÍHO PROSTŘEDKU

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Směrnice DSO Horní Dunajovice a Želetice - tlaková kanalizace a intenzifikace ČOV. Dlouhodobý majetek. Typ vnitřní normy: Identifikační znak: Název:

ZAŘÍZENÍ PRO MĚŘENÍ POSUVŮ

INTERNETOVÝ TRH S POHLEDÁVKAMI. Uživatelská příručka

obecně závazné vyhlášky o vedení technické mapy obce A. OBECNÁ ČÁST Vysvětlení navrhované právní úpravy a jejích hlavních principů

ZPRÁVA O PRŮBĚHU ŘEŠENÍ PROJEKTU

2 Trochu teorie. Tab. 1: Tabulka pˇrepravních nákladů

Věc: Výzva pro předložení nabídek k veřejné zakázce s názvem: VÚ a ŠJ PŠOV, Nákup nového osmimístného vozidla

materiál č. šablony/č. sady/č. materiálu: Autor: Karel Dvořák Vzdělávací oblast předmět: Informatika Ročník, cílová skupina: 8.

Digitální album návod k použití

Transkript:

Prof. Ing. Jiří Tůma, CSc. Signálové procesory firmy Analog Device rodiny ADSP-21xx Signálové procesory se stále častěji objevují tam, kde se dříve používaly jen analogové obvody nebo dokonce nahrazují specializované číslicové počítače. V současné době se tyto obvodové prvky rozdělují na DSP s pevnou řádovou čárkou (Fixed-Point DSP) nebo s pohyblivou řádovou čárkou (Floating-Point DSP). V této příloze bude referováno jen o DSP s pevnou řádovou čárkou rodiny ADSP-21xx a to jen od jednoho výrobce, kterým je americká firma Analog Devices. Přehled úloh, které může DSP řešit, je v tabulce D-I, která je převzata z aplikačních poznámek [1]. V prvém sloupci je typ úlohy (Algorithm), druhý sloupec obsahuje odhad potřebné výkonnosti DSP v MIPS (Million Instruction Per Second) a třetí odhad požadavků na velikost paměti programu (PM) a paměti dat (DM) v počtech slov (word). Tab. D-I Typické úlohy pro použití DSP s odhadem potřebné rychlosti a paměti Algorithm Approximate Approximate RAM Required MIPS Required V.32bis or V.32terbo FAX/Modem 16 16K words PM, 16K words DM 20 Voice Music Synthesis 20 6K words PM, 4K words DM Full Duplex Speaker Phone 13 2K words PM, 2K words DM Digital Answering Machine 8 5K words PM, 1K word DM GSM, 13 kbps Compression/Decompression 4 2K words PM, 1K word DM CELP, 4.3 or 7.5 kbps Compression/Decompression 12.5 1.5K words PM, 1.5K words DM MPEG Layer2, 64 kbps Compression 16 5K words PM, 4K words DM MPEG Layer2, 64 kbps Decompression 10 1K words PM, 8.5K words DM Dolby AC-2, 117 kbps Compression/Decompression 13 4K words PM, 8.5K words DM Architektura rodiny DSP typu ADSP-21xx Přehled jednotlivých typů DSP rodiny ADSP-21xx je v tabulce D-II. Všechny DSP mají společné jádro (21xx Core), které obsahuje 3 výpočetní jednotky (Computional Units), dva generátory adres dat (DAG - Data Address Generator #1 a #2), registr instrukcí a řadič programu (Instruction Register & Program Sequencer). Ke společnému jádru patří také blok výměny dat mezi sběrnicemi (Bus Exchange). Jednotlivé členy rodiny pak charakterizuje rozšíření (Integration). Zmíněné výpočetní jednotky tvoří aritmeticko - logická jednotka (Arithmetic/Logic Unit, tzv. ALU), násobička se střádačem (Multiply/Accumulator, tzv. MAC) a posouvač (Shifter). Tab. D-II Typy DSP rodiny ADSP-21xx Typ 2101 2103 2105 2115 2111 2171 2173 2181 2183 21ms p58 Data memory RAM 1K 1K 512 512 1K 2K 2K 16K 16K 2K Program Memory RAM 2K 2K 1K 1K 2K 2K 2K 16K 16K 2K Serial Port 0 + + - + + + + + + + Serial Port 1 + + + + + + + + + + Host Interface Port - - - - + + + + + + DMA Port - - - - - - - + + - Analog Interface - - - - - - - - - + Supply Voltage 5V 3.3V 5V 5V 5V 5V 3.3V 5V 3.3V 5V Instruction Rate (MIPS) 20 10 13.8 20 20 33 20 33 33 26 Blokové schéma jádra (Core) rodiny procesorů ADSP 21xx a příslušné rozšíření (Integration) pro typ 2181 je na obr. D-1. 1

Obr. D-1 Architektura rodiny signálových procesorů ADSP 21xx (CORE) a provedení ADSP-2181 (Integration) 2

Formáty čísel s pevnou řádovou čárkou Číselná data mohou být v paměti počítače uložena jako čísla s pecnou řádovou čárkou (fixed point) nebo s pohyblivou řádovou čárkou (floated-point). Základní aritmetické operace signálových procesorů rodiny ADSP-21xx jsou s čísly s pevnou řádovou čárkou. Čísla mohou být zapsána v různých číselných soustavách. Pro počítače je preferována soustava dvojková s ciframi 0 a 1. Informace obsažena v datech se dělí podle jejího množství na bit (bit), 1 bit obsahuje nemenší možné množství informace (ano/ne, 1/0, zapnuto/vypnuto) bajt (byte), 8 bitů s určitým pořadím slovo (word), dva bajty s určitým pořadím. V kódu programu se zapisují dvojková čísla tak, že před sérii nul a jedniček (jediných dvou cifer čísla) se zapíši znaky b# nebo B#, například: b#1111101100110101 nebo B#1111101100110101 Pro vyčerpavající využití kapacity 4 bitů umožňuje zápis čísel v šestnáctkové soustavě s ciframi 0, 1, 2,, 9, A, B,, F. Cifra A má v desítkové soustavě velikost 10 a poslední cifra F velikost 15. U písmenových cifer je povoleno použití také malých písmen (a, b,, f). Číslo o délce 16 bitů se zapíše 4 výše uvedenými ciframi následujícím způsobem 0xFB35 nebo 0xfb35 nebo h#fb35 nebo H#FB35 Pro používání pouze malých nebo velkých písmen jsou jen estetické důvody. Čísla desítkové soustavy nejsou nijak odlišena a tato čísla mají význam referenční, protože jsou nejběžnější. Signálové procesory rodiny ADSP-21xx pracují s 16bitovými čísly (slovy) s pevnou řádovou čárkou (fixed-point data). Operace s dvojitou přesností nebo s plovoucí řádovou čárkou (floating-point, například 16 bitů exponent a 16 bitů zlomková část) se musí naprogramovat. Číslo ve dvojité přesnosti se 32 bity (double precision) je uloženo ve dvou 16bitových paměťových buňkách, významnější (s větší váhou) bity jsou uloženy v jedné buňce a méně významné bity v druhé buňce. Číslo v pohyblivé řádové čárce je rozděleno na zlomkovou část nebo mantisa F a část exponentu E o základu dvě, tj. binárním základu (v angličtině také radix): ± E ± F * 2 Každá tato část je uložena ve zvláštní buňce. Přesnost čísel odpovídá v pevné řadové čárce odpovídá přesnosti A/D a D/A převodníku, který je rovněž 16bitový. Čísla mohou být bez znaménka (unsigned numbers) nebo se znaménkem (signed numbers). Čísla bez znaménka jsou pouze kladná, zatímco čísla se znaménkem mohou být obou polarit. Čísla se znaménkem jsou v procesorech ADSP 21xx ve formátu, který se nazývá dvojkový doplněk (twos-complement format). Absolutní hodnota čísel bez znaménka může tedy být dvakrát větší než u čísel se znaménkem. Pozice bitů v 16bitovém dvojkovém čísle se značí od 0 do 15, a to zprava doleva, takže jejich váha roste stejně jako v případě čísel desítkové soustavy. Bit 15 je u čísel se znaménkem nazýván znaménkový (Sign Bit) a protože má nejvyšší váhu, rozhoduje o znaménku čísla. Bit 0 je nejméně významný (Least Significant Bit - LSB) a bit 15 nejvíce významný (Most Significant Bit MSB). Nula na místě znaménkového bitu odpovídá tedy kladným číslům a jednotka záporným číslům. Váha znaménkového bitu u dvojkových doplňků je mocnina o základu 2. Absolutní hodnota záporného čísla se nezíská odstraněním znaménkového bitu. Čísla ukládaná do paměti počítače lze rozdělit na celočíselná (integer) a racionální, která lze zapsat zlomkem, proto zlomková (fractional) 3

U čísel typu integer se znaménkem je desetinná čárka (radix point) umístěna za číslem. Signed Integer Bity 15 14 13 2 1 0 Váha -(2 15 ) 2 14 2 13.. 2 2 2 1 2 0 Další typ čísel je integer bez znaménka. Unsigned Integer Bity 15 14 13 2 1 0 Váha 2 15 2 14 2 13.. 2 2 2 1 2 0 Zlomková čísla (fractional) mají myšlenou binární (radix) čárku uvnitř. Slova binární tečka u dvojkových čísel je použito ve stejném významu jako označení desetinná čárka pro desetinná čísla desítková. Formát zlomkových čísel, tj. počet bitů před binární čárkou a za binární čárkou se označuje dvojicí čísel oddělených tečkou. Signed Fractional (14.2) Bity 15 14 13 2 1 0 Váha -(2 13 ) 2 12 2 11.. 2 2 2 1 2 0 Unsigned Fractional (14.2) Bity 15 14 13 2 1 0 Váha 2 13 2 12 2 11.. 2 2 2 1 2 0 Formát není součástí zápisu hodnoty čísla. Rozsah čísel dvou extrémních formátů v desetinné soustavě je znázorněn v následující tabulce. Formát Největší kladná hodnota (0x7FFF) Největší záporná hodnota (0x8000) Hodnota nejnižšího bitu (0x0001) 1.15 0.999969482421875-1.0 0.000030517578125 16.0 32767-32768 1.0 Kladná čísla formátu 1.15 jsou tedy vždy menší než 1. Záporná hodnota čísla tohoto formátu je dána součtem hodnoty spodních 15 bitů, která je vždy menší než 1 avšak nejméně 0, a hodnoty bitu s nejvyšší váhou, která je 2, proto dvojkový doplněk. Přepočet na číslo desítkové soustavy se provede nejjednodušeji tak, že váhy a cifry se nahradí jejich desítkovou hodnotou. Jestliže typ číselné soustavy je označen indexem, pak se převod uskuteční výpočtem podle následujícího příkladu: (1,0110) 2 = (1*(-2) 0 + 0*2-1 + 1*2-2 + 1*2-3 + 0*2-4 ) 10 = (-0,625) 10 Sčítat a odčítat lze jen čísla se stejným formátem. Násobená čísla mohou být obě se znaménkem nebo bez znaménka a nebo smíšená. Poloha desetinné čárky ve výsledku se odvodí z poloh desetinných čárek. Výsledek násobení dvou čísel ve formátu M.N a P.Q je (M+P).(N+Q). Násobením dvou 16bitových čísel se obdrží číslo s 32 bity. Součin dvou dvojkově doplňkových čísel má dva znaménkové bity, z nichž jeden je redundantní (navíc), a proto lze výsledek posunout o jeden bit doleva. Násobením dvou 4

16bitových čísel o formátu 1.15 se obdrží číslo s 32 bity ve formátu 2.30. Po posunu o jeden bit doleva se obdrží formát 1.31. Tato operace se provádí ve zlomkovém modu (fractional mode) automaticky V integer mode se tento posun neprovádí, což je užitečné při násobení čísel ve formátu 16.0. V šestnáctkové soustavě se zapisují čísla se znaménkem ve formátu 1.15 ve tvaru, který je demonstrován v následujících příkladech Signálový procesor ADSP-2181 Formát 1.15 Číslo v desítkové soustavě 0x0001 0.000031 0x7FFF 0.999969 0xFFFF -0.000031 0x8000-1.000000 Signálový procesor je vyroben 0.5 µm CMOS technologií. Jako obvodová součástka nemůže pracovat samostatně, ale s dalšími podpůrnými obvody, jako jsou například paměti a periferie. Obvodové schéma zapojení je na obr. XXX. Protože tento text není konstrukčním manuálem, nebudou popisovány všechny vývody této součástky, ostatně některé vývody nejsou v diagramu uvedeny. Z označení jsou však zjevné externí adresové a datové sběrnice, sériové porty, přerušovací signály, atd.. Schéma má význam v souvislosti se vstupy a výstupy procesoru, které ovlivňují jeho program a které lze přímo programově ovládat. 5

Obr. D-1 Obvodové schéma zapojení signálového procesoru a dalších podpůrných obvodů Paměť Procesor integruje 80K (K = 1024) bajtů paměti, která je rozdělena na několik částí. Signálový procesor používá modifikovanou harvardskou architekturu, ve které se data ukládají do zvláštní RAM paměti (Data Memory) a program, případně další data, do jiné RAM paměti (Programm Memory). Buňky paměti programu jsou 24bitové a kapacita paměti je 16K. V jedné buňce je jedna 24bitová instrukce. Buňky paměti dat jsou jen 16bitové a jejich počet je také 16K. Adresy buněk paměti jsou šestnáctková čísla v rozsahu od 0x0000 do 0x3FFF. Jak již bylo poznamenáno, do paměti programu lze ukládat také data, což se s výhodou požívá jednotka MAC při výpočtu součtu součinů. Příklad mapy datové a programové paměti v dále popsaném vývojovém systému EZ-KIT Lite je následující: Data Memory (DM) Program Memory (PM) Data memory Adresy Program Memory Adresy 32 paměťově mapovaných registrů umístěných v DM 0x3FFF 0x3FE0 8K Internal (PMOVLAY=0, MMAP=0) 0x3FFF Internal 8160 words 0x3FDF 0x2000 nebo 8K External (PMOVLAY=1 nebo 2 MMAP=0) 0x2000 8K Internal (DMOVLAY=0) nebo 8K External (DMOVLAY=1,2) 0x1FFF 0x0000 8K Internal 0x1FFF 0x0000 Konfigurace programové paměti je řízena vývodem MMAP (v blokovém schématu není zakreslen) integrovaného obvodu a registrem PMOVLAY. Ve zmíněném vývojovém systému je použito MMAP = 0 ze dvou možných. K dispozici je 16 352 slov (words) datové paměti jestliže DMOVLAY=0. Posledních 32 adres datové paměti obsahuje tzv. paměťově mapované registry. S těmito registry se z hlediska programování přiřazovacích příkazů pracuje jako s ostatními paměťovými buňkami. Kromě paměťově mapovaných registrů obsahuje signálový procesor ještě řadu dalších registrů, z nichž některé jsou nepřístupné zápisu nebo čtení. Jsou to registry výpočetních jednotek (ALU, MAC, Shifter a Bus Exchanger), jednotek generátorů adres (Data Address Generator) a jednotky řadiče programu (Program Sequencer). Tyto registry z hlediska programování přiřazovacích příkazů tvoří skupinu odlišnou od paměťově mapovaných registrů. K signálovému procesoru lze připojit tzv. Byte Memory (bajtovou paměť) přes Byte Memory DMA (BDMA). Adresa o 22 bitech umožňuje adresovat tuto paměť do 4 MB. S bajtovou pamětí se komunikuje (zápis/čtení) přes Byte DMA Port. Tato paměť je rozdělena na 256 stránek po 16 K 8 bitových slov, ale formát slov může být také 16 nebo 24 bitů, popřípadě 8 bitů LSM nebo MSB. K přístupu k datům je třeba znát stránku (BMPAGE), počet čtených slov (BWCOUNT) ze stránky a formát slov (BTYPE). Nejběžněji se Byte Memory používá k zavedení programu (tzv. bootování) signálového procesoru z externí paměti EPROM po resetu nebo po zapnutí napájení. Způsob zavedení (nebo také nezavedení) obsahu Byte Memory do paměti určuje kombinace logických hodnot na vývodech MMAP a BMODE procesoru. Bootovat lze také z paměti Overlay Memory nebo přes IDMA Port z host počítače. 6

DSP je připraven na použití dodatečné externí I/O paměti (I/O Memory) o 2048 paměťových místech pro potřeby paralelních periferií. K signálovému procesoru ADSP-2181 lze připojit externí paměť (OVERLAY MEMORY) složenou ze dvou 8K segmentů paměti programu a ze dvou 8K segmentů paměti dat. Tyto segmenty mohou být swapovány pro horních 8K paměti programu nebo dolních 8K paměti dat. Externí segmenty 8K paměti programu (PMOVLAY=1 nebo 2) jsou mapovány například od adresy PM(0x2000). Sběrnice DSP má pět sběrnicí, dvě sběrnice pro adresy (DMA - Data Memory Address Bus a PMA - Program Memory Address Bus), dvě sběrnice pro data (DMD - Data Memory Data Bus a PMD - Program Memory Data Bus) a pátou sběrnicí pro výstupy výpočetních jednotek (R - BUS), která nepokračuje do rozšiřující části. Datová sběrnice pro paměť dat je 16bitová a pro paměť programu 24bitová. Obě adresové sběrnice jsou 14 bitové, tj. lze adresovat 16K (K = 1024) buněk paměti. Adresové a datové sběrnice lze napojit na externí sběrnici adresovou o velikosti 14 bitů a datovou o velikosti 24 bitů. Výpočetní jednotky Procesor obsahuje tři výpočetní jednotky, které budou podrobně popsány v části popisující programování. K těmto jednotkám lze přiřadit jednotku Bus Exchange. Procesor pracuje s 30 ns instrukčním cyklem (frekvence hodinového kmitočtu je 33 MHz). Každá instrukce je provedena v jednom cyklu. Výpočetní jednotky obsahují několik registrů. Registry jsou většinou 16bitové. Počet bitů odlišný od 16 je vyznačen. Některé registry výpočetních jednotek MAC a Shifter jsou spojeny. Jedná se o registr MR u jednotky MAC a SR u jednotky Shifter. Dílčí části těchto registrů jsou však pro instrukce čtení a zápisu přístupné. Jednotkám ALU, MAC a Shifter přísluší řada příkazů, které budou probrány později. Souhrnně lze uvést, že ALU jednotka provádí operace běžné v jiných procesorech. Hlavní předností signálového procesoru je násobení s výsledkem na 32 bitů a současná akumulace (sčítání nebo odečítání) do 40bitového registru jednotky MAC. Jednotka Shift zjednodušuje bitové posuny obsahu registrů a buněk. Funkci jednotky Bus Exchanger je zprostředkovat výměnu mezi 24bitovou datovou sběrnici paměti programu a 16bitovou datovou sběrnicí paměti dat. Tato výměna probíhá je dvojím způsobem. První způsob spojení umožňuje přenášet data mezi horními 16 bity datové sběrnice paměti programů a datovou sběrnici paměti dat. Druhý způsob v spočívá ve využití 8 bitového registru PX, který může být zaplněn dolními 8 bity z každé datové sběrnice nebo ze kterého lze číst 8 dolních bitů každé sběrnice. 7

ALU MAC AX0 AX1 AY0 AY1 MX0 MX1 MY0 MY1 AR AF 8 16 16 MR2 MR1 MR0 MF Shifter BUS EXCHANGE 8 5 SI SE SB 8 PX SR1 SR0 Všechny registry uvedených výpočetních jednotek mají trojrozměrný stín, což znamená, že kromě primárních registrů jsou také sekundární registry. Následující instrukce přepnou na skupinu sekundárních registrů a zpět. ENA SEC_REG; DIS SEC_REG; Všechny procesory rodiny ADSP-21xx podporují paralelismus. V jednom cyklu lze současně generovat příští programovou adresu připravit (fetch) příští instrukci provést dva datové přenosy změnit jeden nebo dva ukazatele adres provést výpočet Ve stejném cyklu lze také přijmout nebo vyslat data přes sériový port přijmout nebo vyslat data přes port host procesoru přijmout nebo vyslat data přes DMA porty Znalost hardware má význam ve spojitosti s programováním. Další popis bude tedy tyto okruhy vědomostí prolínat. Generátory adres dat DSP má dva generátory (DAG) s označením #1 a #2. V jednom cyklu lze připravit (Fetch) k výpočtu dva operandy (jeden z paměti dat a druhý z paměti programu) a jednu instrukci z paměti programu. Každý DAG udržuje a obnovuje čtyři adresové ukazatele (address pointers) s označením I. Kdykoliv je adresový ukazatel použit k přístupu k datům (tzv. nepřímému adresování) je tento ukazatel modifikován dodatečně (po vykonání operace) obsahem jednoho ze čtyř modifikačních registrů M. Další čtyři registry obsahují informaci o délce L, která může být využita k tzv. cyklickým zásobníkům (buffers). Obsah registrů lze číst nebo do nich zapisovat prostřednictvím datové sběrnice paměti dat. Všechny registry jsou 14bitové, a proto mohou pracovat s adresami až 16K paměti. 8

DAG1 (adresuje pouze DM) možnost reverzování bitů DAG2 (adresuje PM a DM) I0 L0 M0 I4 L4 M4 I1 L1 M1 I5 L5 M5 I2 L2 M2 I6 L6 M6 I3 L3 M3 I7 L7 M7 14 bitů 14 bitů 14 bitů 14 bitů 14 bitů 14 bitů Možnost reverzace pořadí bitů u DAG1 se s výhodou používá k výpočtu FFT, který touto transformací ulehčuje. Protože adresy jsou jen 14 bitové, je při reverzaci zrcadlen obsah bitů podle rozhraní mezi 6. a 7. bitem, dále se vymění 5. a 8. bit až k výměně 0. až 13. bitu. Reverzace se povolí a zakáže následujícími instrukcemi. ENA BIT_REV; DIS BIT_REV; Řadič programu DSP podporuje podmíněné skoky, volání podprogramů a návraty ze smyček. Interní čítač průchodů smyčkou a speciální odkládací zásobníky (stacks) pro smyčku umožňují jejich programování bez použití skoků. Odkládací zásobníky jsou paměťová místa s několika pozicemi, které jsou přístupné tak, že číst lze jen poslední uložený údaj a zapisovaný údaj se ukládá vždy na vrchol (top) zásobníku. Počet možných pozic se označuje jako hloubka odkládacího zásobníku. K čítači instrukcí patří několik registrů. Některé slouží k řízení přerušovacího systému: IMASK, ICNTL a IFC. Status aritmeticko-logické jednotky (ALU) je v registru ASTAT, status zásobníků (PC STACK, COUNT STACK, STATUS STACK a LOOP STACK) je obsažen v registru SSTAT a módy procesoru jsou v registru MSTAT. Na vrchol 12úrovňového odkládacího zásobníku (STATUS STACK) jsou automaticky přesunuty obsahy registrů IMASK, MSTAT a ASTAT jako součást začátku obsluhy přerušení. Registr CNTR a odkládací zásobník COUNT STACK je použit pro programové smyčky. V registru je počet aktuálních průchodů smyčkou, a proto se před instrukcí smyčky zaplní požadovaným počtem průchodů. Počet současně vykonávaných smyček je až 4. Jestliže je smyčka nedokončena, pak instrukce další smyčky přesune aktuální obsah registru CNTR na vrchol odkládacího zásobníku COUNT STACK s kapacitou čtyř 14bitových čísel. Z vrcholu tohoto zásobníku lze manuálně údaj odebrat instrukcí POP CNTR. Registr OWRCNTR slouží k přepsání počtu aktuálně vykonávaných smyček. Tento registr nelze číst a nesmí být součástí poslední instrukce smyčky. K funkci smyček patří také zásobník LOOPSTACK s hloubkou 4 pozic a šířkou 18 bitů (14 bitů pro konec smyčky a 4 bity pro podmínky jejího ukončení). Je obsluhován automaticky při zahnízdění smyček. Je však možné jeho z vrcholu zásobníku údaj sejmout (POP LOOP). Odkládací zásobník PC STACK je 14bitový a obsahuje 16 pozicí. Do tohoto zásobníku jsou ukládány návratové adresy pro případ přerušení, volání podprogramu nebo při volání smyček. Obsluha odkládacího zásobníku je automatická při přerušení a volání podprogramu. Na vrchol odkládacího zásobníku lze však přesouvat obsahy registrů na jeho vrchol (TOPPCSTACK = reg) nebo jeho poslední vložený obsah odebrat (reg = TOPPCSTACK). Odkládací zásobníky jsou použity při volání podprogramu nebo při použití smyčky. 9

PROGRAM SEQUENCER 18 5 14 LOOP STACK 4x18 ICNTL 16 IFC PC STACK 16x14 8 14 SSTAT OWRCNTR 16 8 8 CNTR IMASK MSTAT ASTAT COUNT STACK 4x14 STATUS STACK Přerušovací systém: DSP má 12 úrovní přerušení od nejvyšší priority, kterou je vstup RESET, až po Timer (časovač) s prioritou nejmenší. Zdroj přerušení Adresa vektoru přerušení RESET nebo připojení napájení (nemaskovatelné) 0x0000 (Nejvyšší priorita) Odpojení napájení (nemaskovatelné) 0x002C IRQ 2 0x0004 IRQL 1 IRQL 0 SPORT0 Transmit SPORT0 Receive IRQE BDMA Interrupt Transmit nebo IRQ 1 SPORT1 Receive nebo IRQ 0 Timer 0x0008 0x000C 0x0010 0x0014 0x0018 0x001C 0x0020 0x0024 0028 (Nejnižší priorita) Čtyři zdroje přerušení jsou externí, a to vývody integrovaného obvodu: IRQ 2, IRQL 1, IRQL 0 a IRQE. Dva jsou citlivé na úroveň přerušovacího signálu ( IRQL 1, IRQL 0 ) a jeden na jeho hranu ( IRQE). Další dva externí signály pro přerušení mohou být získány konfigurací SPORT1 na vývody IRQ 1, IRQ 0, FLAG_IN a FLAG_OUT. Vnitřní zdroje přerušení pocházejí od časovače, DMA portu, dvou sériových portů a od kontrolních obvodů napájení. Přerušení s výjimkou resetu a ztrátě napájení jsou interně maskovatelná (lze je zakázat) změnou příslušných bitů registru IMASK. Význam jednotlivých bitů registru jsou zřejmé z následující instrukce 10

IMASK = b#0000000000; { + timer +- SPORT1 rec or IRQ0 +-- SPORT1 trx or IRQ1 +--- BDMA +---- IRQE +----- SPORT0 rec +------ SPORT0 trx +------- IRQL0 +-------- IRQL1 +--------- IRQ2 } Externí přerušovací signály IRQ 2, IRQ 0 a IRQ 1 lze nastavit na citlivost na hranu (edge-sensitive) signálu nebo na úroveň (level-sensitive) signálu, a to obsahem registru ICNTL. Nastavení typu citlivosti souvisí s řešením hardware zdroje přerušení vně DSP. Při použití citlivosti na úroveň signálu je potřeba po obsluze přerušení zajistit návrat přerušovacího signálu na výchozí úroveň. Vnitřní zdroje přerušení nemají v tomto registru bity pro nastavování citlivosti, protože se chovají jako citlivá na hranu. Zahnízdění (nesting) přerušení lze změnou obsahu 4. bitu tohoto registru povolit nebo zakázat. Význam jednotlivých bitů je zřejmý z demonstračních příkladů. Změnou obsahu IFC registru lze na hranu citlivá přerušení vnutit (bity 8-15) nebo tyto neobsloužené (pending) přerušení vynulovat (bity 0-7). Externím zdrojům přerušení lze toto přerušení vnutit jen pokud jsou citlivé na hranu. Implicitně jsou citlivá na hranu přerušení také od jednotky TIMER a jednotek SPORT. Vnucené přerušení se obslouží jedenkrát. Příklad vynulování přerušení je uveden v následujícím přiřazovacím příkaze: IFC = b#0000000011111111; { vynulování přerušení } /------//------/ vnucení / vynulování { + timer +- SPORT1 rec or IRQ0 +-- SPORT1 trx or IRQ1 +--- BDMA +---- IRQE +----- SPORT0 rec +------ SPORT0 trx +------- IRQ2 vynulování přerušení +-------- timer vnucení přerušení +--------- +---------- SPORT1 trx +----------- BDMA +------------ IRQE +------------- SPORT0 rec +-------------- SPORT0 trx +--------------- IRQ2 vnucení přerušení } Adresy vstupních procedur ve vektoru přerušení jsou po 4 buňkách od adresy 0x0000. Jestliže lze přerušení obsloužit v těchto 4 buňkách není třeba odskoku (JUMP) do podprogramu. Velkou výhodou pro softwarovou obsluhu přerušení je zdvojení všech vstupních a výstupních registrů výpočetních jednotek. Na začátku obsluhy přerušení se lze prostě přepnout na zmíněné sekundární registry bez úklidu rozpracovaných akcí. Na konci podprogramu obsluhy přerušení je instrukce návratu RTI. Zásobníky uchovávají obsah některých registrů (stav procesoru) během obsluhy přerušení, vykonávaní smyček a vykonávání posdprogramů. STATUS STACK má 12 úrovní, aby bylo možné zahnízdění při přerušení, smyčce a podprogramu 11

Následující instrukce globálně povolí nebo zakáže obsluhu přerušení (včetně výpadku napájení) bez ohledu na obsah registru IMASK. Zákaz obsluhy se nevztahuje na autobuffering sériového portu. ENA INTS; DIS INTS; Po resetu je obsluha přerušení vždy povolena. Sériové porty DSP obsahuje dva synchronní sériové porty (SPORT0 a SPORT1) pro sériové komunikace. Tyto porty mají následující vlastnosti jsou obousměrné a mají oddělené zdvojené sekce pro příjem a vysílání mohou použít vnější hodinový kmitočet ke svému řízení nebo generovat svůj vlastní (SCLK) mají nezávislé rámcování (framing) pro příjem a vysílání podporují sériový přenos dat o délce 3 až 16 bitů s kompresi a expansi (companding) podle obou norem, tj. evropské A-law a americko-japonské µ-law v souhlase s doporučením CCITT G.711 (Companding má význam v telekomunikačních aplikacích a umožňuje dosáhnout dynamického rozsahu signálu 64 nebo 72 db (teoreticky na výstupu 12bitového převodníku, 16 bitů dovolí dynamický rozsah 96 db) jen s daty o 8 bitech. Tento rozsah se dosáhne převodem signálu blokem s nelineární charakteristikou.) obě části, příjmová a vysílací, generují přerušení při dokončení přenosu dat mohou přijímat a vysílat obsah celého cyklického zásobníku dat, přerušení je generováno po dokončení přenosu SPORT0 má mnoho-kanálový interface pro selektivní příjem a vysílaní, u kterého je bitový tok přepínán časovým dělením SPORT1 může být konfigurován, aby pracoval se dvěma externími přerušeními ( IRQL 1, IRQL 0 ) a Flag_In a Flaf_Out signály, přičemž interně generovaný hodinový kmitočet může být použit v této konfiguraci. Blokové schéma jednoho ze dvou portů SPORTn (n=0 a 1) je na obr. XXXXX. Z hlediska programování jsou důležité pro výstup registry TX1 a TX2 a pro příjem registry RX1 a RX2 a jejich napojení na datovou sběrnici paměti dat. Signály DT a DR představují sériová výstupní a vstupní data. Signál SCLK jsou je signál hodin. Signály TFS a RFS jsou pro synchronizaci rámců dat. Oba sériové porty jsou velmi univerzální a prostřednictvím paměťově mapovaných registrů mohou různě konfigurovány. Sériový port SPORT0 má registry v úseku adres datové paměti 0x3FF3 až 0x3FFA a SPORT1 v úseku adres stejné paměti 0x3FEF až 0x3FF2. 12

DMD Bus 16 16 TXn Transmit Data Register 16 Transmit Shift Register Companding Hardware Serial Control 16 RXn Receive Data Register 16 Receive Shift Register TFS DT SCLK Internal Serial Clock Generator RFS DR Obr. D-1 Blokové schéma sériového portu Před prvním použitím musí být sériové porty zkonfigurovány. Konfigurace se týká následujících nastavení SPORT ENABLE, přístupnost portu se nastavuje v registru System Control Register DM(0x3FFF) SERIAL CLOCKS, zdroj hodinového kmitočtu (interní/externí) se u portu SPORT0 nastaví v registru SPORT0 Control Register DM(0x3FF6) a u portu SPORT1 v registru SPORT1 Control Register DM(0x3FF2) SCLK FREQUENCY, frekvence taktu pro sériový port je zlomkem hodinové frekvence procesoru, faktor pro dělení SCLKDIV je pro SPORT0 obsahem DM(0x3FF5) a pro SPORT1 obsahem DM(0x3FF1) WORD LENGTH, délka slova může být od 3 do 16 bitů, nastaví se u portu SPORT0 v registru SPORT0 Control Register a u portu SPORT1 v registru SPORT1 Control Register WORD FRAMING OPTIONS (týká se tzv. framing signálů k identifikaci prvního bitu přenášeného slova, nastaví se u portu SPORT0 v registru SPORT0 Control Register a u portu SPORT1 v registru SPORT1 Control Register). FRAME SYNCHRONIZATION, určuje, zda je framing signál potřebný jen u prvního přenášeného slova nebo u každého slova FRAME SYNC SIGNAL SOURCE, zdroj synchronizačního signálu NORMAL AND ALTERNATE FRAMING MODES, týká se způsobu kontroly framing signálu ve vztahu ACTIVE HIFH OR ACTIVE LOW, týká se úrovně, při které je framing signál aktivní COMPANDING AND DATA FORMAT, nastavení komprese nebo dekomprese a formátu dat, nastaví se u portu SPORT0 v registru SPORT0 Control Register a u portu SPORT1 v registru SPORT1 Control Register. Čtení nebo zápis dat do sériového portu lze naprogramovat tak, že se provádí po jednotlivých slovech nebo v celých blocích. Příklad čtení jednotlivých slov je následující: TX1 = AX0; AYO = RX0; {obsah AX je vyslán na port SPORT1} {obsah RX0 v SPORT0 je přenesen do AY0} 13

Druhý příkaz je vykonán jako obsluha přerušení, které SPORT0 generuje při přijetí celého slova. Druhý zmíněný způsob programování se týká celých bloků dat a nazývá se Autobuffering. Data jsou přenášena přímo mezi pamětí a registry sérového portu. I když přenos nelze popsat přímo instrukcemi, princip je přibližně ekvivalentní instrukcím dm(i,m) = RX0; {příjem} TYO = dm(i,m); {vysílání} Přerušení jsou generována až po přenosu celého bloku. Toto přerušení nelze znepřístupnit jako některá přerušení. Autobuffering užívá cyklických zásobníků a generátoru adres. Konfiguruje se pro SPORT0 v registru SPORT0 Autobuffer Control Register DM(0x3FF3) a pro SPORT1 v registru SPORT1 Autobuffer Control Register DM(0x3FEF). V těchto paměťově mapovaných registrech jsou přiřazeny registry generátorů adres. Sériový port SPORT0 podporuje mnoho-kanálový přenos dat. Jednotlivé kanály jsou ovšem časově dělené, tj. data se vysílají/přijímají postupně. Příslušnost ke kanálu je dána pořadím přenášeného slova v bloku. Kanálů může být celkem 24 nebo 32 a na kterýkoliv z nich se lze selektivně zaměřit a ignorovat ostatní kanály. Mnoho-kanálový přenos se konfiguruje v registru SPORT0 Control Register. Používání sériového portu a jeho konfigurace bude demonstrována na zvláštním příkladu v jiném místě textu. IDMA Port Internal DMA Port je paralelní vstupní a výstupní port, který umožňuje host počítači přímé čtení z paměti signálového procesoru a také přímý zápis do této paměti s výjimkou paměťově mapovaných registrů paměti dat. Přímo připojený host počítač může být například Motorola 68000 nebo Intel 8051 a nebo kterýkoliv DSP z rodiny ADSP-21xx. Přístup do paměti DSP z host počítače je úplně asynchronní a bez asistence ADSP-2181. IDMA Port má 16bitovou adresovou a datovou sběrnici, po které lze vyměňovat data mezi paměti programu nebo dat a host počítačem. Funkce IDMA Portu se řídí 4 vývody, které jsou pro DSP vstupy. Jestliže se data čtou nebo zapisují prostřednictvím IDMA datové sběrnice, pak adresa paměti dat nebo programu je obsažena v registru s názvem IDMA Control Register, který je mapován v paměti dat na adrese DM(0x3FE0). Tato adresa je 14bitová, 15. bit registru určuje zdá výměna dat probíhá mezi paměti dat nebo paměti programu a IDMA datovou sběrnicí. Časovač (Timer) Procesor má rovněž 16bitový časovač (Timer) s tzv. prescalerem k násobnému zvětšení počtu cyklů nad rozsah 16bitového čísla. Vlastní čítač je postupně dekrentovaný registr TCOUNT, který po dosažení nuly generuje přerušení se současným obnovením výchozí hodnoty z registru TPERIOD. Dekrementování je v každém instrukčním cyklu jestliže obsah registru TSCALE (zmíněný prescaler) je nulový. Jestliže je registr TSCALE nenulový, např. n, pak dekrementace se opakuje až po n+1 cyklech procesoru. Zmíněné tři registry časovače, z nichž dva jsou 16bitové a jeden (TSCALE) 8bitový, jsou umístěny (mapovány) v datové paměti. Timer Registers 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Registr Místo v paměti TPERIOD TCOUNT DM(0x3FFD) DM(0x3FFC) 14

0 0 0 0 0 0 0 0 TSCALE DM(0x3FFB) Časovač lze zpřístupnit nebo zakázat instrukcemi ENA TIMER; DIS TIMER; Časovač lze zpřístupnit/zakázat nastavením/nulováním 5. bitu registru MSTAT. Programování signálového procesoru rodiny ADSP 21xx Programování signálového procesoru se opírá o jazyk, který je označován jako asembler. Tento jazyk je mnohem dokonalejší než běžný asembler počítačů třídy PC. Jeho omezení jej vylučuje z rodiny vyšších programovacích jazyků jako C, Pascal apod.. Jako v asembleru se používají návěští a identifikátory. Snadné je použití přiřazovacích aritmetickologických příkazů se zápisem srovnatelným s jazykem C, dále použití instrukcí skoku a cyklu (smyčky), volání podprogramu nebo návrat z podprogramu a návrat z obsluhy přerušení. Řada instrukcí může být podmíněna. Zmíněná omezení úzce souvisí s architekturou signálového procesoru, proto popis instrukcí se bude opírat o blokové zapojení jednotlivých výpočetních jednotek. Výhodou asembleru je především to, že všechny operace jsou pod kontrolou, a proto je některými programátory oblíben. Kromě asembleru lze pořídit překládač z jazyka C (C Compiler). Překládač čte zdrojový kód v normě ANSI C. Při popisu syntaxe instrukcí je použito konvence, podle které hranaté závorky [ ] značí nepovinnou část instrukce a výběr z alternativ je ve sloupci se závorkami. Zápis programů není citlivý na použití velkých a malých písmen. Komentáře (poznámky) Struktura programu obsahuje část deklarace s různými direktivami pro překlad a část instrukcí. Komentáře se uzavírají mezi závorky { } nebo /* */ a mohou přesahovat přes několik řádek. Instrukce Jedna instrukce obsazuje jedno paměťové místo (24 bitů) v paměti programu, tj. její přeložený kód obsadí jednu buňku paměti jako při použití jazyka C. Instrukce se provádí v jednom taktu (cyklu) procesoru odvozeného od hodinové frekvence. Žádná instrukce není rozložena na více taktů jako v případě některých jiných procesorů. Toto pravidlo umožňuje odhadnout rychlost provádění programu na základě sečtení počtu prováděných instrukcí. Instrukce se ukončuje středníkem nebo některé také čárkou. V případě, že se během jednoho taktu vykonává jedna instrukce, pak se ukončuje středníkem, tj. instrukce ; Protože procesor podporuje paralelismus, některé instrukce se mohou vykonávat současně v jednom taktu procesoru, a to jen v určitém pořadí. Tyto instrukce se oddělují čárkami, přičemž poslední instrukce takto sdružených instrukcí je zakončena středníkem, tj.například instrukce1, instrukce 2, instrukce3 ; Takto sdružené instrukce mohou být až tři, z nichž je jedna výpočetní a dvě pro přípravu operandů s využitím generátorů adres DAG1 a DAG2. V dokumentaci se nazývají multifunkční. 15

Identifikátory Pro identifikátory (jména proměnných) nespecifikují příručky žádná výjimečná pravidla. Platí stejné zásady jako u ostatních programovacích jazyků, např. C. Protože se identifikátory nepoužívají v aritmeticko-logických operacích, jsou to jen jména paměťových míst (buněk), které jsou při popisu nahrazena <addr>. Příklad jména proměnné je var_name nebo buffer_name. Další použití identifikátoru je v návěštích (label). Klasické označení pole nebo indexovaná proměnná se v programátorské příručce nepoužívá, tato označení jsou nahrazena označením zásobník (buffer). Jestliže data představují zásobník, pak jeho identifikátor, např. buffer_name, je název první buňky s prvním prvkem zásobníku. Další prvek je umístěn v buňce s názvem zvetšeným o jednotku, tj. pro uvedený příklad buffer_name+1. Třetí prvek zásobníku je uložen v buňce buffer_name+2, atd.. Data Data jsou v popisu instrukcí označována <data>. Při respektování rozsahu čísel daných 16 bity lze data zapsat ve dvojkové, desítkové nebo šestnáctkové soustavě. Při operacích v jednotce ALU je jejich formát 16.0. Jednička může být tedy zapsána těmito ekvivalentními způsoby b#0000000000000001 nebo 1 nebo 0x0001 nebo h#0001 Při operacích v jednotce MAC záleží na módu procesoru. V integer mode jsou předpokládána ve formátu 16.0, zatímco ve fractional mode jsou ve formátu 1.15. Jméno buňky se mění na data předsunutím znaku ^ nebo %. Význam těchto znaků demonstrovaný na příkladu je následující ^buffer_name označuje adresu buňky, tj. její pořadí od začátku paměti s první buňkou o adrese 0x0000 (znak má v jazyku C význam ukazatele pointeru) %buffer_name označuje délku deklarovaného zásobníku (pole) viz dále Tato možnost je používána pro přiřazování hodnot registrům I a L z DAG1 a DAG2. Přiřazovací příkaz Tento příkaz obsahující rovnítko (=) podstatně usnadňuje a zpřehledňuje programování signálového procesoru oproti klasickému asembleru, avšak jeho použití je silně omezeno. Vzájemně lze přiřazovat, tj. přenášet data, jen tehdy, jestliže mezi jejich zdrojem a příjemcem je přímé hardwarové spojení. Možnosti přenosu dat jsou pro následující obsah registru lze přenést do jiného registru (oba registry se předpokládají paměťově nemapované) v jednom taktu procesoru data z paměti dat lze číst do všech paměťově nemapovaných registrů a opačně paměť dat lze plnit obsahy těchto registrů v jednom taktu procesoru jen některé registry výpočetních jednotek (ALU, MAC a Shifter) mohou využít generátorů adres pro čtení a zápis (jedná se o registry AX0, AX1, AY0, AY1, AR, MX0, MX1, MY0, MY1, MR0, MR1, MR2, SI, SE, SR0 a SR1), přičemž paměť programu je dostupná jen u DAG2 daty lze plnit přímo jen paměťově nemapované registry, paměť lze daty plnit jen prostřednictvím paměťově nemapovaných registrů, tj. ve dvou taktech procesoru. 16

Omezení tedy spočívá v nemožnosti v jednom přiřazovacím příkaze zaplnit některou buňku paměti a nebo uskutečnit přenos přímo mezi buňkami paměti. Tyto operace je třeba uskutečnit například pomocí registrů výpočetních jednotek. S obsahem paměťově mapovaných registrů v paměti dat se pracuje jako s ostatními buňkami paměti. Například zaplnění paměťově mapovaného registru v paměti dat na adrese 0x3FF2 obsahem 0x6B27 se vykoná například prostřednictvím registru AX0 AX0 = 0x6B27; {naplnění registru AX0 žádaným obsahem} dm(0x3ff2) = AX0; {přepis obsahu registru AX0 do žádané buňky} Písmena dm označují paměť dat a písmena pm by označovala paměť programu. Přímé a nepřímé adresování paměti Signálový procesor využívá nepřímé adresování pomocí registrů I generátorů adres (Data Address Generators, tzv. DAGs). Tyto registry se nazývají také indexregistry. Rozdíl mezi nepřímým a přímým adresováním lze nejlépe demonstrovat na příkladu. Nechť je deklarován zásobník o 256 buňkách se jménem coefficients v paměti programu. Toto jméno lze považovat rovněž za název paměťových míst této paměti..var/pm/ram coefficients[256]; Příkladem přímého adresování je například načtení prvního koeficientu do libovolného registru, který není paměťově mapován, tj. například MX0 MX0 = pm(coefficients); {příklad přímého adresování} Načtení druhého koeficientu do registru téhož registru se uskuteční příkazem MX0 = pm(coefficients+1); {příklad přímého adresování} Pro příklad použití nepřímého adresování nechť je deklarována jiná proměnná se jménem addr_ptr..var/dm/ram addr_ptr; Jak bylo uvedeno, přímým adresováním lze načíst obsah buňky se jménem addr_ptr do libovolného paměťově nemapovaného registru. Mezi paměťově nemapované registry patří také registry generátoru adres DAG, tj. například registr I3 I3 = dm(addr_ptr); {příklad přímého adresování} Jak je v části popisující cyklické zásobníky uvedeno, je třeba, aby byl definován rovněž obsah registru L3 (příslušejícího k I3) a obsah některého z registrů M0 až M3, například M1 L3 = 0; M1 = 0; Nepřímé adresování paměťových buněk znamená použití adresy obsažené v registru I. Například čtení z paměti dat do registru AX0 se uskuteční instrukcí AX0 = dm(i3); Cyklické a lineární zásobníky (buffers) Specialitou signálového procesoru jsou cyklické a lineární zásobníky hodnot, které mají hlavní uplatnění ve zpožďovacích linkách. Funkce zásobníků přímo souvisí generátory adres. Hlavní význam obou zásobníků spočívá v automatické modifikaci adresy, jejíž obsah byl čten nebo měněn. Toto umožňuje následující operaci s další buňkou paměti bez opravy ukazatele na její adresu. Pro tyto zásobníky je třeba nastavit nejprve adresu první buňky zásobníku do 17

některého registru I, dále je třeba nastavit délku zásobníku (počet prvků pole) do registru L a také do registru M zadat o kolik se má aktuální adresa modifikovat. Výběr kombinace registrů musí odpovídat jednomu DAG, ale v rámci něj se čísla registrů I, L a M mohou lišit. Nechť adresa první buňky (base address) cyklického registru je B, pak adresa pro příští paměťovou operaci, uložená v registru I, je dána vztahem: příští adresa = (I + M B) kde modulo znamená zbytek po dělení. Z cyklického zásobníku jsou postupně vybíraná (ukládaná) data a při dosažení konce zásobníku je automaticky pokračováno od jeho počátku znovu. Obsah registru M tedy určuje o kolik buněk dopředu (kladný obsah M) nebo dozadu (záporný obsah M) se má příští paměťová operace posunout. Zvláště důležité je nezapomenout na přiřazení hodnoty délky v registru L se stejným pořadím jako má registr I. Jestliže je L = 0, pak je zásobník lineární, což znamená, ze adresa je podle obsahu M inkrementována nebo dekrementována k hranicím fyzické paměti a funkce programu se zhroutí. Jak je patrné z výčtu direktiv překládače, cyklický zásobník je třeba deklarovat. Například deklarace zásobníku s názvem (jménem) rx_buf pro 3 čísla v datové paměti (dm) paměti RAM (ram) je následujícím způsobem.var/dm/ram/circ rx_buf[3]; Počáteční přiřazení obsahů vybraných registrů I, L a M je následující I6 = ^rx_buf; L6 = %rx_buf; M7 = 1; Cyklické zásobníky spolu s instrukcemi pro smyčky jsou zvláště výhodné pro programování zpožďovacích linek, které jsou součástí číslicových filtrů. Každé čtení nebo zápis vede k automatické modifikaci na další buňku bez psaní dalších příkazů. Inicializace proměnných a zásobníků Inicializací se rozumí přiřazení počátečních hodnot. Toto lze vykonat buď přiřazovacím příkazem nebo zvláštní direktivou.init. Hodnotu výše deklarované proměnné addr_ptr obsahující adresu konce datové nebo programové paměti lze zajistit direktivou.init addr_ptr: 0x3FFF; Nulování obsahu zásobníku rx_buf s 3 buňkami je možné provést direktivou.init rx_buf: 0x0000, 0x0000, 0x0000; nebo také jejich opakováním, což je výhodné pro velké zásobníky.init rx_buf[0]: 0x0000;.init rx_buf[1]: 0x0000, 0x0000; Výpis obsahu všech 256 buněk zásobníku coefficients by bylo nepraktické. Výhodné v tomto případě je vytvoření textového souboru například se jménem Koeficienty.dat, který obsahuje hodnoty pro zaplnění tohoto zásobníku. Inicializace se pak provede direktivou.init coefficients: <Koeficienty.dat>; 18

Zásobník coefficients je deklarován v paměti programu a může být použit například pro výpočet součtu součinů hodnot z tohoto zásobníku se stejně dlouhým zásobníkem v paměti programu. Pro tuto operaci je určena jednotka MAC. Paměť programu však obsahuje buňky se 24 bity, ze kterých lze využít jen horních (více významných) 16 bitů. Textový soubor je proto třeba zaplnit údaji pro všech 24 bitů. Do dolních 8 bitů se proto dosadí nuly. Několik řádků toho souboru s čísly v šestnáctkové soustavě může vypadat takto: 02E100 010400 FF1600 FD4B00 Čísla jsou bez znaků 0x, poslední dvě nuly odpovídají dolním 8 bitům buněk paměti programu. V případě, že by se plnila paměť dat, pak řádky obsahují jen 4 cifry šestnáctkového čísla. Direktivy pro překlad K ovládání překladu slouží tzv. direktivy, které se odlišují od instrukcí tím, že na řádku začínají tečkou. Direktivy se neprojeví v přeloženém programu jako samostatný kód. Nejpoužívanější direktivy jsou popsány v následující tabulce: Direktivy asembleru.module/qualifier/qualifier module_name; {první řádek zdrojového textu modulu, kvantifikátory vysvětleny v další tabulce}.page;.const constant_name=expresion; {definuje identifikátor symbolické konstanty výrazem, nejběžněji přímo konstantou }.VAR/qualifier/qualifier buffer_name[length],... ; {deklarace proměnných a zásobníků (polí). U zásobníků je vyznačena délka length }.INIT buffer_name: init_value1, init_value1,... ; {inicializace deklarovaných proměnných a obsahu zásobníků konkrétními hodnotami}.global buffer_name... ; {Atribut proměnných, zásobníků a portů, na které bude odvoláváno v jiných modulech}.entry program_label... ; {Atribut návěští, na které bude odvoláváno v jiných modulech}.external external_symbol; {Označuje proměnné, porty a návěští z jiných modulů, na které bude odkazováno. V těchto modulech musí být v modulech, kde jsou deklarovány, atributy.entry (návěští) nebo.global (proměnné a porty)}.port port_name; {Deklaruje paměťově mapovaný V/V port v RM nebo DM. Symbolické jméno musí být jméno portu deklarované v souboru popisu architektury (ADSP2181.ACH).}.INCLUDE <file_name>; {V tomto místě je kód programu rozšířen o obsah textového souboru, používá se pro společné konstanty}.dmseg dmseg_name;.macro macro_name(param1,param2,...);.endmacro;.local macro_label,...;.newpage; {Vloží přechod na novou stránku v.lst souboru}.pagelength #lines; { Vloží novou stránku v.lst souboru po lines řádků}.indent #columns; {Odsazení o columns sloupců v.lst souboru}.pagewidth #columns; {Nastavení pravého okraje na columns sloupců} 19

.ENDMOD; {poslední řádek ve zdrojovém textu modulu} Kvantifikátory jednotlivých direktiv jsou následující:.module qualifiers:.var qualifiers:.init qualifiers: RAM, ROM {paměť RAM nebo ROM} ABS=address {absolutní startovací adresa, nepoužívejte se STATIC} SEG=seg_name {absolutní startovací adresa, nepoužívejte se STATIC} STATIC PM, DM {paměť programu nebo dat} RAM, ROM {paměť RAM nebo ROM} ABS=address {umístění v paměti, nepoužívejte se STATIC} CIRC {cyklický zásobník} STATIC constant, constant,... {konstanty} <file_name> {jméno textového souboru, který je jakoby vložen na tomto místě} ^other_buffer {adresa jiného zásobníku} %other_buffer {délka jiného zásobníku} Při psaní kódu programu lze použít také direktivy preprocesoru (Assembler C Preprocessor Directives). Jejich použití dovoluje komponovat zdrojový kód z různých části a podmíněně vykonávat překlad. V textu zdrojového kódu se nejčastěji objevují jen direktivy #define a #include. #define macro_name(param1, ) expresion Definuje macro # undef macro_name Oddefinuje macro #include filename Vloží text z jiného zdrojového souboru #if expression #else #endif Podmíněně vloží a překládá v závislosti na logické hodnotě expression pro případ, že předcházející test if expression neuspěje #ifdef macro_name Podmíněně vloží a přeloží, jestliže je macro definováno s #define nebo přepínačem d # ifndef macro_name Podmíněně vloží a přeloží, jestliže je macro není definováno #else #endif pro případ, že předcházející #ifdef nebo #ifndef neuspěje Registry Funkce signálového procesoru je řízená obsahem registrů (Control Registers). Do registrů se rovněž zaznamenává stav procesoru (Status Registers). Registry jsou buď mimo paměť (DM a PM) nebo jsou součástí paměti dat, pro které je určeno 32 buněk s nejvyššími adresami u 16K datové paměti (DM). Některé registry jsou pro čtení a zápis, některé jen pro čtení (read only) nebo jen pro zápis (write only). Registry mimo datovou paměť jsou ASTAT 20

SSTAT (read only) MSTAT ICNTL IMASK IFC (write only) CNTR OWRCNTR (write only) Pokud je to povoleno, pak se s obsahem registrů zachází stejně jako s registry např. jednotky ALU (viz instrukce přesunu dat). Jako součást datové paměti je následujících 24 paměťově mapovaných registrů, které jsou deklarovány jako konstanty s hodnotami adres <addr>: Název registru Jednotka Místo v paměti IDMA IDMA Port DM(0x3FE0) BDMA_BIAD IDMA Port DM(0x3FE1) BDMA_BEAD IDMA Port DM(0x3FE2) BDMA_BDMA_Ctrl IDMA Port DM(0x3FE3) BDMA_BWCOUNT IDMA Port DM(0x3FE4) PFDATA IDMA Port DM(0x3FE5) PFTYPE IDMA Port DM(0x3FE6) SPORT1_Autobuf SPORT1 DM(0x3FEF) SPORT1_RFSDIV SPORT1 DM(0x3FF0) SPORT1_SCLKDIV SPORT1 DM(0x3FF1) SPORT1_Control_Reg SPORT1 DM(0x3FF2) SPORT0_Autobuf SPORT0 DM(0x3FF3) SPORT0_RFSDIV SPORT0 DM(0x3FF4) SPORT0_SCLKDIV SPORT0 DM(0x3FF5) SPORT0_Control_Reg SPORT0 DM(0x3FF6) SPORT0_TX_Channels0 SPORT0 DM(0x3FF7) SPORT0_TX_Channels1 SPORT0 DM(0x3FF8) SPORT0_RX_Channels0 SPORT0 DM(0x3FF9) SPORT0_RX_Channels1 SPORT0 DM(0x3FFa) TSCALE TIMER DM(0x3FFb) TCOUNT TIMER DM(0x3FFc) TPERIOD TIMER DM(0x3FFd) DM_Wait_Reg DM(0x3FFE) System_Control_Reg DM(0x3FFF) Obsahy těchto registrů jsou přístupné operacemi čtení a zápisu do paměti, které jsou popsány dále (viz instrukce přesunu dat). Všechny tyto deklarace lze vložit do deklarační části kódu programu pomocí direktivy.include z textového souboru, který je součástí software (CONSTANT.K), tj.:.include <CONSTANT.K> Význam jednotlivých bitů v registrech je zřejmý z demonstračních příkladů, tj. z míst jejich bezprostředního použití. S 8bitovým registrem ASTAT se čtenář setká při popisu instrukcí ALU jednotky. Žádný demonstrační příklad nemanipuluje s bity také 8bitového registru SSTAT, který je určen jen ke čtení, a proto význam jeho bitů je uveden v tomto místě. 21

ASTAT = b#00000000; { + AZ ALU Result Zero +- AN ALU Result Negative +-- AV ALU Overflow +--- AC ALU Carry +---- AS ALU X Input Sign +----- AQ ALU Quotient +------ MV MAC Overflow +------- SS Shifter Input Sign } SSTAT = b#01010101; { + PC Stack Empty read-only +- PC Stack Overflow +-- Count Stack Empty +--- Count Stack Overflow +---- Status Stack Empty +----- Status Stack Overflow +------ Loop Stack Empty +------- Loop Stack Overflow } Instrukce výpočetních jednotek DSP rodiny ADSP 21xx Instrukce výpočetní jednotky ALU Jednotka ALU provádí aritmetické a logické operace dvěma vstupními operandy X a Y z množiny přípustných registrů a výsledek ukládá do 16bitového registru AR nebo AF. Operand X může být vybrán z jednoho ze dvou 16bitových registrů AX0 a AX1 jednotky ALU, ale také z jejího výstupního registru AR, popřípadě z registrů MR0, MR1 nebo MR2 jednotky MAC nebo z registrů SR0 a SR1 jednotky Shifter. Operand Y zase může být vybrán jen z registru AY0, AY1 a AF jednotky ALU. Druhý operand může být povolená konstanta typu integer a nebo tzv. přenos (carry-bit). Jsou přípustné operace s jedním operandem. V instrukcích se tedy nepoužívají libovolné identifikátory. Před operaci v ALU je tedy třeba příslušné registry zaplnit daty paměťovými operacemi nebo přesunem z jiného registru. Přehled jednotlivých instrukcí výpočetní jednotky ALU je následující R = X + Y R = X - Y R = Y - X R = - X R = - Y R = X + Y + CI R = X - Y + CI - 1 R = Y - X + CI - 1 R = Y + 1 R = Y - 1 R = PASS X R = PASS Y R = 0 (PASS 0) R = ABS X R = X AND Y R = X OR Y R = X XOR Y R = NOT X R = NOT Y Poznámka: CI je přenos (carry-bit), PASS znamená přenos s nastavením statusu ALU jednotky (registr ASTAT) Zdrojové registry a registry pro výsledek jsou následující X input port Y input port R output port AX0, AX1 AY0, AY1 AR AR AF AF MR0, MR1, MR2 konstanta SR0, SR1 22

Pro operaci sčítání a odčítání může být druhý operand rovněž určitá hodnota konstanty, a to hodnoty 0, 1, 2, 4,...(mocniny dvou až do16384), 32767, -2, -3, -5, -9,...(mocniny dvou + 1 do 19385), -32768. Pro logické operace a operaci PASS může být druhý operand roven také mocnině dvou zmenšené nebo zvětšené o jedničku. ALU Status je obsažen v ASTAT registru, jehož bity jsou nastaveny za následujících podmínek AZ (Zero) AN (Negative) AV (Overflow) AC (Carry) AS (Sign) AQ (Quotient) R = 0 R<0 přetečení přenos znaménko X quocient ALU jednotka provádí také dělení, pro které jsou dvě instrukce DIVS Y, X; DIVQ X; kde operandy X a Y jsou v registrech stejných jako pro sčítání a odčítání. Dělení s jednoduchou přesností má dělence o délce 32 bitů a dělitele o délce 16 bitů. Výsledkem 16 cyklů výpočtu je 16bitový podíl (kvocient). Dělení může být se znaménkem nebo bez znaménka s podmínkou, že oba operandy jsou stejného typu. Horní polovina dělence (operand Y), 16 více významných bitů, se umístí do registru AY1 nebo AF a dolní polovina do registru AY0. Dělitel se umísti do libovolného registru přípustného pro operand X. Opakované provádění instrukce DIVQ implementuje sčítání/odečítání s výsledkem uloženým v registru AY0. Dělení se znaménky znamená první vykonání instrukce DIVS pro určení znaménka a pak 15 opakování instrukce DIVQ. Při dělení bez znamének je třeba horní polovinu operandu umístit v registru AF, pak nastavit na nulu bit AQ v registru ASTAT, což indikuje kladné znaménko výsledku. Pak následuje opakování instrukce DIVQ tolikrát, kolik je bitů v kvocientu. Bity kvocientu generované při každé instrukce DIVQ jsou uloženy v bitu AQ registru ASTAT. Výsledný zbytek produkovaný tímto algoritmem nemá platnou hodnotu a musí být korigován. Dělení je složitá operace, pro kterou je vhodné použít výrobcem sestavený podprogram, který bude popsán v jiném místě. Poslední instrukcí jsou operace s jednotlivými bity Y = TSTBIT n z X operace AND s 1 v bitu n operandu X Y = SETBIT n z X operace OR s 1 v bitu n operandu X Y = CLBIT n z X operace AND s 0 v bitu n operandu X Y = TGBIT n z X operace AND s 0 v bitu n operandu X Povolené hodnoty pro n jsou 0, 1,, 15, operand X může být jeden z registrů jako při operaci sčítání a odečítání. 23