background image

Jacek Izydorczyk1 
 

O różnych procesorach sygnałowych 

czyli trochę historii, szczypta teraźniejszości i niedaleka przyszłość 

 

1. Procesory sygnałowe w telekomunikacji 

Wartość obrotów na światowym rynku procesorów sygnałowych osiągnęła w roku 1997 ponad 3 
miliardy USD. Co roku notuje się wzrost obrotów o 35%-40% co oznacza prawie potrojenie 
wielkości rynku co trzy lata. Przewiduje się,  że w roku 2002 wartość obrotów sięgnie 14 
miliardów USD [25]. Najciekawsze jest to, że wzrost ten wynika w dużej mierze z 
zapotrzebowania na procesory sygnałowe przez telekomunikację. W szczególności chodzi tutaj o 
cyfrową telefonię komórkową oraz transmisję danych cyfrowych poprzez publiczną sieć 
telefoniczną (modemy dla komputerów PC). 
  Telefonia komórkowa stanowi największy segment rynku procesorów sygnałowych.  Żaden 
cyfrowy aparat telefoniczny nie może się obejść bez procesora sygnałowego — patrz rysunek 1. 
Dużą ich liczbę zawiera także każda stacja bazowa. Należy także uwzględnić zastosowania w 
klasycznych telefonach bezprzewodowych, aparatach telefonicznych z automatyczną sekretarką 
wyposażonych w pamięć półprzewodnikową oraz faksach. W krajach wysoko rozwiniętych 
dochodzi do tego wielce obiecujący rynek związany z wprowadzaniem przez licznych 
operatorów telekomunikacyjnych systemów radiodostępu abonenckiego (ang. wireless local 
loop). Cyfrowa telefonia komórkowa oprócz zwykłych usług polegających na przesyłaniu głosu 
pozwala na transmisję danych cyfrowych w tym na dostęp do Internetu. 
  Internet to technologia, która w dużym stopniu pobudza popyt na rynku modemów dla 

                                                            

1 Zakład Telekomunikacji Instytutu Elektroniki Politechniki Śląskiej. 

Rysunek 1. Schemat blokowy telefonu komórkowego

Układ

analogowy

RAM & ROM

Demo-

dulacja

i synchro-

nizacja

Koder

Viterbiego

ASIC

Decy-

macja

A/O

SH

R F

Układ

cyfrowy

DMA

S/P

Podwyż-

szenie

jakości

mowy

Kom-

presja

mowy

Rozpoz-
nawanie

mowy

Deko-

der

Ksią-

żka

telefo-
niczna

Proto-

kół

połącze-

niowy

Obsłu-

ga

klawia-

tury

Obsłu-

ga

inter-

fejsu

900 M H z

70 M H z

I

 F

10,7 M H z

40 Ms/sec - 540 ks/sec

270 ks/sec

Filtr

pasmowy

background image

 

komputerów PC. Ludzie używają i chcą  używać Internetu w pracy, w domu dla rozrywki, w 
interesach. Mogą nawet za jego pośrednictwem wygodnie załatwić zakupy. Modem służy w tym 
przypadku dla przesłania danych cyfrowych od abonenta do dostawcy usług internetowych (oraz 
w kierunku przeciwnym) poprzez publiczną sieć telefoniczną. Połączenie abonenta z publiczną 
siecią telekomunikacyjną ma jednak zwykle charakter analogowy i dane cyfrowe muszą być 
przed wysłaniem zabezpieczone, przetworzone i „wtłoczone” w kanał o paśmie przepuszczania 
około 3 kHz i przepustowości nie przekraczającej 64 kb/s. Podobnie dzieje się w przypadku 
cyfrowej telefonii komórkowej — dane cyfrowe (zakodowany sygnał mowy) muszą zostać 
przesłane drogą radiową czyli kanałem analogowym w którym warunki propagacji mogą 
zmieniać się z sekundy na sekundę. W obu przypadkach procesor sygnałowy realizuje bardzo 
podobne zadania: 

!"

Dokonuje korekcji zniekształceń wprowadzanych do odbieranego sygnału przez kanał 
transmisyjny (ang. equalization). 

!"

Dokonuje elektronicznej eliminacji echa (modem analogowy, modem ISDN). 

!"

Odtwarza częstotliwość nośną nadajnika (modem analogowy). 

!"

Odtwarza częstotliwość sygnalizacji nadajnika. 

!"

Dokonuje modulacji i demodulacji sygnału. 

!"

Realizuje kodowanie i dekodowanie kanałowe. 

!"

Dokonuje kompresji (dekompresji) cyfrowego sygnału mowy. 

!"

Dokonuje bezstratnej kompresji (dekompresji) danych cyfrowych (modem analogowy). 

!"

Eliminuje echo akustyczne (aparaty głośnomówiące). 

Chociaż zadania te podsumowano w kilku punktach to nie są to zadania trywialne. Samo 
omówienie ich podstaw teoretycznych zajmuje zwykle prawie tysiącstronicowy podręcznik 
akademicki [27], [28], [29]. Wynikające stąd algorytmy cyfrowego przetwarzania sygnałów 
mają jednak pewną liczbę cech wspólnych, które przesądzają o takiej a nie innej budowie 
(architekturze) procesorów sygnałowych. 
 Sygnały cyfrowe reprezentowane są zwykle i przetwarzane ze stosunkowo niewielką 
dokładnością. Typowy kodek telefoniczny dokonuje próbkowania sygnału analogowego z 
częstotliwością 8 kHz, a następnie wartości próbek koduje w formacie A-law2. Jest to nic innego 
jak bardzo krótki, jednobajtowy zmiennoprzecinkowy format zapisu liczb [30] zapewniający 
zachowanie odstępu sygnał-szum kwantowania na poziomie 38-44 

dB. Odpowiada to 

zachowaniu dokładności mniej więcej dwóch znaczących cyfr dziesiętnych. W przypadku 
przetwarzania sygnału akustycznego na poziomie jakości hi-fi próbki sygnału pobierane są z 
częstotliwością 44 kHz i kodowane w 16-bitowym formacie stałoprzecinkowym co odpowiada 
mniej więcej zachowaniu dokładności pięciu cyfr dziesiętnych. Dalsze przetwarzanie liczb 
odbywa się zwykle z dokładnością nie przekraczającą 32 bitów. Stosowane są w zasadzie dwa 
formaty. Format stałoprzecinkowy 1.31 (lub krótszy 1.15): 
 

31 30.................................................................................0 

s 

f 

Najstarszy bit słowa ma wagę -1, następny 2-1, następny 2-2  aż do najmłodszego bitu o wadze 
2

-

31. Reprezentowana w ten sposób liczba wyraża się wzorem 

( ) ( )

f

 

 

 

=

 

x

s

.

0

1

 i leży w 

lewostronnie domkniętym przedziale [-1,1). Dokładność przeprowadzanych w tym formacie 

                                                            

2 W USA jest to format µ-law. 

background image

 

obliczeń sięga dziewięciu znaczących cyfr dziesiętnych ale niewielki zakres reprezentowanych 
liczb jest pewnym utrudnieniem dla programisty. Procesory sygnałowe przetwarzające liczby w 
formacie stałoprzecinkowym nazywane są w żargonie stałoprzecinkowymi. Tak się składa,  że 
właściwie wszystkie procesory prezentowane w tym artykule to procesory stałoprzecinkowe. 
Wynika to prawdopodobnie z faktu, że arytmetyka stałoprzecinkowa jest łatwiejsza do 
zaimplementowania w układzie scalonym (mniej bramek) i nowe idee dotyczące procesorów 
sygnałowych zawsze testowane były najpierw na procesorach stałoprzecinkowych. Drugi ze 
stosowanych formatów zapisu liczb to format zmiennoprzecinkowy. Jest to krótka, 32-bitowa 
forma zapisu zmiennoprzecinkowego przewidywanego przez normę IEEE-754 [26]: 

31 30.....23 22.........................................................0 

s 

c 

m 

Liczbę zmiennoprzecinkową tworzą dwie liczby stałoprzecinkowe: mantysa i cecha. Wartość 
liczby dana jest wzorem 

( ) ( )

(

)

127

2

.

1

1

c

s

m

 

=

 

x

. W ten sposób mogą być reprezentowane liczby z 

zakresu od 10-38 (mniej niż masa elektronu wyrażona w kilogramach) do 1038 (więcej niż 
odległość od najdalszych obserwowanych galaktyk wyrażona w metrach) z zachowaniem 
dokładności 7 dziesiętnych cyfr znaczących. Jest to dla cyfrowego przetwarzania sygnałów 
wystarczający zakres liczb oraz dokładność obliczeń. W związku z tym mamy istotną różnicę 
między zmiennoprzecinkowym procesorem sygnałowym a mikroprocesorem ogólnego 
przeznaczenia np. Pentium. Mianowicie ten ostatni liczy „za dokładnie”. Wykonywanie obliczeń 
w 80-bitowym formacie zmiennoprzecinkowym wydaje się być w przypadku cyfrowego 
przetwarzania sygnałów zbyteczne. 
  Druga cecha algorytmów cyfrowego przetwarzania sygnałów to konieczność wykonywania 
ich w czasie rzeczywistym. Algorytmy te składają się z ogromnej liczby operacji mnożenia liczb 
i ich dodawania. Np. ocenia się, że algorytm modulatora zgodny z normą V.34 wykonywany w 
czasie rzeczywistym wymaga mocy obliczeniowej rzędu 20-25 MIPS (ang. milion instruction per 
second) [25]. Do tego wszystkie te operacje powinny być wykonane przy jak najmniejszym 
poborze mocy przez procesor. W przypadku telefonu komórkowego czy pagera wymaganie to 
jest absolutnie nadrzędne. W przypadku stacji bazowej czy modemu komputerowego obniżenie 
pobieranej mocy to niższe koszty eksploatacji a przede wszystkim większa niezawodność 
urządzenia. Wydaje się,  że o ile zmniejszanie poboru energii na każdą wykonaną instrukcję to 
wyłączna domena technologii elektronowej o tyle zwiększanie wydajności procesorów 
sygnałowych to problem ich architektury (budowy wewnętrznej). 
 

2. W pogoni za wydajnością 

Architektura procesorów sygnałowych w dużej mierze podporządkowania jest wymogowi bardzo 
szybkiego przetwarzania liczb. Podstawowym problemem jest konstrukcja i scalenie szybkiego 
układu mnożącego, który dostarcza wyniku mnożenia w czasie jednego, dwu lub najwyżej trzech 
taktów zegarowych [3]. Dopiero kiedy na początku lat osiemdziesiątych sztuka ta się udała 
można mówić,  że pojawiły się procesory sygnałowe. Następnym problemem było takie 
zorganizowanie przetwarzania aby jak najlepiej wykorzystać zasoby sprzętowe procesora, aby 
żadna jego część nie pozostawała bezczynna podczas realizacji programu. 
 
2.1 Architektura von Neumana 
Na początku swej historii komputery pomyślne były jako systemy sterowane przepływem 
operacji [4]. Stanowisko realizacji (procesor): 

background image

 

!"

pobiera rozkaz z pamięci operacyjnej; 

!"

dekoduje jego znaczenie; 

!"

pobiera potrzebne dla realizacji instrukcji (rozkazu) dane (argumenty); 

!"

wykonuje operację wskazaną przez rozkaz; 

!"

zapamiętuje wyniki.  

W tym momencie procesor zwalnia się dla realizacji następnej instrukcji itd. Pierwsze 
mikroprocesory działały ściśle według tego schematu, ale szybko okazało się, że dla zwiększenia 
prędkości przetwarzania trzeba sięgnąć po udoskonalenia tej koncepcji, które wcześniej 
przetestowane zostały na dużych maszynach cyfrowych3. 
 
2.1.1 Przetwarzanie potokowe 
Jednym z wcześniejszych pomysłów przyspieszenia realizacji rozkazów było zorganizowanie 
przetwarzania w postaci potoku instrukcji [2], [1]. Realizacja rozkazu podzielona była zawsze na 
pewną liczbę kolejnych etapów. Powyżej w punktach przedstawiono zaledwie jedną propozycję 
podziału procesu wykonywania rozkazu na etapy. W tym przypadku podziału dokonano na pięć 
etapów, ale ani sposób podziału ani liczba etapów nie jest z góry ustalona. Istnieją procesory 
które realizują instrukcje w czterech etapach tak jak np. stałoprzecinkowy procesor sygnałowy 
firmy Analog Devices ADSP-2181 [31], i są takie które potrzebują dla realizacji pewnych 
rozkazów nawet szesnastu etapów przetwarzania np. zmiennoprzecinkowy procesor sygnałowy 
TMS320C6701 firmy Texas Instruments [9]. Etapy realizowane są przez kolejne jednostki 
procesora połączone w kaskadę (potok), a wyniki przetwarzania w danym etapie są danymi 
wejściowymi dla przetwarzania w etapie następnym. W takim przypadku bezczynnie czekanie 
układów procesora które zakończyły już swoją pracę na całkowite zakończenie wykonywania 
rozkazu jest jawnym trwonieniem czasu i zasobów. Każdy z elementów procesora po 
zakończeniu pracy nad jednym rozkazem przechodzi natychmiast do przetwarzania następnego 
rozkazu. Powstaje w ten sposób coś na kształt linii montażu samochodów [2]. W każdej chwili 
procesor zajęty jest przetwarzaniem kilku rozkazów jednocześnie przy czym każdy rozkaz jest na 
innym etapie wykonania. Efektywny czas wykonania rozkazu4, niezależnie od liczby etapów 
potrzebnych na jego realizację, jest równy czasowi przetwarzania na jednym etapie realizacji. 
Idea ta sięga lat sześćdziesiątych. Pierwsze maszyny, w których ją zaimplementowano to IBM 
360/195, CDC STAR, MU5 (Uniwersytet w Manchester) [1]. 
 
2.1.2 Architektura typu Harvard 
Zwiększona szybkość przetwarzania danych powoduje na ogół liczne konflikty podczas dostępu 
do pamięci operacyjnej. Jeżeli maszyna korzysta ze wspólnej pamięci programu i danych to w 
przypadku przetwarzania potokowego często dochodzi do próby jednoczesnego pobrania nowego 
rozkazu oraz pobrania argumentu dla rozkazu, który został już częściowo przetworzony. Takie 
konflikty są oczywiście w pewien sposób rozwiązywane przez układy procesora, ale za każdym 
razem prowadzi to do chwilowego zatrzymania potoku rozkazów. Najlepiej gdyby konfliktów 
takich nie było. Można ich w dużym stopniu uniknąć stosując dwa oddzielne układy pamięci i 
dwie oddzielne magistrale łączące te pamięci z procesorem. Jeden układ pamięci przechowuje 
rozkazy (pamięć programu) a drugi przechowuje dane (pamięć danych). W ten sposób powstaje 

                                                            

3 Według wiedzy autora ostatnim mikroprocesorem ogólnego przeznaczenia, który 

działał ściśle według przedstawionego schematu był Z80 firmy Zilog. 

4 Oczywiście po wypełnieniu się potoku instrukcji. 

background image

 

architektura typu Harvard. Jest to też stary pomysł bowiem od najdawniejszych czasów czas 
dostępu do pamięci operacyjnej był zbyt długi w stosunku do szybkości procesora centralnego. 
Architektura typu Harvard była tu jednym z pomysłów5 powalającym na utrzymanie wysokiego 
tempa przetwarzania w obecności stosunkowo wolnej pamięci. 
 
2.1.3 Procesory macierzowe (SIMD) 
Wiele algorytmów np. te dotyczące cyfrowego przetwarzania sygnałów, rozwiązywania równań 
różniczkowych cząstkowych wykonuje wielokrotnie te same operacje na różnych zestawach 
danych. Powstaje zatem pomysł aby wyposażyć maszynę cyfrową w wiele identycznych 
jednostek, z których każda wykonuje za każdym razem ten sam rozkaz ale na innych danych. 
Procesory o takiej architekturze nazywane są procesorami macierzowymi lub procesorami 
wektorowymi. W terminologii angielskiej są to procesory SIMD — single instruction multiple 
data. Ponieważ już w czasie II Wojny Światowej używano maszyn cyfrowych dla rozwiązywania 
równań różniczkowych cząstkowych procesory macierzowe pojawiły się bardzo wcześnie. 
Jednym z pierwszych przykładów była maszyna Illiac IV skonstruowana na Uniwersytecie 
Illinois a zbudowana w zakładach Burroughs Corporation. 
 
 
2.2 Przetwarzanie równoległe 
Dalsze zwiększenie prędkości przetwarzania danych przez procesor związanie jest z możliwością 
równoległego przetwarzania danych. Dokładne rozważenie problemu prowadzi do koncepcji 
systemów sterowanych przepływem argumentów [4], [5]. Idea polega na tym, że rozkazy 
tworzące algorytm wykonywane są natychmiast wtedy gdy dostępne są argumenty potrzebne dla 
ich realizacji. Przez argumenty rozumiemy tutaj niezbędne dane oraz układy procesora które są w 
stanie zrealizować wskazaną przez rozkaz operację. Prowadzi to do sytuacji w której procesor 
centralny wyposażony jest w wiele jednostek zdolnych do wykonywania rozkazów równolegle. 
Rozkazy są pobierane „szerokim strumieniem” i kierowane do realizacji przez poszczególne 
jednostki. Koncepcja takiego procesora równoległego może być zrealizowana przynajmniej na 
dwa sposoby. 
 
2.2.1 Procesory o bardzo długim rozkazie (VLIW) 
Rozkazy procesora o architekturze VLIW w sposób jawny zawierają informację, które z nich 
będą przetwarzane jednocześnie. Argumentem (jawnym lub domyślnym) każdego takiego 
rozkazu jest jednostka wykonawcza procesora która będzie rozkaz realizować. W jednym cyklu 
pobiera się wiele rozkazów jednocześnie stąd angielska nazwa architektury VLIW - very long 
instruction word. Algorytm z postaci szeregowej6 do postaci równoległej musi być zatem 
przetworzony na etapie kompilacji programu. W praktyce wymusza to korzystanie przy pisaniu 
programów z kompilatora języka C/C++ lub innego języka wysokiego poziomu. Przykładem 
procesorów o takiej architekturze są procesory sygnałowe z rodziny TMS320C6xx. Architekturę 
typu VLIW lub jej elementy będzie posiadała także nowa rodzina procesorów ogólnego 

                                                            

5 Obok np. pracy pamięci z przeplotem [2]. 
6 Którą programiście łatwiej stworzyć i przeanalizować. 

background image

 

przeznaczenia firmy Intel7. Jest rzeczą ciekawą, że podobną koncepcję zrealizowano już dawno 
w maszynach typu CDC6600 i Cyber 74. W tym przypadku rozkazy pobierane były kolejno, ale 
efekt równoległego przetwarzania uzyskiwano dzięki temu, że czas pobrania i dekodowania 
rozkazu był pomijalnie mały w stosunku do czasu realizacji rozkazu przez jedną z wielu 
jednostek wykonawczych [1]. 
 
2.2.2 Procesory superskalarne 
W przypadku procesorów superskalarnych programista nie jest do końca świadom istnienia wielu 
jednostek wykonawczych. Program pisany jest tak jak dla maszyny która przetwarza rozkazy 
szeregowo, ewentualnie z wykorzystaniem przetwarzania potokowego. Procesor rozdziela w 
locie strumień rozkazów do poszczególnych jednostek wykonawczych dbając o to aby nie 
dochodziło do konfliktu argumentów i aby wynik działania całości układu był dokładnie taki sam 
jak w przypadku przetwarzania rozkazów szeregowo. Architekturę superskalarną posiadają 
wszystkie współczesne procesory ogólnego przeznaczenia tzn. Pentium, PowerPC, Alpha itd. 
Długi czas powstrzymywano się przed stosowaniem architektury superskalarnej w przypadku 
procesorów sygnałowych. W roku 1998 pojawił się jednak pierwszy superskalarny, 
stałoprzecinkowy procesor sygnałowy ZSP16401 [32]. 
  W dalszej części artykułu przedstawiono architekturę wybranych procesorów sygnałowych. 
Układy wybrano tak aby dać Czytelnikowi pewne pojęcie o historii, teraźniejszości a być może 
nawet przyszłości procesorów sygnałowych. 
 

3. Żywa skamielina — TMS320C5x 

Procesory TMS320C5x — patrz tablica 1 — reprezentują w miarę współczesną gałąź dużej 
rodziny stałoprzecinkowych procesorów sygnałowych firmy Texas Instruments. Rodzina ta jest z 
pewnością najstarszą linią procesorów sygnałowych, która nadal jest oferowana na rynku. 
Najstarszym reprezentantem tej rodziny jest procesor TMS32010 wprowadzony na rynek przez 
firmę Texas Instruments w roku 1982 [6]. Jeszcze w tym samy roku magazyn „Electronic 
Products” przyznał układowi TMS32010 tytuł „Product of the Year” [8]. Był to początek 
olbrzymiego sukcesu rynkowego firmy Texas Instruments. Sukces ten spotęgowało 
wykorzystanie procesora TMS320C178 w jednej z pierwszych9 zabawek rozpoznających ludzki 
głos. Była to słynna lalka „Julie Doll”. Procesor TMS32010 taktowany zegarem 20 MHz 
pozwalał na wykonywanie do 5 milionów instrukcji w ciągu sekundy (5 MIPS). Wkrótce 
pojawiły się następne układy wykonane w bardziej energooszczędnej technologii CMOS. W 
latach 1984-1995 firma Texas Instruments wprowadziła na rynek kolejne wersje 
stałoprzecinkowych procesorów sygnałowych o udoskonalonej architekturze. Były to 
TMS320C2x (1984) następnie TMS320C5x (1989), TMS320C2xx (1995) i TMS320C54x 
(1995). Wszystkie procesory (z wyjątkiem 54x) zachowują kompatybilność „w górę” na 
poziomie kodu źródłowego. Oznacza to, że program napisany w asemblerze dla procesora 
TMS320C10 może być asemblowany bez zmian dla wykonywania go na procesorze 

                                                            

7 Firma Intel nazwała architekturę nowych procesorów angielskim akronimem EPIC od 

słów Explicitly Parallel Instruction Computing [12]. 

8 Jedna z mutacji procesora TMS32010. Litera C pojawiająca się w nazwie procesora 

wskazuje, że został wykonany w technologii CMOS, znacznie bardzie energooszczędnej niż 
technologia bipolarna wykorzystywana dla produkcji oryginalnego układu TMS32010. 

9 ...a z pewnością najbardziej agresywnie reklamowanej. 

background image

 

TMS320C50. Stwierdzenie to pozostaje prawdziwe za każdym razem gdy numer procesora dla 
którego program był pierwotnie pisany jest mniejszy od numeru procesora, który będzie program 
wykonywał [7]. Oznacza to, że trzon architektury tych procesorów pozostał nie zmieniony od 
początku lat osiemdziesiątych. Uwzględniając czas potrzebny wówczas na opracowanie tak 
skomplikowanego układu scalonego należy przyjąć,  że architektura rodziny swymi korzeniami 
sięga połowy lat siedemdziesiątych. Można zatem powiedzieć,  że procesory te stanowią 
prawdziwą  żywą skamielinę. Przetrwały do dzisiaj niewiele zmieniając się od czasów gdy 
głównym problemem technologicznym było umieszczenie w strukturze układu scalonego 
tablicowego układu mnożącego 16-bitowe, stałoprzecinkowe liczby w ciągu jednego cyklu 
zegarowego. O tym, że był to poważny problem przekonujemy się sprawdzając liczbę cykli 
zegarowych niezbędnych dla przemnożenia dwóch 16-bitowych, stałoprzecinkowych liczb przez 
procesor Intel 80286. Układ ten wprowadzono na rynek w tym samym roku co procesor 
TMS32010. Intel 80286 potrzebował na wykonanie instrukcji IMUL10 24 cykle zegarowe co 
trwało 4 µs przy taktowaniu procesora zegarem 6 MHz podczas gdy TMS32010 zadowalał się 
czterema cyklami co trwało 200 ns dla zegara 20 MHz. Rzeczywiście architektura układu 
TMS32010 zorganizowana jest wokół układu mnożącego i jednostki arytmetyczno-logicznej z 
akumulatorem, które zajmują dużą część chipa. 

                                                            

10 Mnożenie dwóch 16-bitowych liczb ze znakiem. 

background image

 8 

Tablica 1. Rodzina procesorów TMS320C5x  

 

Układ 

TMS320 

 

ID 

Wielkość pamięci wbudowanej 

Port 

 

Zasilanie 

[V] 

 

Okres zegara 

[ns] 

 

Obudowa 

  

DARAM

A

 SARAM

B

 ROM Szeregowy  Równoległy  

   

'C50 

PQ 

1056 

9K 

2K 

64K 

50/35/25 

132 pin BQFP 

'LC50 

PQ 

1056 

9K 

2K 

64K 

3.3 

50/40/25 

132 pin BQFP 

'C51 

PQ 

1056 

1K 

8K 

64K 

50/35/25/20 

132 pin BQFP 

'C51 

PZ 

1056 

1K 

8K 

64K 

50/35/25/20 

100 pin TQFP 

'LC51 

PQ 

1056 

1K 

8K 

64K 

3.3 

50/40/25 

132 pin BQFP 

'LC51 PZ 

1056  1K 

8K 2 

64K  3.3 50/40/25 

100 

pin 

TQFP 

'C52 PJ 

1056 ─ 

4K 

64K 

50/35/25/20 

100 pin QFP 

'C52 PZ 

1056  ─ 4K  1 

64K 

5 50/35/25/20 

100 

pin 

TQFP 

'LC52 PJ 

1056  ─ 

4K 

64K 

3.3 

50/40/25 

100 pin QFP 

'LC52 PZ 

1056  ─ 

4K 

64K 

3.3 

50/40/25 

100 pin TQFP 

'C53 

PQ 

1056 

3K 

16K 

64K 

50/35/25 

132 pin BQFP 

'C53S 

PZ 

1056 

3K 

16K 

64K 

50/35/25 

100 pin TQFP 

'LC53 

PQ 

1056 

3K 

16K 

64K 

3.3 

50/40/25 

132 pin BQFP 

'LC53S 

PZ 

1056 

3K 

16K 

64K 

3.3 

50/40/25 

100 pin TQFP 

'LC56 PZ 

1056  6K 

32K 2 

64K  3.3 50/35/25 

100 

pin 

TQFP 

'C57S PGE 

1056  6K 2K  2 

64K

D

 

50/35/25 

144 pin TQFP 

'LC57 PBK 

1056  6K 32K 2 

64K

D

 

3.3 

50/35/25 

128 pin TQFP 

'LC57S PGE 1056 

6K  2K  2 

64K

D

 

3.3 

50/35 

144 pin TQFP 

A

 DARAM — pamięć o dwóch portach; 

B

 SARAM – pamięć o jednym porcie 

background image

 9 

3.1 Układ mnożący i jednostka arytmetyczna z akumulatorem 
Rysunek 2 pokazuje uproszczony schemat blokowy jednostki obliczeniowej procesora 
TMS320C50. Centralnym elementem jest tutaj układ mnożący pozwalający na wykonanie 
mnożenia dwóch 16-bitowych liczb. Jeden z argumentów operacji mnożenia znajduje się zawsze 
w rejestrze TREG0 natomiast drugi argument może zostać pobrany z przestrzeni adresowej 
danych albo z przestrzeni adresowej programu. Oba argumenty interpretowane są jako liczby 
całkowite w zapisie dopełnienie do 2. Wynik mnożenia umieszczany jest w 32-bitowym rejestrze 
PREG. Stąd poprzez układ przesuwnika wynik może zostać przekazany do jednostki 
arytmetyczno-logicznej (ALU). Przesuwnik umieszczony między rejestrem PREG i ALU 
pozwala na przesunięcie wyniku mnożenia podczas przesyłania go do ALU. Zachodzą przy tym 
cztery następujące możliwości [8]: 

!"

wynik nie jest przesuwany; 

!"

wynik jest przesuwany o jeden bit w lewo co pozwala mnożyć liczby stałoprzecinkowe w 
formacie ułamkowym 1.15 (jeden bit znaku i 15 bitów, których waga zmniejsza się od 2-1 do 
2-15); 

!"

wynik jest przesuwany o cztery bity w lewo co pozwala na używanie w instrukcji mnożenia 
krótkiego 13-bitowego argumentu natychmiastowego; 

!"

wynik jest przesuwany o sześć bitów w prawo co pozwala na uniknięcie nadmiaru podczas 
akumulacji nawet 128 wyników mnożenia. 

Sposób działania przesuwnika określony jest przez dwa bity rejestru sterującego pracą procesora 
ST1.  
 Wynik 

mnożenia jest najczęściej dodawany do zawartości 32-bitowego akumulatora. Operację 

tę wykonuje jednostka arytmetyczno-logiczna. ALU jest układem 32-bitowym i wykonuje nie 
tylko dodawanie i odejmowanie ale także pełny zestaw bitowych operacji logicznych (AND, OR 
i XOR) oraz operacje porównywania liczb oraz testowania wybranych bitów dowolnego słowa 
pamięci danych (testowanie stanu flagi). Domyślnym argumentem każdej operacji realizowanej 
przez ALU jest akumulator ACC. Drugi argument11 pobierany jest z rejestru PREG12 albo z 
pamięci danych. Argument pochodzący z pamięci danych może być co najwyżej liczbą 
16-bitową. Stąd przed dostarczeniem do ALU argument ten może być przesunięty nawet o 16 
bitów tak, aby mógł się znaleźć w dowolnym miejscu 32-bitowego portu wejściowego ALU. 
Jednostka arytmetyczno-logiczna podczas wykonywania dodawania (odejmowania) zapamiętuje 
w rejestrze sterującym ST1 bit przeniesienia z najstarszej pozycji akumulatora C oraz sygnalizuje 
pojawienie się nadmiaru OV. Wynik porównywania liczb oraz testowania flagi zapamiętywany 
jest w postaci flagi TC. Stan wymienionych flag oraz liczba zapamiętana w akumulatorze są 
testowane przez liczne warunkowe instrukcje skoku. W razie pojawienia się przepełnienia 
podczas dodawania (odejmowania) jednostka arytmetyczno-logiczna może umieścić w 
akumulatorze największą (najmniejszą) liczbę realizując w ten sposób arytmetykę z nasyceniem. 
  Akumulator ACC jest rejestrem 32-bitowym podzielonym na dwie 16-bitowe części: dolną 
ACCL i górną ACCH. Uzupełnieniem akumulatora jest drugi akumulator (akumulator B) o 
nazwie ACCB. Stanowi on z jednej strony rozszerzenie akumulatora do 64 bitów, a z drugiej 
strony miejsce gdzie mogą być chwilowo przechowywane i przetwarzane wyniki dla których nie 
ma miejsca w akumulatorze. Podczas przesyłania do pamięci zawartości połówki akumulatora 
można dokonać przesunięcia „w locie” nawet o siedem bitów w lewo. W przypadku górnej 

                                                            

11 Dla operacji dwuargumentowych. 
12 Poprzez przesuwnik. 

background image

 10

połówki akumulatora najstarsze bity są tracone natomiast najmłodsze pobierane są z dolnej 
połówki akumulatora. W przypadku gdy zapamiętywana jest dolna połówka akumulatora 
najstarsze bity są tracone a najmłodsze bity uzupełniane są zerami. Operacje te nie mają 
najmniejszego wpływu na zawartość akumulatora. 
 

16

16

16

16

16

16

32

32

32

32

32

32

32

32

32

TREG0 (16)

Układ

mnożący

PREG (32)

Przesuwnik (-6,0,1,4)

Przesuwnik (0-16)

MUX

MUX

ALU (32)

ACCH (16)

ACCL (16)

ACCB (32)

Przesuwnik (0-7)

Rysunek 2.Schemat blokowy jednostki centralnej procesora TMS320C50

background image

 11

3.2 Pamięć 
Program oraz dane umieszczone są w osobnych przestrzeniach adresowych. Każda z nich 
obejmuje 64K słowa. Słowo maszynowe zawiera szesnaście bitów. Wewnątrz układu scalonego 
funkcjonują dwie osobne magistrale: magistrala danych oraz magistrala programu. Na zewnątrz 
układu obie magistrale danych (danych i programu) oraz obie magistrale adresowe (adres danych 
i adres programu) są multipleksowane. Na chipie razem z procesorem umieszczona jest zawsze 
pewna ilość pamięci czy to (EP)ROM czy RAM, którą można umieścić w dowolnie wybranej 
przestrzeni adresowej — patrz tablica 1. Jeżeli system uzupełnimy o zewnętrzną pamięć RAM 
możemy zachować zalety architektury typu Harvard mimo ograniczonej liczby wyprowadzeń 
zewnętrznych układu scalonego realizującego układ. Oznacza to, że mamy możliwość 
jednoczesnego sięgania do pamięci programu jak i do pamięci danych. 
  Pierwsze 128 komórek pamięci danych zarezerwowane jest dla realizacji rejestrów procesora. 
W przypadku modeli z rodziny TMS320C5x praktycznie wszystkie rejestry (jest ich razem 28) z 
wyjątkiem akumulatorów ACC i ACCB są zrealizowane w postaci komórek pamięci o adresie 
mniejszym od 128. Tego typu oszczędnościowe pomysły funkcjonują w świecie komputerów już 
od bardzo dawna. Jednym z wcześniejszych i bardziej znanych przykładów były najtańsze 
konfiguracje maszyn IBM 360. 
  Programista dysponuje kilkoma trybami adresowania pamięci. Są to: 

!"

Adresowanie natychmiastowe z krótkim operandem. Ośmio bitowy argument instrukcji 
stanowi część samej instrukcji. Przykładem jest instrukcja dodawania ADD #0FFh (dodaj do 
akumulatora liczbę 255) kodowana w postaci jednego słowa #B8FFh. Argument instrukcji 
został podkreślony. 

!"

Adresowanie natychmiastowe z długim operandem. Szesnasto bitowy argument instrukcji 
stanowi drugie słowo instrukcji. Przykładem jest instrukcja dodawania ADD #01234h (dodaj 
do akumulatora liczbę 4660) kodowana w postaci dwóch słów #BF90h #1234h. Argument 
instrukcji został podkreślony. 

!"

Adresowanie bezpośrednie. Adres szesnasto bitowego argumentu instrukcji powstaje w 
wyniku złożenia dwóch części. Pierwsza — bardziej znacząca — część adresu pobierana jest 
z rejestru wskaźnika strony DP (ang. data pointer). Dziewięcio bitowy rejestr DP jest częścią 
rejestru sterującego pracą procesora ST0. Mniej znacząca część adresu argumentu to siedem 
najmniej znaczących bitów słowa instrukcji. W ten sposób bez zmiany zawartości rejestru DP 
można zaadresować zaledwie 128 komórek pamięci. Sposób tworzenia adresu w trybie 
adresowania bezpośredniego ilustruje rysunek 3a. 

!"

Adresowanie pośrednie przez rejestr. Źródłem adresu argumentu jest jeden z ośmiu 
16-bitowych rejestrów adresowych AR0-AR713. Do adresowania używany jest rejestr 
wskazywany przez 3-bitowy wskaźnik ARP (ang. address register pointer) będący częścią 
rejestru sterującego pracą procesora ST0. Ilustruje to rysunek 3b. Każda instrukcja 
wykorzystująca adresowanie pośrednie pozwala na:  

⇒ 

dokonanie inkrementacji (dekrementacji) używanego rejestru adresowego; inkrementacja 
(dekrementacja) odbywa się zawsze po pobraniu argumentu; zawartość rejestru 
adresowego może zostać zwiększona o 1 (inkrementacja) albo o wartość zapisaną w 
rejestrze indeksowym INDX;  

⇒ 

wskazanie innego rejestru adresowego (zmiana wartości wskaźnika ARP). 

                                                            

13 Procesory z rodziny TMS320C1x zawierają tylko dwa takie rejestry. 

background image

 12

9

A) Mechanizm adresowania bezpośredniego

B) Mechanizm adresowania pośredniego przez rejestr

DP

9

7

16

7 najmniej znaczących instrukcji

z rejestru instrukcji (IR)

3

AR0

AR1

AR2
AR3

AR4

AR5

AR6

AR7

INDX

AR0

MUX

Adresowa

jednostka

arytmetyczna

+

- 1

16

Adres argumentu

Adres argumentu

Rysunek 3.Tryby adresowania dostępne w procesorze TMS320C50

background image

 13

Mechanizm adresowania pośredniego pozwala na zorganizowanie w pamięci buforów 
cyklicznych oraz adresowania z odwróceniem kolejności bitów, bardzo pomocnego podczas 
kodowania algorytmu szybkiej transformacji Fouriera FFT. W procesorze TMS320C5x 
zaimplementowano ponadto inne mechanizmy adresowania. Nie są one jednak dostępne dla 
każdej instrukcji pobierającej argument z pamięci — korzystają z nich tylko wybrane instrukcje 
(ang. dedicated register addressing mode). 
 
3.3 Sterowanie procesorem 
Instrukcje programu przetwarzane są potokowo w czterech następujących etapach: 

!"

Pobranie rozkazu z pamięci programu. Adres instrukcji do pobrania przechowywany jest 
przez licznik rozkazów PC. Po pobraniu każdej instrukcji zawartość licznika rozkazów 
zwiększana jest o jeden.  

!"

Dekodowanie instrukcji programu. Na tym etapie dokonuje się inkrementacji (dekrementacji) 
rejestru adresowego w przypadku adresowania pośredniego przez rejestr. 

!"

Pobranie argumentu instrukcji z pamięci danych. 

!"

Wykonanie instrukcji. Na tym etapie dokonuje się zapisania wyniku działania instrukcji w 
pamięci. 

Każdy etap przetwarzania trwa w zasadzie przez jeden okres zegara taktującego procesor. Jeżeli 
pobierane instrukcje są instrukcjami zakodowanymi w postaci pojedynczego słowa (znakomita 
większość instrukcji) oraz jeżeli są to instrukcje, dla których etap wykonania (czwarty) trwa 
jeden okres zegara oraz jeśli nie ma konfliktów podczas dostępu do pamięci14 to w każdej chwili 
procesor przetwarza jednocześnie do czterech instrukcji, które są na różnym etapie realizacji. Co 
jeden okres zegara kończy się realizacja jednej instrukcji. 
  Ten niezwykle wydajny sposób przetwarzania zakłócany bywa przez instrukcję skoku, 
instrukcję wywołania podprogramu lub przerwanie programowe. Instrukcja skoku (skoku 
warunkowego) jest instrukcją zakodowaną w postaci dwóch słów15. Po zdekodowaniu instrukcji 
skoku zaprzestaje się dekodowania i pobierania kolejnych instrukcji16  aż do momentu gdy 
instrukcja skoku dochodzi do etapu wykonania17. Wtedy właśnie do rejestru PC ładowany jest 
argument instrukcji skoku i rozpoczyna się ponowne wypełnianie potoku instrukcji. Stąd 
efektywny czas wykonania instrukcji skoku to cztery cykle zegarowe. W przypadku instrukcji 
skoku wykonywanej warunkowo jeżeli na etapie wykonywania okaże się,  że instrukcja jest 
pomijana uruchamiany jest dekoder pobranej już instrukcji. W tym przypadku efektywny czas 
wykonania instrukcji skoku jest krótszy i wynosi dwa cykle zegarowe. Aby zminimalizować 
wpływ instrukcji skoku na efektywność przetwarzania dostępne są instrukcje skoku (skoku 

                                                            

14 Np. w przypadku procesora TMS320C50 9K słów pamięci RAM dostępnych na chipie 

można skonfigurować tak, aby była dostępna jednocześnie w przestrzeni adresowej danych i 
programu. Pamięć ta posiada jednak tylko jeden port wejścia-wyjścia. W przypadku gdy program 
i przetwarzane dane umieszczone są w tej właśnie pamięci dochodzi do konfliktu pomiędzy 
jednostką procesora pobierającą kolejną instrukję, a jednostką pobierają argument innej 
instrukcji. 

15 Drugie słowo to adres w pamięci programu do którego zostanie przeniesione 

sterowanie. 

16 W tym momencie pobrana jest już instrukcja następująca po instrukcji skoku. 
17 Dopiero wtedy ustalone są np. warunki sprawrawdzane przez skoki warunkowe. 

background image

 14

warunkowego) z opóźnieniem. W przypadku takiej instrukcji opisany mechanizm 
wstrzymywania potoku instrukcji nie jest uruchamiany. W efekcie oprócz instrukcji skoku 
realizowane są jeszcze dwie instrukcje18 następujące po instrukcji skoku z opóźnieniem. 
  Podobny do opisanego jest mechanizm wstrzymywania potoku instrukcji podczas 
wykonywania instrukcji (warunkowego) wywołania podprogramu19. Jedyna różnica polega na 
tym,  że kiedy dochodzi do przekazania sterowania do podprogramu na stosie sprzętowym 
umieszczany jest automatycznie adres instrukcji następującej po instrukcji skoku. Wspomniany 
stos sprzętowy może przechowywać do ośmiu adresów powrotu z podprogramu. Instrukcja 
powrotu z podprogramu powoduje pobranie adresu ze stosu sprzętowego i umieszczenie go w 
liczniku rozkazów. Procesory TMS320C5x posiadają wbudowany mechanizm pozwalający 
programowo rozszerzyć stos sprzętowy w obszarze pamięci danych. Dla zminimalizowania 
wpływu wykonywania instrukcji wywołania podprogramu i powrotu z podprogramu na szybkość 
przetwarzania danych dostępne są wersje tych instrukcji wykonywane z opóźnieniem. 
  W przypadku wielu instrukcji istnieje możliwość wielokrotnego ich powtarzania. Wystarczy 
tylko w 16-bitowym rejestrze RPTC zapisać liczbę N większą od zera20, a następna instrukcja 
zostanie po powtórzona N+1 razy. Dzięki tej własności oraz przetwarzaniu potokowemu wiele 
instrukcji, których wykonanie wymaga więcej niż jednego cyklu zegarowego w wyniku 
wielokrotnego powtarzania staje się efektywnie instrukcjami wykonywanymi w jednym cyklu 
(patrz paragraf 3.6). Procesory z grupy TMS320C5x mają także zaimplementowany mechanizm 
powtarzania bloku instrukcji bez straty dodatkowych cykli zegarowych na organizację pętli. 
 Procesor 

może zostać programowo wprowadzony w stan o obniżonym poborze energii. 

Instrukcja IDLE powoduje zatrzymanie pobierania i wykonywania instrukcji. Porty szeregowe 
pozostają aktywne i kontynuują pracę. Instrukcja IDLE2 zatrzymuje także pracę portów 
szeregowych dzięki czemu następuje dalszy spadek poboru energii. Z tego stanu procesor może 
zostać wyprowadzony jedynie poprzez przerwanie sprzętowe. 
 
3.4 Przerwania 
  Dla zrozumienia mechanizmu obsługi przerwań sprzętowych przez procesory z grupy 
TMS320C5x warto najpierw przeanalizować działanie instrukcji przerwania programowego. 
Działa ona w sposób nieco podobny do wywołania podprogramu. Zdekodowanie tej instrukcji 
powoduje wstrzymanie pobierania kolejnych instrukcji i unieważnienie instrukcji już pobranej. 
Na stosie sprzętowym umieszcza się adres następnej instrukcji po instrukcji przerwania 
programowego. Na etapie wykonania sterowanie przekazywane jest do tej pozycji tablicy 
wektorów przerwań, którą wskazuje argument instrukcji przerwania programowego. Początek 
tablicy wektorów przerwań może zostać umieszczony gdziekolwiek w przestrzeni adresowej 
programu pod warunkiem, że zgodzimy się aby jedenaście najmłodszych bitów jego adresu było 
równych zeru. Tablica zawiera 32 elementy, z których każdy to dwa słowa pamięci programu. 
Owe dwa słowa mają tworzyć procedurę obsługi przerwania. Ze względu na szczupłość miejsca 
mieści się tam zwykle zaledwie skok do właściwej procedury obsługi przerwania. W czasie 
wykonania instrukcji przerwania następuje zablokowanie dalszych przerwań maskowanych a 
także wymiana kontekstu procesora. To ostatnie oznacza, że zawartość akumulatora ACC, 

                                                            

18 Dwie instrukcje o długości jednego słowa lub jedna instrukcja o długości dwóch słów. 
19 Nazywanego także skokiem ze śladem. 
20 Do tego celu służy specjalna instrukcja RPT. 

background image

 15

rejestru zawierającego wynik mnożenia PREG, rejestru tymczasowego TREG0, rejestrów 
sterujących pracą procesora ST0 i ST1 oraz innych istotnych dla wykonywanego programu 
rejestrów umieszczana jest w rejestrach-duplikatach (ang. shadow registers). Instrukcja powrotu z 
procedury obsługi przerwania przywraca przerwany kontekst, pobiera ze stosu sprzętowego adres 
instrukcji występującej po instrukcji przerwania programowego i odblokowuje system przerwań. 
 Przerwania sprzętowe sygnalizowane mogą być przez urządzenia zewnętrzne za 
pośrednictwem czterech wejść przerwań maskowanych INT1-INT4 oraz wejścia przerwania 
niemaskowanego NMI. Źródłem przerwania sprzętowego może być także urządzenie 
wewnętrzne np. port szeregowy. Od chwili zgłoszenia przerwania do chwili kiedy procesor 
podejmuje pierwsze działania upływają trzy okresy zegara taktującego21. Wtedy to procesor 
zaznacza w rejestrze przerwań IFR źródło przerwania, a w następnym cyklu zegarowym pobraną 
właśnie instrukcję zamienia na instrukcję przerwania programowego. Na stosie sprzętowym 
umieszcza się adres usuniętej instrukcji. Argumentem wstawionej instrukcji przerwania 
programowego jest numer pozycji w tablicy wektorów przerwań zawierającej procedurę obsługi 
zgłaszanego przetrwania sprzętowego. Przyporządkowanie przerwaniom sprzętowym procedur 
obsługi ustalone zostało na zawsze przez producenta procesora [8]. Od tej chwili wszystko dzieje 
się tak jak to opisano dla instrukcji przerwania programowego. 
 
3.5 Inne urządzenia wewnętrzne 
Procesory z rodziny TMS320C5x integrowane są zwykle z przynajmniej jednym 
synchronicznym portem szeregowym. Port taki zaprojektowany jest dla komunikacji procesora z 
układem kodeka. Niektóre modele procesorów wyposażone są w synchroniczny port szeregowy z 
podziałem kanałów w dziedzinie czasu (ang. time division multiplex - TDM). Istnieje wtedy 
możliwość prowadzenia transmisji w siedmiu kanałach jednocześnie. Intencją producenta było 
wykorzystywanie szeregowego portu TDM dla komunikacji między procesorami w systemach 
wieloprocesorowych [8]. 
  Wszystkie modele procesorów w rodzinie TMS320C5x posiadają zintegrowany timer 
pozwalający na precyzyjne odmierzanie czasu bez angażowania w ten proces czasu 
obliczeniowego procesora. 
 
3.6 Przykład programowania 
Tablica 2 zawiera wydruk bardzo krótkiego podprogramu asemblerowego realizującego filtr FIR. 
Całość obliczeń realizowana jest praktycznie przez wielokrotne powtórzenie jednej instrukcji 
MADD. Instrukcja ta wykonuje wiele operacji jednocześnie: 

!"

Pobiera z pamięci danych jawnie wyszczególniony argument wskazywany przez aktywny 
rejestr adresowy AR0. 

!"

Pobiera z pamięci programu niejawny argument wskazywany przez rejestr BMAR (ang. 
block move address register). 

!"

Mnoży pobrane argumenty, a wynik umieszcza w rejestrze PREG. 

!"

Przenosi zawartość komórki wskazywanej przez rejestr AR0 do komórki o adresie o 1 
większym. 

!"

Dekrementuje zawartość rejestru AR0 i inkrementuje zawartość rejestru BMAR. 

                                                            

21 Pod warunkiem, że przerwanie nie jest zamaskowane a system przerwań jest 

odblokowany. 

background image

 16

!"

Poprzednią zawartość rejestru PREG dodaje do zawartości akumulatora i zapamiętuje w 
akumulatorze. 

Jeżeli tę instrukcję powtórzyć tyle razy ile wynosi rząd filtru plus 1 (instrukcja RPT) to po 
dodatkowej akumulacji (instrukcja APAC) w akumulatorze znajdziemy próbkę odpowiedzi filtru. 
Przed uruchomieniem tego mechanizmu należy: 

!"

Próbkę sygnału wejściowego umieścić na początku linii opóźniającej filtru FIR. 

!"

W rejestrze AR0 umieścić adres ostatniego elementu linii opóźniającej. 

!"

Do rejestru BMAR załadować adres tablicy w której zapamiętano w odwrotnej kolejności 
próbki odpowiedzi impulsowej filtru. 

!"

Wyzerować akumulator oraz rejestr PREG (instrukcja ZAP). 

Powtarzana instrukcja MADD dzięki przetwarzaniu potokowemu staje się efektywnie instrukcją 
wykonywaną w jednym cyklu zegarowym. 
  Budowa jednostki centralnej procesorów z rodziny TMS320C5x, implementacja praktycznie 
jednego rejestru wewnętrznego, lista instrukcji pozwalająca na realizację filtru FIR praktycznie 
za pomocą jednej instrukcji uzasadnia stwierdzenie, że wczesne procesory sygnałowe były w 
istocie programowalnymi filtrami cyfrowymi. 
 
Tablica 2. Procedura realizująca filtr FIR napisana w asemblerze procesorów TMS320C5x

.  

* Parametry: 
*  

  próbka sygnału wejeciowego na początku linii

 

*     ar0 -

> koniec linii opóźniającej

 

*     ar1 -

> rząd filtru (N)

 

*     bmar -

> tablica współczynników filtru

 

* Zwraca: 

      acc(hi)  = sygnał wyjściowy

 


* Uwagi: 

*      Linia opóźniająca zawiera N+1 elemen

tów 

+ za końcem jedna komórka dodatkowa

 


* (C) Jacek Izydorczyk, 10.ii.1999 
 
 .ps 
UFir: 
 

ZAP                   ; ACC<-0; PREG <-0 

 

MAR      *,AR1        ; ARP -> AR0 

 
 

RPT      *,AR0        ; powtórz a

 do wyczerpania 

 

 

MADD     *-           ; tablicy wspó

czynników

 

 

APAC                  ; ACC <- ACC+PREG 

 
 

SFL                   ; dla zachowania formatu 1.15 

 

ret                   ; powrót 

 

 

4. Rekin wśród procesorów sygnałowych — ADSP21162 

Dobrym przykładem współczesnego, zmiennoprzecinkowego procesora sygnałowego jest 
procesor ADSP21060 Sharc firmy Analog Devices. Architektura tego procesora jest właściwie 
identyczna z architekturą procesorów ADSP21020, która była już szczegółowo prezentowana na 
łamach Przeglądu Telekomunikacyjnego [33]. Firma uzupełniła układ o zintegrowaną pamięć 
RAM, układy portów szeregowych, portów HIP itp. Ostatnio wprowadzono model procesora 
ADSP21160 wyposażony w dodatkowe jednostki wykonawcze i możliwość przetwarzania 
macierzowego SIMD (ang. single instruction multiple data) [34]. 

background image

 17

 

5. Technologia MMX 

Należy się spodziewać,  że w niedalekiej przyszłości większość obliczeń wykonywanych przez 
komputery będzie związanych z cyfrowym przetwarzaniem sygnałów [16]. Ma na to wpływ 
gwałtowne rozpowszechnianie się tzw. aplikacji mulimedialnych oraz rozwój rynku coraz 
bardziej skomplikowanych gier wykorzystujących technologię wirtualnej rzeczywistości. 
Aplikacje tego typu wykonują zadania obliczeniowe o następujących cechach 
charakterystycznych: 

!"

Liczby zapisane są w szesnasto lub ośmiobitowym formacie stałoprzecinkowym. 

!"

Większość obliczeń to operacje mnożenia i akumulacji wyniku. 

!"

Obliczenia zorganizowane są w postaci licznych, zagnieżdżonych i ciasnych pętli 
programowych. 

!"

Wiele operacji można wykonywać równolegle. 

W istocie są to cechy charakterystyczne dla algorytmów cyfrowego przetwarzania sygnałów. W 
związku z tym wiele firm wytwarzających mikroprocesory postanowiła rozszerzyć ich 
architekturę tak, aby sprzętowo wspomagać wykonywanie algorytmów DSP (ang. digital signal 
processing). Przykładem są instrukcje VIS wprowadzone do architektury SPARC przez firmę 
Sun Microsystems, instrukcje MDMX procesorów MIPS V firmy Silicon Graphics, instrukcje 
MVI dla procesorów Alpha firmy DEC22 czy instrukcje MAX2 wprowadzone do architektury 
PA-RISC prze firmę Hewlett-Pacard [16]. Ale niewątpliwie najbardziej znanym przykładem jest 
rozszerzenie przez firmę Intel architektury IA-32 o instrukcje MMX (ang. multimedia extension) 
[24]. Cechą charakterystyczną tej technologii jest wprowadzenie do zbioru instrukcji procesora 
57 nowych instrukcji wykonujących operacje na kilku argumentach jednocześnie. W ten sposób 
procesory zgodne z architekturą IA-3223 nabrały z jednej strony cech procesorów sygnałowych, 
a z drugiej cech procesorów macierzowych SIMD (ang. single instruction multilple data). 
 Intencją autorów rozszerzenia MMX było zachowanie zgodności architektury z całą 
dotychczasową bazą oprogramowania. W szczególności chodziło o to aby pojawienie się 
rozszerzenia MMX nie wymagało modyfikowania istniejących już systemów operacyjnych tzn. 
MS-DOS, MS-Windows 3.1/95/98/NT, OS/2 i Unix. Dlatego zdecydowano, że kontekst 
jednostki wykonującej instrukcje MMX będzie wspólny dla niej oraz dla jednostki wykonującej 
operacje zmiennoprzecinkowe (koprocesora). Praktycznie oznacza to, że rejestry będące 
argumentami nowych instrukcji to osiem rejestrów koprocesora zmiennoprzecinkowego, które 
teraz nazywają się MM0-MM7. Wykorzystywane są sześćdziesiątcztery bity, które w przypadku 
operacji zmiennoprzecinkowych reprezentują mantysę liczby. System operacyjny przechodząc do 
realizacji nowego zadania zachowuje stan koprocesora zmiennoprzecinkowego za pomocą 
instrukcji FSAVE, natomiast odtworzenie stanu koprocesora następuje z wykorzystaniem 
instrukcji FRSTR. W ten sposób system operacyjny „nieświadomie” zachowuje i odtwarza stan 
jednostki MMX. 
 
 
 
 
 

                                                            

22 Obecnie Intel. 
23 Pentium, Pentium Pro, Pentium II, Pentium III, AND K-6, Cyrix M2, Cyrix MII. 

background image

 18

 
5.1 Format przetwarzanych danych 
Jednostka przetwarzająca instrukcje MMX jest w istocie jednostką arytmetyki 
stałoprzecinkowej24. Przetwarzane liczby całkowite mogą być zapisane w formacie zajmującym 
jeden bajt, słowo (16 bitów), podwójne słowo (32 bity) lub poczwórne słowo (64 bity). Liczby 
grupowane są w 64-bitowe ciągi binarne, zapisywane rejestrach MM0-MM7 i przetwarzane. Np. 
pojedynczy piksel grafiki reprezentowany jest w postaci ośmiu bitów (bajt). Osiem takich pikseli 
może zostać umieszczonych w jednym poczwórnym słowie pamięci. Realizacja instrukcji MMX 
polega na pobraniu takiego poczwórnego słowa25, wykonaniu operacji na wszystkich ośmiu 
pikselach jednocześnie i zapisaniu wyniku w jednym z rejestrów MMX0-MMX7. Arytmetyka 
stałoprzecinkowa zmusza programistę do dokładnego przemyślenia realizowanego algorytmu tak, 
aby na żadnym z etapów przetwarzania nie doszło do niekontrolowanego przekroczenia zakresu 
reprezentowanych liczb.  
 
5.2 Przegląd instrukcji 
Instrukcje MMX realizują następujące operacje: 

!"

Podstawowe działania arytmetyczne tzn. dodawanie, odejmowanie, mnożenie, mnożenie 
połączone z akumulacją, przesunięcia arytmetyczne w lewo i w prawo. 

!"

Porównywanie liczb. 

!"

Konwersję formatów — pakowanie liczb w ciągi 64-bitowe, konwersję z formatów krótkich 
(np. bajt) do formatów dłuższych (np. słowo). 

!"

Podstawowe operacje logiczne AND, NAND, OR, XOR wykonywane na parach 
odpowiadających sobie bitów. 

!"

Operacje przesunięcia logicznego w lewo i w prawo. 

!"

Ładowanie danych z pamięci do rejestrów procesora, składowanie danych w pamięci 
operacyjnej i przesłania między rejestrami procesora. 

Każda instrukcja może być wykonywana na danych o innym (krótszym lub dłuższym) formacie. 
Każdej takiej instrukcji odpowiada inny kod binarny co pokazano w tablicy 3. 
 W 

charakterze 

przykładu rozważmy instrukcję mnożenia połączonego z akumulacją wyników: 

PMADDWD MM0, MM1 
Zawartość rejestrów MM0 oraz MM1 traktowana jest jak czwórka 16-bitowych liczb zapisanych 
w formacie stałoprzecinkowym: 

MM0= -100 

-62 

17 -30 

 

MM1= 64 -66 

42 -40 

W wyniku mnożenia odpowiadających sobie par liczb otrzymujemy cztery 32-bitowe liczby: 

-6400 4092   

714  1200 

Pierwsza para iloczynów powstała w wyniku przemnożenia odpowiadających sobie liczb 
leżących w górnej części rejestrów MM0 i MM1. Druga para iloczynów powstała w wyniku 

                                                            

24 Procesor Pentium, Cyrix MII i AMD K-6 posiadają jedną jednostkę przetwarzającą 

instrukcje MMX. Procesor Pentium II i Pentium Celleron posiadają dwie takie jednostki 
działające współbieżnie. 

25 Magistrale wewnętrzne procesora są 64-bitowe. 

background image

 19

przemnożenia odpowiadających sobie liczb leżących w dolnej części rejestrów MM0 i MM1. 
Pierwsze dwa iloczyny są dodawane do siebie i umieszczane w rejestrze w górnej części rejestru 
MM0. W dolnej części rejestru MM0 umieszczana jest suma drugiej pary iloczynów: 

MM0= -2308 

1914 

Firma Intel twierdzi [23], że jeżeli oba argumenty instrukcji PMADDWD są rejestrami jednostki 
MMX to procesor Pentium jest w stanie średnio realizować jedną taką instrukcję co 1.5 taktu 
zegarowego. Jeśli jeden z argumentów musi zostać pobrany z pamięci jedna instrukcja 
PMADDWD jest realizowana co dwa takty zegarowe. Dla typowej obecnie częstotliwości zegara 
komputera PC mieszczącej się w granicach od 300 MHz do 500 MHz daje to od 600 milionów do 
1.333 miliarda mnożeń połączonych z akumulacją na sekundę! 
 

Tablica 3. Zbiór instrukcji MMX rozszerzających architekturę IA-32 

Typ  

Mnemonika 

N 

Opis 

 Arytmetyczne  PADD[B,W,D]  

3  Dodawanie bez nasycenia [8,16,32 bity]  

 

PADDS[B,W] 

2  Dodawanie liczb ze znakiem [8,16,32 bity] nasycenie 

 

PADDUS[B,W] 

2  Dodawanie liczb bez znaku [8,16 bitów], nasycenie 

 

PSUB[B,W,D] 

3  Odejmowanie bez nasycenia [8,16,32 bity] 

 

PSUBS[B,W] 

2  Odejmowanie liczb ze znakiem [8,16 bitów] nasycenia  

 

PSUBUS[B,W] 

2  Odejmowanie liczb bez znaku [8,16 bitów], nasycenie  

 PMULHW 

Mnożenie górnej części rejestru  

 PMULLW 

Mnożenie dolnej części rejestru  

 PMADDWD 

Mnożenie połączone z akumulacją  

 Porównanie  PCMPEQ[B,W,D]  3  Porównanie liczb [8,16,32 bity] czy równe? 
 

PCMPGT[B,W,D] 

3  Porównanie liczb [8,16,32 bity] czy większa? 

 Konwersja 

 Formatu 

PACKUSWB  

1  Pakuj słowa w bajty (bez znaku, z nasyceniem) 

 PACKSS[WB,DW] 

Pakuj [słowa w bajty, podwójne słowa w poczwórne słowa] (znak 

i nasycenie)   

 

PUNPCKH 

[BW,WD,DQ] 

3  Rozpakuj starsze [8,16,32bity] z rejestru MMX 

 

PUNPCKL 

[BW,WD,DQ] 

3 Rozpakuj młodsze [8,16,32bity] z rejestru MMX 

 Logiczne  PAND  

1  AND 

 PANDN 

AND 

NOT 

 POR 

OR 

 PXOR 

XOR 

 Przesunięcia 

PSLL[W,D,Q] 6 

Przesunięcie logiczne w lewo [8,16,32bity] 

 PSRL[W,D,Q] 

Przesunięcie logiczne w prawo [8,16,32bity]  

 PSRA[W,D] 

Przesunięcie arytmetyczne w prawo [8,16bitów]  

 Przesłania MOV[D,Q] 

 

Przesłanie [32,64 bitów] z / do rejestru MMX  

stan FP&MMX  

EMMS 

1  Zeruj stan MMX 

N liczna różnych kodów binarnych 

background image

 20

5.3 Programowanie 
Ze względu na zastosowane rozwiązania w konstrukcji jednostki MMX firma Intel nie zaleca 
stosowania na przemian instrukcji MMX oraz instrukcji wykonujących działania na liczbach w 
formacie zmiennoprzecinkowym. Główne przesłanki tego zalecenia są następujące: 

!"

Wykonanie instrukcji MMX powoduje ustawienie wskaźnika stosu rejestrów 
zmiennoprzecinkowych TOS (ang. top of stack) na zero. Instrukcje zmiennoprzecinkowe 
tracą w ten sposób wskaźnik stosu rejestrów, a tym samym dalsza realizacja operacji 
zmiennoprzecinkowych przebiega błędnie. 

!"

Instrukcja MMX wpisując do rejestru MMX dane powoduje, że w części tego rejestru 
używanej przez instrukcje zmiennoprzecinkowe dla przechowywania cechy, wpisywane są 
same jedynki. Taka zawartość rejestru zmiennoprzecinkowego nie reprezentuje żadnej liczby 
zmiennoprzecinkowej i próba wykonania jakiejkolwiek operacji zmiennoprzecinkowej na 
tym rejestrze kończy się zgłoszeniem przerwania do jednostki centralnej. 

!"

Użycie dowolnej z instrukcji MMX powoduje, że tracona jest zawartość rejestru TAG (rejestr 
TAG wypełniany jest zerami). 

!"

Częste przełączanie między instrukcjami MMX i instrukcjami zmiennoprzecinkowymi może 
spowodować znaczne zmniejszenie prędkości przetwarzania. 

Jeżeli program przeprowadza obliczenia na liczbach zmiennoprzecinkowych oraz obliczenia z 
wykorzystaniem instrukcji MMX firma zaleca: 

!"

Podział programu na osobne moduły z których jeden przeprowadza tylko obliczenia na 
liczbach zmiennoprzecinkowych a drugi tylko obliczenia z wykorzystaniem instrukcji MMX. 

!"

Nie należy przekazywać przez rejestry parametrów między jednym i drugim modułem. 

!"

W chwili zakończenia obliczeń z wykorzystaniem instrukcji MMX należy użyć instrukcji 
EMMS dla opróżnienia stosu rejestrów zmiennoprzecinkowych. 

!"

Kończąc obliczenia zmiennoprzecinkowe należy pozostawić pusty stos rejestrów. 

Powyższe zalecenia mają charakter ogólny. Tablica 4 przedstawia natomiast program obliczający 
iloczyn skalarny dwóch wektorów o stu składowych [24], [23]. W programie założono,  że 
składowe obu wektorów zapisane są w tablicach wskazywanych odpowiednio przez rejestry EDX 
i EDI. Każda składowa jest 16-bitową całkowitą liczbą stałoprzecinkową. Licznik pętli 
zorganizowano z wykorzystaniem rejestru ECX. Licznik zawiera liczbę równą (-2)*100 czyli 
liczbę przeciwną do liczby bajtów tablicy zawierającej składowe wektora. W pętli odbywa się: 

!"

Ładowanie do rejestru MM1 czterech składowych wektora mnożnej. 

!"

Mnożenie składowych mnożnej przez odpowiadające im składowe mnożnika połączone z 
dodaniem wyników par mnożeń. Trzydziestodwubitowe wyniki dodawania umieszczone są w 
rejestrze MM1. 

!"

Akumulacja dwóch dodawań w rejestrze MM0. 

Po zakończeniu wykonywania pętli, w chwili gdy wyzerowana zostanie zawartość rejestru ECX, 
górna część i dolna część rejestru MM0 zawierają dwie sumy częściowe, które dodane tworzą 
iloczyn skalarny wektorów. Zawartość akumulatora MM0 zostaje zachowana w rejestrze MM1, 
górna część rejestru MM0 przesunięta na miejsce dolnej a następnie 32-bitowe liczby zawarte w 
rejestrach MM1 i MM0 zostają dodane do siebie. Dolna część rejestru MM0 to obliczany iloczyn 
skalarny. Wystarczy teraz dokonać zaokrąglenia wyniku do 16-bitów przez spakowanie 
zawartości akumulatora MM0. 
 
 
 
 

background image

 21

Tablica 4. Program obliczający iloczyn skalarny z wykorzystaniem instrukcji MMX™ 

; Parametry: 

   próbka sygnału wejściowego na początku linii

 

;     edx -> a[0] 
;     edi -> b[0] 
;     bmar -

> tablica współczynników filtru

 

; Zwraca: 

   iloczyn skalarny a[i]*b[i] w najmłodszym s owie rejestru MM0

 

 
     mov       ecx, 100       ; ecx <- 100 == N 
     sal       ecx,1          ; ecx <- ecx*2 
     add       edx,ecx        ; edx -> a[N] 
     add       edi,ecx        ; edi -> a[N] 
     neg       ecx            ; ecx <- (-2)*N 
 
     pxor      mm0,mm0        ; mm0 <- 0 
 
LOOP: 
     movq      mm1,[edx+ecx]    ; mm1 <- a[i] a[i+1] a[i+2] a[i+3] 
     pmadddw   mm1,[edi+ecx]    ; mm1 <- a[i]*b[i]+a[i+1]*b[i+1] 
                                ;        a[i+2]*b[i+2]+a[i+3]*b[i+3] 
 
     padddw    mm0,mm1          ; mm0 <- mm0 + mm1 
     add       ecx,8            ; ecx <- ecx + 8 
     jnz       LOOP             ; s

kocz jeśli to nie koniec pętli

 

 
     movq      mm1,mm0          ; mm1 <- mm0 
     psrlq     mm0,32           ; mm0 <- mm0/2^(32) 
     padddw    mm0,mm1          ; mm0 <- mm0 + mm1 

     packssdw  mm0,mm0          ; przekształć na format 1.15

 

 

 

 
6. Nowa architektura Texasa — VelociTI 

Po wielu latach sukcesów rynkowych firma Texas Instruments zdecydowała się unowocześnić i 
ujednolicić architekturę oferowanych procesorów sygnałowych. W ten sposób powstała 
specyfikacja architektury VLIW (ang. very long instruction word) nazwana przez firmę VelociTI 
[9]. Architektura odnosi się do układów przetwarzających liczby w formacie stałoprzecinkowym 
oraz do układów przetwarzających liczby zapisane w formacie zmiennoprzecinkowym. W roku 
1997 na rynku pojawił się układ TMS320C6201 — pierwszy z rodziny o nowej architekturze [6]. 
Układ ten, przetwarzający liczby stałoprzecinkowe, taktowany zegarem o częstotliwości 200 
MHz może osiągać szczytową wydajność 1600 MIPS. Producent przewiduje, że znajdzie on 
zastosowanie w modemach i wokoderach przeznaczonych dla obsługi wielu kanałów 
jednocześnie26 oraz dla przetwarzania obrazów [9]. Drugi układ z rodziny to TMS320C6701 — 
procesor zmiennoprzecinkowy, który taktowany zegarem 166 MHz osiąga szczytową wydajność 
dochodzącą do 1000 Mflops. 
 
 
 
 

                                                            

26 Obie aplikacje stanowią standardową część stacji bazowej cyfrowej telefonii 

komórkowej. 

background image

 22

6.1 Jednostka centralna TMS320C6201 
Jednostka centralna układu TMS320C6201 przedstawiona jest na rysunku 4. Układ zawiera 
osiem jednostek wykonawczych podzielonych na dwie grupy i oznaczonych L1, S1, M1, D1 oraz 
L2, S2, M2, D2. Każda z grup ma do dyspozycji szesnaście 32-bitowych rejestrów — patrz 
rysunek 5. Dla pierwszej grupy jednostek są to rejestry A0-A15, dla grupy drugiej są to rejestry 
B0-B15. Każda jednostka wykonawcza ma swobodny dostęp do rejestrów swojej grupy. Każda 
grupa jednostek ma jeden port pozwalający na pobieranie lub zapisywanie danych w pamięci. W 
ten sposób w danym cyklu tylko jedna jednostka wykonawcza w każdej z grup może zapisywać 
(odczytywać) pamięć. Podobny port pozwala grupie jednostek na dostęp do rejestrów drugiej 
grupy jednostek.  

Pamięć (notatnikowa) programu

32 - bit

256 - bit dane

DMA, EMIF

Pamięć (notatnikowa) programu

32 - bit

8-, 16-, 32 - bit dane

Power

dawn

Rysunek 4. Schemat blokowy jednostki centralnej procesora TMS320C6201

Pobranie instrukcji
Rozdział instrukcji

Dekodowanie instrukcji

Ścieżka danych A

Ścieżka danych B

Zbiór rejestrów A

.L1 .S1 .M1 .D1

Rejestry

sterujące

Układ

sterowania

Układ testujący

Emulator

Przerwania

Urządzenia I/O

timery, porty

szeregowe, itd...

Zbiór rejestrów B

.D2 .M2 .S2 .L2

‘C62xx CPU

background image

 23

 Instrukcje 

pobierane 

są z pamięci programu w porcjach po 256-bitów (ang. fetch packet), 

które nazwiemy liniami. Porcja taka zawiera osiem 32-bitowych instrukcji, z których każda 
odnosi się do jednej jednostki wykonawczej. Najmłodszy bit każdej z instrukcji określany jest 
angielską nazwą P-bit. Jeżeli P-bit instrukcji X równy jest 1 to następna instrukcja Y będzie 
wykonywana równocześnie z instrukcją  X27. W ten sposób tworzone są  łańcuchy instrukcji 
wykonywanych równocześnie przez różne jednostki wykonawcze. Łańcuch taki nazywany jest w 
terminologii wprowadzonej przez firmę Texas Instruments execute packet. Każda linia instrukcji 
pobranych przez jednostkę centralną (fetch packet) musi zawierać całkowitą liczbę  łańcuchów 
(execute packet) tzn. że P-bit ostatniej28 z pobranych instrukcji musi być równy 0. Zachodzą 
przy tym trzy możliwości [14]: 

!"

Wszystkie pobrane instrukcje (fetch packet) mają wyzerowany P-bit: 

 

Instrukcja  A B C D E F G H 

P-bit 

0 0 0 0 0 0 0 0 

  

W związku z tym instrukcje te wykonywane są sekwencyjnie np. tak: 

 

Takt 

zegara L1 S1 D1 M1 L2 S2 D2 M2 

1 nop 

Nop 

A 

nop nop nop nop nop 

2 nop 

B 

nop nop nop nop nop nop 

nop Nop nop nop nop C 

nop nop 

nop Nop nop nop nop D 

nop nop 

nop Nop nop E 

nop nop nop nop 

                                                            

27 Pod warunkiem, że odnoszą się do innych jednostek wykonawczych. 
28 Magistrala służąca pobieraniu instrukcji jest magistralą 256-bitową. Osiem instrukcji 

pobieranych jest równocześnie. Należałoby zatem mówić o najmłodszej (najmniej znaczącej?) z 
pobranych instrukcji. 

A15     A14    A13    A12    A11    A10     A9      A8      A7      A6      A5      A4      A3      A2       A1      A0

B15     B14    B13    B12    B11    B10     B9      B8      B7      B6      B5      B4      B3      B2       B1      B0

Rejestry używane
do adresowania
z 15-bitowym
przesunięciem

Rejestry używane
przez instrukcje
warunkowe

Rejestry używane
do adresowania
cyklicznego

Rysunek 5.Rejestry procesora TMS320C6201

background image

 24

F 

Nop nop nop nop nop nop nop 

nop Nop nop nop nop nop G 

nop 

nop Nop nop nop nop nop nop H 

 

!"

Pobrane instrukcje (fetch packet) tworzą kilka łańcuchów (execute packet): 

 

Instrukcja  A B C D E F G H 

P-bit 

1 1 0 1 0 0 1 0 

 
i wykonywane są częściowo równolegle: 
 

Takt 

zegara L1 S1 D1 M1 L2 S2 D2 M2 

1 nop 

B 

A 

nop nop nop C 

nop 

2 nop 

Nop 

E 

nop  D 

nop nop nop 

F 

Nop nop nop nop nop nop nop 

nop Nop nop nop nop nop H 

G 

 

!"

Pobrane instrukcje (fetch packet) tworzą jeden łańcuch (execute packet): 

 

Instrukcja  A B C D E F G H 

P

bit 

1 1 1 1 1 1 1 0 

 
i wykonywane są wszystkie równolegle: 
 

Takt 

zegara L1 S1 D1 M1 L2 S2 D2 M2 

A 

B 

C 

D 

E 

F 

G 

H 

 

Ze względu na szybkość przetwarzania danych najkorzystniejsza wydaje się sytuacja kiedy 
wszystkie pobrane instrukcje są wykonywane równolegle i wszystkie jednostki wykonawcze w 
każdym cyklu zegarowym są „zajęte” użyteczną pracą. Trudno się jednak spodziewać, że uda się 
w ten sposób zakodować każdy algorytm. Najczęściej będziemy mieli do czynienia z 
„częściową” równoległością przetwarzania. Istotna trudność polega jedynie na tym, że granice 
łańcuchów instrukcji (execute packet) nie będą się pojawiały regularnie co osiem instrukcji. 
Mamy wtedy do dyspozycji przynajmniej dwie strategie postępowania. W trosce o ilość pamięci 
zajmowanej przez kod programu łańcuchy instrukcji zostaną „przerwane” co osiem instrukcji. W 
ten sposób nie zmienimy rozmiarów kodu ale przestaje to być kod optymalny pod względem 
szybkości przetwarzania. Optymalność kodu można zachować uzupełniając go o instrukcje 
NOP29 tak, aby granice łańcuchów instrukcji (execute packet) wypadały co 8 instrukcji. W 
najgorszym przypadku w kodzie optymalnym instrukcje grupowane są w łańcuchy po 5 
instrukcji. Każdy łańcuch musi być wtedy uzupełniony trzema instrukcjami NOP co daje wzrost 

                                                            

29 Instrukcja oznaczająca „nic nie rób" (ang. no operation). 

background image

 25

objętości kodu o 60%. Jeżeli założyć, że średnia liczba instrukcji NOP w każdej linii instrukcji 
wynosi 1.5 to wzrost objętości kodu wynosi 30%. 
 

Tablica 5. Przyporządkowanie instrukcji poszczególnym jednostkom wykonawczym procesora 

TMS320C6201 [9] 

L 

S 

D 

M 

Dodawanie liczb 

stałoprzecinkowych 

Dodawanie liczb 

stałoprzecinkowych 

Dodawanie liczb 

stałoprzecinkowych 

Mnożenie liczb 

stałoprzecinkowych 

Operacje logiczne 

Operacje logiczne 

Ładowanie 

i zapamiętywanie danych 

 

Zliczanie bitów 

Operacje na bitach 

 

 

 Przesuwanie  

 

 

Ładowanie stałych  

 

 Instrukcje 

skoku 

i wywołania 

podprogramu 

 

 

 
  Zbiór jednostek wykonawczych procesora TMS320C6201 nie jest zupełnie symetryczny, choć 
wiele często używanych instrukcji może być wykonywana przez więcej niż jedną jednostkę. 
Tablica 5 pokazuje jakie instrukcje wykonywane są przez poszczególne jednostki procesora. Na 
etapie tworzenia kodu programu trzeba przydzielić każdej instrukcji jednostkę procesora, która ją 
wykona. Na tym etapie zapada też decyzja, które instrukcje będą wykonywane jednocześnie oraz 
uzupełnia się kod programu o instrukcje NOP. Wszystkie operacje wykonywane są na 
argumentach pobieranych z rejestrów procesora. Wynik działania instrukcji zapamiętywany jest 
także w rejestrze. Oddzielono od siebie w ten sposób operacje dostępu do pamięci (odczyt i 
zapis) od właściwych operacji przetwarzania. Zbiór instrukcji jest zbiorem typu RISC30 tzn. że 
operacje wykonywane przez instrukcje są w miarę proste i niezależne od siebie. Ponieważ 
procesor posiada duży zbiór uniwersalnych rejestrów możliwa jest konstrukcja kompilatorów 
generujących kod bardzo zbliżony do kodu optymalnego31 pod względem szybkości 
przetwarzania danych [9]. Szczegółową listę instrukcji procesora TMS320C6201 można znaleźć 
w [14]. Godne podkreślenia są przy tym następujące cechy tej listy: 

!"

Procesor realizuje arytmetykę z nasyceniem. 

!"

Sprzętowo wspomaga realizację algorytmu dzielenia liczb stałoprzecinkowych. 

!"

Instrukcje zliczania nadmiarowych bitów znaku ułatwiają programową realizację arytmetyki 
zmiennoprzecinkowej oraz skalowanie grupy liczb pojawiające się np. stałoprzecinkowym 
algorytmie FFT. 

!"

Instrukcje porównania umieszczają wynik (jedynkę lub zero) w rejestrach ogólnego 
przeznaczenia — patrz rysunek 5. 

!"

Instrukcja ADD2 (SUB2) pozwala na dodanie (odjęcie) zawartości dwóch rejestrów z 
pominięciem przeniesienia z pozycji binarnej 15 na 16 — w ten sposób jedna instrukcja 
wykonuje dwa dodawania (odejmowania) liczb 16-bitowych. 

                                                            

30 ang. reduced instruction set computer 
31 Punktem odniesienia są tu algorytmy kodowane ręcznie na poziomie asemblera. 

background image

 26

!"

Procesor wykonuje operacje na wybranych grupach bitów — ekstrakcja, ustawianie, 
zerowanie. 

!"

Najmniejszą adresowalną jednostką danych jest bajt. 

!"

Adresowanie odbywa się z wykorzystaniem rejestrów ogólnego przeznaczenia. Adresy są 
32-bitowe. Daje to przestrzeń adresową 4GB. Adresowanie cykliczne (bufory cykliczne) 
mogą być realizowane z wykorzystaniem wybranych rejestrów — patrz rysunek 5. 

  Wszystkie instrukcje procesora TMS320C6201 mogą być wykonywane warunkowo. 
Testowana jest wtedy zawartość jednego z rejestrów A1, A2, B0, B1, B2 przy czym zero oznacza 
tradycyjnie fałsz a wartość różna od zera prawdę. Każda z instrukcji, niezależnie od od tego czy 
warunek jest spełniony czy też nie wchodzi w etap wykonania. Dla instrukcji, której warunek nie 
jest spełniony wynik działania nie jest zapisywany do rejestru przeznaczenia. Podobnie jest w 
przypadku instrukcji zapisu w pamięci. Jeżeli warunek nie jest spełniony nie jest uruchamiany 
mechanizm dostępu do pamięci. Instrukcje warunkowe pozwalają na eleganckie konstruowanie 
pętli if-else bez wykonywania instrukcji skoku32. W tablicy 6 pokazany jest fragment programu 
napisanego w języku C. Program składa się właściwie z dwóch instrukcji if-else: 

!"

Pierwsza instrukcja sprawdza zmienną b2. Jeżeli jest ona różna od zera liczbę 
przechowywaną przez zmienną a5 powiększa się o liczbę przechowywaną przez zmienną b4. 

!"

Druga instrukcja sprawdza zmienną a0. Jeżeli jest równa zero następuje operacja mnożenia. 
W przeciwnym wypadku zerowana jest zmienna b0 i inkrementowana jest zmienna a5. 

Ten sam program napisany w asemblerze procesora TMS320C6201 przedstawiony jest w tablicy 
7. Cały program składa się zaledwie z jednego łańcucha instrukcji wykonywanych w tym samym 
cyklu zegarowym33 (execute packet). Pierwszej instrukcji programu napisanego w języku C 
odpowiada pierwsza instrukcja programu asemblerowego — warunkowa akumulacja zawartości 
rejestru B4 w rejestrze A5. Pozostałe trzy instrukcje asemblerowe realizują drugą instrukcję 
if-else. Wszystkie trzy instrukcje będą wykonywane jednocześnie ale ze względu na wzajemnie 
wykluczające się warunki zostanie utrwalony tylko wynik realizacji pierwszej z nich (część if 
instrukcji w języku C) albo wynik działania pozostałych dwóch (część else instrukcji w języku 
C). Nie ma tu żadnych skoków i związanych z tym opóźnień.  
 

Tablica 6. Przykładowy fragment programu w języku C zawierający instrukcje if-else 

 
  if (b2) a5 += b4; 
  if (a0) b0 = a0 * (unsigned) (b1 >> 16); 
  else 
     { 
     b0 = 0; 
     a5 += 1; 
     } 
     

 

 
 
 

                                                            

32 Efektywny czas wykonania instrukcji skoku warunkowego w przypadku procesora z 

rozbudowanym przetwarzaniem potokowym (a takim procesorem jest TMS320C6201) może być 
równy nawet kilkudziesięciu okresom segara taktującego.  

33 W asemblerze kolejne instrukcje łączone są w łańcuchy za pomocą dwóch pionowych 

kresek „||” wstawionych między łączone instrukcje. 

background image

 27

 
 

Tablica 7. Realizacja instrukcji if-else w asemblerze procesora TMS320C6201 

 
      [B2]   ADD           .L1X    A5, B4, A5  
   || [A0]   MPYLSHU       .M2X    A0, B1, B0 
   || [!A0]  ZERO          .S1     B0 
   || [!A0]  ADD           .D1     A5, 1, A5 

 

 
 
6.2 Potok instrukcji 
Ograniczenia współczesnej submikronowej technologii elektronowej [15] skłaniają 
konstruktorów do tworzenia procesorów o bardzo rozwiniętym przetwarzaniu potokowym. Tak 
też jest w przypadku procesora TMS320C6201. Przetwarzanie potokowe składa się z trzech 
zasadniczych etapów: 

!"

Pobranie instrukcji obejmujące cztery podetapy — cykle zegarowe: 

⇒ 

generowanie adresu następnej linii instrukcji lub wyliczenie adresu instrukcji skoku; 

⇒ 

przekazanie adresu do pamięci programu; 

⇒ 

sprawdzenie czy pobierana linia zapisana jest w pamięci notatnikowej; jeżeli pobranie linii 
instrukcji wymaga sięgnięcia do pamięci zewnętrznej wstrzymywane jest przetwarzanie 
całego potoku instrukcji na czas potrzebny dla pobrania instrukcji z pamięci zewnętrznej; 
jest to jedyny przypadek kiedy wstrzymywany jest cały potok instrukcji; 

⇒ 

przekazanie pobranej instrukcji jednostce centralnej. 

!"

Dekodowanie instrukcji, które realizowane jest w dwóch podetapach: 

⇒ 

w pobranej linii instrukcji wydzielane są  łańcuchy instrukcji wykonywanych równolegle 
(execute packets); 

⇒ 

dekodowanie kolejnych łańcuchów instrukcji i przekazywanie ich odpowiednim 
jednostkom w celu realizacji; dekodowanie każdego  łańcucha instrukcji trwa jeden cykl 
zegarowy i dopóki nie zostaną zdekodowane wszystkie łańcuchy tworzące linię 
wstrzymuje się pobieranie kolejnych linii instrukcji. 

!"

Wykonanie instrukcji — ta część potoku zawiera pięć etapów34 przetwarzania E1-E5. 
Wykonywanie większości instrukcji kończy się jednak już po pierwszym etapie tak, jak 
ilustruje to tabela 8. Tabela uwzględnia: 

⇒ 

result latency — liczba cykli zegarowych niezbędnych dla ukończenia instrukcji; 

⇒ 

delay slots — opóźnienie — liczba łańcuchów instrukcji, następujących po zadanej 
instrukcji X, dla których wynik działania instrukcji X jest jeszcze niedostępny; opóźnienie 
jest zawsze równe liczbie cykli zegarowych niezbędnych dla ukończenia instrukcji minus 
jeden; 

⇒ 

functional unit latency — czas, liczony w cyklach zegarowych, po upływie którego 
jednostka realizująca instrukcję może podjąć wykonywanie następnej instrukcji; dla 

                                                            

34 Zmiennoprzecinkowy procesor TMS320C6701 o architekturze VelociTI potrzebuje 

nawet do dziesięciu etapów w celu zakończenia instrukcji arytmetycznych podwójnej precyzji. 

background image

 28

procesora TMS320C6201 czas ten zawsze wynosi jeden co oznacza, że w każdym cyklu 
zegarowym każda jednostka może rozpocząć realizację kolejnej instrukcji35. 

 Tablica 

wskazuje, 

że największe opóźnienie występuje podczas realizacji instrukcji skoku. 

W istocie instrukcja skoku realizowana jest już w pierwszym cyklu E1 etapu wykonania i 
powoduje zmianę adresu linii instrukcji, która będzie pobierana. Potok instrukcji ani nie jest 
wstrzymywany, ani nie jest unieważniany. Powoduje to, że jeszcze pięć  łańcuchów instrukcji 
(execute packets) pobranych po instrukcji skoku będzie wykonanych zanim nastąpi wykonanie 
pierwszej instrukcji wskazywanej przez argument instrukcji skoku. Jednym słowem procesor 
TMS320C6201 dysponuje jedynie instrukcją skoku z opóźnieniem, a opóźnienie wynosi pięć 
cykli zegarowych (instrukcji, łańcuchów instrukcji). W każdym  łańcuchu instrukcji mogą 
pojawić się dwie instrukcje skoku — jedna wykonywana przez jednostkę S1, a druga przez 
jednostkę S2. Procesor zachowa się w sposób przewidywalny jedynie wtedy, gdy obie instrukcje 
są instrukcjami warunkowymi, a warunki wzajemnie się wykluczają. 
 

Tablica 8. Czas realizacji instrukcji procesora TMS320C6201 

 Instrukcja 

Result 

latency 

Delay 

slots 

Functional unit 

latency 

 Instrukcje mnożenia: MPY, SMPY 

 Instrukcja ładowania danych: LD(B,H,W,D) 

 Instrukcja skoku: B 

 Wszystkie pozostałe instrukcje 

 
  Instrukcja pobrania danych z pamięci (LD) jest jedyną instrukcją procesora TMS320C6201, 
która wymaga na etapie realizacji pięciu cykli zegarowych E1-E5. W etapie E1 obliczany jest 
adres argumentu; w etapie E2 adres przekazywany jest do podsystemu pamięci; w etapie E3 
procesor sprawdza czy argument znajduje się w pamięci notatnikowej, a jeżeli nie cały potok 
instrukcji wstrzymywany jest w celu realizacji dostępu do zewnętrznej pamięci RAM; w etapie 
E4 dane przekazywane są z podsystemu pamięci do właściwej jednostki centralnej;w etapie E5 
następuje zapisanie danych w rejestrze. Ze względu na opisany mechanizm dla czterech instrukcji 
(execute packets) następujących po instrukcji LD dane pobierane przez instrukcję LD nie są 
jeszcze dostępne. Natomiast modyfikacje rejestru służącego do adresowania widoczne są już dla 
następnej instrukcji po instrukcji LD. Instrukcja zapisywania w pamięci (ST) realizowana jest w 
ciągu trzech cykli zegarowych E1-E3. W etapie E1 obliczany jest adres argumentu; w etapie E2 
adres przekazywany jest do podsystemu pamięci; w etapie E3 dane przekazywane są do 
podsystemu pamięci. Dzięki odpowiedniej konstrukcji podsystemu pamięci wydaje się,  że 
kombinacja instrukcji ST i LD wykonywana jest zawsze tak jak gdyby nie istniały jakiekolwiek 
opóźnienia w ich wykonaniu. Możliwe są bowiem tylko trzy sytuacje [14]: 

!"

Bezpośrednio po instrukcji ładowania (LD) z komórki pamięci o adresie X występuje 
instrukcja składowania (ST) do tej samej komórki X. Kiedy instrukcja ST znajduje się na 
etapie E3 wykonania i zapisywane dane przekazywane są do podsystemu pamięci 
instrukcja LD jest na etapie wykonywania E4 i odczytywane dane dostarczane są do 

                                                            

35 Czas ten może być większy dla innych procesorów należących do rodziny o 

architekturze VelociTI. 

background image

 29

jednostki centralnej. W rezultacie stare dane z komórki o adresie X są  ładowane do 
rejestru, a nowe dane (pochodzące z procesora) zapisywane do komórki X. 

!"

Bezpośrednio po instrukcji składowania (ST) w komórce pamięci o adresie X występuje 
instrukcja  ładowania (LD) z tej samej komórki X. Kiedy instrukcja ST znajduje się na 
etapie E3 wykonania i nowe dane przekazywane są do podsystemu pamięci instrukcja LD 
jest na etapie wykonywania E2 i do podsystemu pamięci przekazywany jest dopiero adres 
argumentu instrukcji LD. W rezultacie nowe dane zapisywane są w komórce o adresie X i 
te same dane ładowane są do rejestru procesora. 

!"

Instrukcja LD ładowania z komórki o adresie X jest wykonywana równolegle (połączona 
w  łańcuch) z instrukcją składowania ST w tej samej komórce. W rezultacie wykonania 
tych instrukcji stara wartość z pamięci zapisana zostaje w rejestrze procesora, a nowa 
wartość (pochodząca z procesora) zapisana w komórce X. 

 
6.3 Przerwania

 

Procesor TMS320C6201 ma możliwość reakcji na 14 przerwań. Są to: zerowanie procesora — 
RESET, przerwanie niemaskowane — NMI, 12 przerwań maskowanych INT4-INT15. Źródłem 
dwóch pierwszych przerwań  są zawsze sygnały doprowadzone do wyprowadzeń zewnętrznych 
procesora. Część przerwań maskowanych wykorzystywanych jest przez urządzenia peryferyjne 
zintegrowane wraz z procesorem zaś pozostałe mogą pochodzić od urządzeń zewnętrznych. 
Każdemu przerwaniu przypisany jest priorytet. Najbardziej uprzywilejowane jest zerowanie 
procesora, następnie przerwanie niemaskowane i przerwania maskowane dla których stopień 
uprzywilejowania maleje wraz ze wzrostem numeru tzn. najbardziej uprzywilejowanym wśród 
przerwań maskowanych jest przerwanie INT4 a najmniej uprzywilejowanym jest przerwanie 
INT15.

 

  Zerowanie procesora odbywa się niezależnie od jego stanu wewnętrznego. Obsługę 
przerwania niemaskowanego może uniemożliwić jedna z poniższych okoliczności: 

!"

Aktualnie obsługiwane jest przerwanie niemaskowane, które pojawiło się wcześniej. 

!"

Właśnie wykonana została instrukcja skoku. Procesor blokuje automatycznie system 
przerwań na pięć taktów zegarowych36 aby prawidłowo zakończyć wykonywanie 
instrukcji, które znalazły się już w potoku37. 

Obsługę przerwania maskowanego może uniemożliwić jedna z poniższych okoliczności: 

!"

Aktualnie obsługiwane jest przerwanie niemaskowane, które pojawiło się wcześniej. 

!"

Właśnie wykonana została instrukcja skoku i system przerwań procesora jest 
zablokowany na okres pięciu taktów zegarowych. 

!"

Programowo zablokowano obsługę wszystkich przerwań maskowanych przez 
wyzerowanie bitu GIE (ang. global interrupt enable) w rejestrze sterującym pracą 
procesora CSR (ang. control status register). 

!"

Programowo zamaskowano obsługę zgłaszanego przerwania przez wpisanie do rejestru 
masek IER (ang. interrupt enable register) zera na pozycji odpowiadającej zgłaszanemu 
przerwaniu. 

                                                            

36 Nawet jeżeli wykonanie instrukcji skoku warunkowego nie doszło do skutku. 
37 Przerwanie którejkolwiek z pięciu instrukcji (execute packets) następującyh po 

instrukcji skoku powoduje, że ślad zachowywany przez procesor podczas przechodzenia do 
procedury obsługi przerwania nie pozwala na odtworzenie stanu potoku przed przerwaniem. 

background image

 30

Zgłoszenie przerwania polega na przejściu zewnętrznego sygnału zgłoszenia przerwania ze stanu 
niskiego do stanu wysokiego. Procesor wykrywa pojawienie się sygnału  żądania przerwania w 
czasie nie przekraczającym trzech cykli zegarowych. W tym czasie sprawdza się czy może zostać 
podjęte wykonywanie procedury obsługi przerwania tzn. czy system przerwań jest aktywny, czy 
przerwanie nie jest zamaskowane itd. Jeżeli procedura obsługi zgłaszanego przerwania może być 
podjęta to: 

!"

Blokowane jest przyjmowanie dalszych przerwań. 

!"

Unieważniane są wszystkie instrukcje znajdujące się w potoku, które nie doszły jeszcze 
do etapu wykonania. 

!"

Do rejestru IRP (ang. interrupt return pointer) wpisywany jest adres najstarszej z 
unieważnionych instrukcji. Powrót z procedury obsługi przerwania polega na wykonaniu 
skoku do instrukcji wskazywanej przez rejestr IRP. 

!"

W rejestrze IFR (ang. interrupt flag register) ustawiany jest bit odpowiadający 
zgłaszanemu przerwaniu. 

W następnym cyklu zegarowym: 

!"

W potoku instrukcji wymuszany jest skok do procedury obsługi przerwania. 

!"

Na zewnątrz uaktywniany jest sygnał IACK sygnalizujący urządzeniom zewnętrznym, że 
procesor podjął obsługę zgłoszonego przerwania. 

Jeszcze jeden cykl zegarowy później zerowana jest flaga w rejestrze IFR odpowiadająca 
obsługiwanemu przerwaniu. W rezultacie od chwili zgłoszenia przerwania do chwili rozpoczęcia 
etapu E1 pierwszej instrukcji procedury obsługi przerwania upływa 11 cykli zegarowych czyli 
zaledwie 55 ns. Procesor nie wspomaga sprzętowo zagnieżdżania przerwań. 
 Procedury 

obsługi przerwań tworzą tablicę wektorów przerwań. Tablica wektorów przerwań 

może zostać umieszczona (prawie) gdziekolwiek w przestrzeni adresowej programu. Każdemu z 
przerwań odpowiada w tablicy jedna 256-bitowa procedura obsługi tworząca jedną linię 
instrukcji (fetch packet). Jeżeli tak krótka procedura obsługi przerwania jest niewystarczająca 
należy wykonać skok do właściwej procedury obsługi przerwania. Należy pamiętać,  że każdy 
skok, w tym skok realizujący powrót z procedury obsługi przerwania, wykonywany jest z 
opóźnieniem. 
 Blokowanie 

systemu 

przerwań po wykonaniu instrukcji skoku powoduje, że ciasne pętle 

programowe, których rozmiar nie przekracza pięciu instrukcji (execute packets) nie mogą być 
przerwane. Podczas realizacji takiej pętli po wykonaniu instrukcji skoku potok instrukcji zawiera 
zawsze następną instrukcję skoku. W programach realizujących algorytmy cyfrowego 
przetwarzania sygnałów takie ciasne i czasochłonne pętle pojawiają się bardzo często. Aby 
umożliwić obsługę przerwań  pętlę taką należy sztucznie powiększyć tak aby zawierała 
przynajmniej sześć instrukcji. W tym celu można posłużyć się wieloetapową instrukcją NOP. 
Argumentem tej instrukcji jest liczba cykli zegarowych potrzebnych na jej realizację. 
  Architektura procesora nakłada pewne ograniczenia na sposób pisania programów, które mogą 
być przerwane w celu obsłużenia przerwania. Przykładem „patologicznego” pod tym względem 
programu może być ten zamieszczony w pierwszej części tablicy 9. Instrukcja LD pobiera z 
pamięci dane i umieszcza je w rejestrze A1. Ze względu na opisane wcześniej opóźnienia w 
realizacji instrukcji LD dane te będą dostępne dopiero dla instrukcji mnożenia MPY. W 
międzyczasie programista skorzystał ze „starej” zawartości rejestru A1. W obecności przerwań 
program może działać zupełnie inaczej. Załóżmy, że przerwanie nastąpi po przekazaniu instrukcji 
LD do wykonania a przed rozpoczęciem wykonywania instrukcji dodawania. Po powrocie z 
procedury obsługi przerwania w rejestrze A1 będzie już nowa wartość pobrana przez instrukcję 

background image

 31

LD. Poprawna postać programu znajduje się w drugiej części tablicy 9. Instrukcja LD zapisuje 
pobrane dane do rejestru A6 i ewentualne przerwanie nie wpływa na sposób działania programu. 
 

Tablica 9. Wpływ przerwań na poprawność działania programu realizowanego przez procesor  

TMS320C6201 

; Program działający wadliwie w obecności przerwań

 


 
   LDW    .D1  *A0,A1      ; A1 <- [A0] 
   ADD    .L1   A1,A2,A3   ; A3 <- A2 + A1(stare) 
   NOP          3          ; odczekaj trzy cykle zegarowe 
   MPY    .M1   A1,A4,A5   ; A5 <- A4 * A1(nowe) 
   . 
   . 
   . 

; Program działający poprawnie w obecności przerwań

 


 
   LDW    .D1  *A0,A6      ; A6 <- [A0] 
   ADD    .L1   A1,A2,A3   ; A3 <- A2 + A1 
   NOP          3          ; odczekaj trzy cykle zegarowe 
   MPY    .M1   A6,A4,A5   ; A5 <- A4 * A6 
   . 
   . 
   . 

 

 
 
6.4 Pamięć 
Przestrzeń adresowa programu oraz przestrzeń adresowa danych są w układzie TMS320C6201 
rozdzielone. Razem z jednostką centralną zintegrowano 64K bajtów pamięci programu. Pamięć 
ta może pomieścić 16K instrukcji albo 2K linii programu (fetch packets). Jeżeli wewnętrzna 
pamięć programu jest zdecydowanie za mała dla realizacji zadań postawionych przed systemem 
można ją skonfigurować jako pamięć notatnikową [18]. 
 Układ TMS320C6201 zawiera także 64K bajty pamięci danych. Pamięć danych podzielona 
jest na dwa 32K bajtowe bloki umieszczone „jeden za drugim” w przestrzeni adresowej danych. 
Każdy z bloków podzielony jest na cztery banki pamięci o długości słowa 16 bitów i pracujące z 
przeplotem [2], [1]. W ten sposób w większości przypadków możliwy jest jednoczesny dostęp do 
pamięci dwóch „uprawnionych” do tego jednostek wykonawczych D1 i D2 (oraz kontrolera 
DMA). Konflikt powstaje jedynie wtedy, gdy obie jednostki w tym samym cyklu zegarowym 
usiłują się dostać do tego samego banku pamięci co ilustruje tablica 10. W tym przypadku 
przetwarzanie zostaje zatrzymane 0na jeden dodatkowy takt zegarowy tak, aby umożliwić dwa 
kolejne dostępy do tego samego banku pamięci. Jeżeli dojdzie do konfliktu pomiędzy instrukcją 
ładowania LD i instrukcją składowania ST zawsze najpierw wykonywana jest instrukcja 
ładowania LD. 
 
 
 
 
 

background image

 32

Tablica 10. Schemat konfliktów podczas dostępu do wewnętrznej pamięci danych procesora 

TMS320C6201 

 D1 

 

bajt 

 

s owo

 

s

owo

 

D2 LSB 

adresu 

0
0

0
0

0
1

0
1

1
0

1
0

1
1

1
1

0
0

0
1

1
0

1
1

00

10

 
 
 
 
 
 
 bajt 

000 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 001 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 010 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 011 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 100 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 101 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

110 

       

 

 

 

 

 

 

 

 

111 

       

 

 

 

 

 

 

 

 
 
 
 pó

s owo

 

000 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 010 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 100 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

110 

       

 

 

 

 

 

 

 

 
  s

owo

 

000 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 100 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Zacieniowane pole oznacza konflikt

 

 
 Dostęp do zewnętrznej pamięci programu i do zewnętrznej pamięci danych realizowany jest 
za pośrednictwem specjalizowanego układu sterującego o nazwie EMIF (ang. external memory 
interface). Pozwala on na: 

!"

Dołączenie do układu procesora szerokiej gamy pamięci RAM. 

!"

Szczytową szybkość przesyłania danych pomiędzy pamięcią zewnętrzną a procesorem 
równą 800 Mbajtów/s. 

!"

Możliwość zaadresowania do 52 Mbajtów pamięci. Pamięci podzielone są na cztery bloki 
(ang. chip-enable space). Trzy z nich mogą zawierać do 16 Mbajtów pamięci, a czwarty 4 
Mbajty pamięci. 

!"

Adresowanie pojedynczych bajtów. 

!"

Możliwość pobierania danych z pamięci ROM o organizacji ośmio i szesnasto bitowej. 

!"

Współdzielenie pamięci z innymi procesorami. 

background image

 33

Układ EMIF pozwala na dołączanie różnych typów pamięci RAM bez konieczności stosowania 
dodatkowych układów logicznych. W szczególności dotyczy to: 

!"

Synchronicznej, statycznej pamięci RAM pracującej w trybie zakładkowania 
(SBBSRAM). Częstotliwość zegara taktującego może być równa częstotliwości zegara 
taktującego procesor lub dwukrotnie niższa. 

!"

Synchronicznej dynamicznej pamięci RAM (SDRAM) taktowanej zegarem o 
częstotliwości równej połowie częstotliwości zegara procesora. Układ EMIF zapewnia 
właściwe odświeżanie pamięci. 

!"

Wszelkiego rodzaju pamięci asynchroniczne SRAM, ROM, flash itd. Istnieje możliwość 
programowej zmiany liczby cykli oczekiwania na gotowość pamięci. 

 Najmniejszą adresowalną porcją pamięci jest jeden bajt. Z pamięci pobierać można bajty, 
półsłowa (2 bajty) i słowa (4 bajty). Adres każdego półsłowa musi być parzysty, a adres każdego 
słowa musi być podzielny przez cztery. Do pamięci mogą sięgać tylko dwie instrukcje: 
ładowanie LD i składowanie ST. Instrukcje te mogą być wykonane tylko przez jednostkę D1 lub 
D2. Dostępne jest tylko adresowanie pośrednie przez rejestr z indeksowaniem. Źródłem indeksu 
może być rejestr wewnętrzny procesora, krótka 5-bitowa stała lub stała 16-bitowa. Rejestr 
służący do adresowania może być inkrementowany (dekrementowany) przed lub po wykonaniu 
dostępu do pamięci. Adresując z wykorzystaniem rejestrów A4-A7 lub B4-B7 można 
zorganizować bufory cykliczne. 
 
6.5 Peryferia 
Procesory z rodziny TMS320C62xx integrowane są wraz z pewną liczbą urządzeń peryferyjnych. 
Poniżej przedstawiony jest krótki ich przegląd. 
 
6.5.1 Kontroler DMA [9] 
Kontroler DMA pozwala na przeprowadzenie transmisji danych między dwoma obszarami 
pamięci lub pomiędzy pamięcią a urządzeniem zewnętrznym bez konieczności angażowania 
procesora centralnego. Transmisja może odbywać się z szybkością dochodzącą do 800 
Mbajtów/s. Dostępne są cztery programowalne kanały transmisji oraz kanał piąty przeznaczony 
dla obsługi portu HIP. Każdy kanał posiada następujące własności: 

!"

Posiada swój własny zestaw rejestrów zawierających adres źródłowy, adres przeznaczenia 
oraz licznik przesłań. Zaimplementowane schematy indeksowania pozwalają na 
przesyłanie danych pobieranych z komórki o ustalonym adresie oraz przesyłanie danych 
tworzących tablicę jedno lub dwuwymiarową.  

!"

Przesyłanie danych może być wyzwalane przez zdarzenia, których źródłem jest 
urządzenie zewnętrzne lub urządzenie zintegrowane razem z procesorem.  

!"

Sygnalizuje jednostce centralnej, za pomocą przerwania, zakończenie transmisji lub 
pojawienie się błędów.  

!"

Może być zaprogramowany w trybie autoinicjalizacji tak, aby podjął następną transmisję 
bez konieczności interwencji ze strony jednostki centralnej.  

!"

Może także obsługiwać transmisję półdupleksową — od pamięci do urządzenia 
zewnętrznego i w kierunku odwrotnym. 

Podczas obsługi procedury zerowania procesora — RESET — kontroler DMA może zostać 
wykorzystany dla przesłania programu z zewnętrznej pamięci ROM do wewnętrznej pamięci 
RAM. 
 
 

background image

 34

6.5.2 Porty szeregowe 
Układ TMS320C6201 posiada zintegrowane dwa synchroniczne porty szeregowe podobne do 
tych, które firma stosuje w układach TMS320C2x/C5x/C54x. Cechą szczególną procesora 
TMS320C6201 jest możliwość obsługiwania transmisji z portu szeregowego do pamięci oraz w 
kierunku odwrotnym przez kontroler DMA. Port może prowadzić transmisję z szybkością do 100 
Mbitów/s. Chodzi tu oczywiście o dwa strumienie danych każdy o wymienionej przepływności 
— jeden to dane transmitowane od procesora do urządzenia zewnętrznego, drugi strumień 
stanowią dane transmitowane do procesora. Port jest portem wielokanałowym przystosowanym 
do współpracy z układami obsługującymi protokoły transmisji T1, E1 oraz MVIP. 
 
6.5.3 Timer 
Układ timera — programowanego 32—bitowego licznika — może być taktowany zegarem 
zewnętrznym albo zegarem powstałym w wyniku podziału częstotliwości zegara taktującego 
procesor przez cztery. Ta ostatnia możliwość pozwala na odmierzanie odcinków czasu o długości 
przekraczającej jedną minutę z rozdzielczością 20 ns. W zależności od sposobu 
zaprogramowania na wyjściu timera generowany jest pojedynczy impuls lub fala prostokątna. O 
zakończeniu odliczania czasu timer może informować procesor generując żądanie przerwania.  
 
6.5.4 Port dla komunikacji z jednostką nadrzędną (HIP)  
Port dla komunikacji z jednostką nadrzędną HIP (ang. host interface port) jest 16-bitowym 
układem pozwalającym na dostęp do pamięci wewnętrznej procesora TMS320C6201 przez 
procesor nadrzędny. Port może być taktowany zegarem o częstotliwości do 50 MHz i prowadzić 
transmisję z prędkością do 100 Mbajtów/s. Konstrukcja portu pozwala na użycie praktycznie 
dowolnego mikroprocesora lub mikrokontrolera w charakterze jednostki nadrzędnej bez 
konieczności używania rozbudowanych logicznych układów pośredniczących.  
 
6.5.5 Układ oszczędzania energii 
Procesor TMS320C6201 można programowo wprowadzić w stan o niskim poborze energii. 
Istnieją trzy takie stany: 

!"

Power down 1: Zatrzymana zostaje jednostka centralna, natomiast wszystkie urządzenia 
peryferyjne zintegrowane wewnątrz procesora działają. Wyjście z tego stanu następuje w 
wyniku pojawienia się niezamaskowanego żądania przerwania. Przerwanie może 
pochodzić tak od urządzenia zewnętrznego jak i od urządzenia zintegrowanego wraz z 
jednostką centralną. 

!"

Power down 2: Zatrzymana zostaje jednostka centralna oraz wszystkie urządzenia 
peryferyjne z wyjątkiem pętli PLL. Wyjście z tego stanu możliwe jest tylko przez 
zerowanie procesora sygnałem RESET. 

!"

Power down 3: Stan taki sam jak power down 2 lecz pętla PLL procesora także nie działa 
— nie są generowane żadne sygnały zegarowe. 

 
6.6 Przykład programowania 
Programowanie maszyny cyfrowej o takim stopniu przetwarzania równoległego jaki prezentuje 
układ TMS320C6201 różni się istotnie od programowania konwencjonalnego mikroprocesora lub 
mikroprocesora superskalarnego. Dokładne omówienie tego zagadnienia wychodzi poza ramy 
tego artykułu a zainteresowani Czytelnicy muszą zostać odesłani do literatury [19], [20]. Tutaj 
przedstawiona zostanie jedynie jedna z wielu stosowanych technik o angielskiej nazwie software 

background image

 35

pipelining co w swobodnym tłumaczeniu na język polski oznacza programowe zakładkowanie. 
Niech przykładowy algorytm oblicza iloczyn skalarny dwóch wektorów38: 

b

 

 

a

 

 

=

 

b

 

 

a

 

=

 

c

i

i

1

-

N

=0

i

!

!

 

Składowe pierwszego wektora zapisane są w tablicy natomiast składowe drugiego wektora 
zapisane są w tablicy . Iloczyn skalarny to suma iloczynów kolejnych składowych obu wektorów. 
W tablicy 11 przedstawiony jest program napisany w asemblerze procesora TMS320C6201 
obliczający taki iloczyn w sposób całkowicie pomijający możliwości przetwarzania 
równoległego. Obliczanie iloczynu odbywa się w pętli. Pierwsza instrukcja programu inicjuje w 
rejestrze A1 licznik pętli. Druga instrukcja zeruje akumulator A7. Od tego miejsca zaczyna się 
właściwe „ciało” pętli. Pierwsze dwie instrukcje pętli  ładują do procesora po jednej składowej 
każdego z mnożonych wektorów. Aby potrzebne dane znalazły się w rejestrach wewnętrznych 
procesora trzeba odczekać dodatkowo 4 cykle zegarowe. Wtedy można przemnożyć składowe. 
Na wynik trzeba poczekać dodatkowo przez jeden takt zegarowy. Dalej następuje akumulacja 
wyniku mnożenia w rejestrze A7, dekrementacja licznika pętli zawartego w rejestrze A1 i skok 
warunkowy na początek pętli. Nim jednak skok zostanie wykonany upłynie pięć taktów 
zegarowych, które procesor spędzi na wykonywaniu instrukcji NOP. W ten sposób każdy 
przebieg pętli wymaga szesnastu taktów zegarowych. Dla wektorów o stu składowych daje to 
razem z dwiema początkowymi instrukcjami programu 1602 cykle zegarowe. 
 

Tablica 11. Obliczanie iloczynu skalarnego – przetwarzanie szeregowe 


;  Liczba cykli = 16*N+2; N=100 => Liczba cykli = 1602 

 
     MVK  .S1 100, A1           ; A1 <- N == liczba iteracji 
     ZERO .L1 A7                ; A7 <- 0  
LOOP: 
     LDH  .D1 *A4++,A2          ; A2 <- [A4] == a[i] ; A4 <- A4 + 2 
     LDH  .D1 *A3++,A5 ;        ; A5 <- [A5] == b[i] ; A5 <- A5 + 2 

     NOP   4                    ; trwa ładowanie!

 

     MPY  .M1 A2,A5,A6          ; A6 <- a[i] * b[i] 

     NOP                        ; trwa mnożenie!

 

     ADD  .L1 A6,A7,A7          ; A7 <- A7 + a[i] * b[i] 
     SUB  .S1 A1,1,A1           ; A1 <- A1 – 1 

[A1] B    .S2 LOOP              ; jeżli to nie koniec to skok

 

     NOP 5         

             ; wyczyść potok

 

     ; teraz skok 

 

 
  Czas wykonywania przedstawionego programu można istotnie zmniejszyć uwzględniając 
możliwości przetwarzania równoległego jakie stwarza procesor TMS320C6201 oraz 
uwzględniając opóźnienie z jakim realizowana jest instrukcja skoku. Przykład ulepszonego 
programu przedstawia tablica 12. Składowe obu wektorów ładowane są jednocześnie parami — 
składowa o indeksie parzystym + składowa o indeksie nieparzystym — z wykorzystaniem 
instrukcji  ładowania słowa 32-bitowego LDW. Zmniejsza to liczbę instrukcji w pętli o jeden. 
Składowe o parzystych indeksach przetwarzane są przez pierwszą grupę jednostek 

                                                            

38 Zauważmy od razu, że obliczanie iloczynu skalarnego jest bardzo zbliżone do 

obliczania odpowiedzi filtru FIR. 

background image

 36

wykonawczych, a składowe o nieparzystych indeksach przez grupę drugą. Zmniejsza to liczbę 
przebiegów pętli o połowę. Liczba instrukcji w pętli uległa zmniejszeniu także ponieważ zamiast 
bezczynnie oczekiwać na załadowanie składowych mnożonych wektorów dokonano 
dekrementacji licznika pętli i zainicjowano wykonanie instrukcji skoku. W ten sposób 
zaoszczędzono dalszych 7 instrukcji NOP. W sumie daje to pętlę złożoną z ośmiu instrukcji. Dla 
przemnożenia dwóch wektorów o stu składowych potrzeba 402 taktów zegarowych39 — prawie 
cztery razy mniej niż w poprzednim programie. 
 

Tablica 12. Obliczanie iloczynu skalarnego – przetwarzanie równoległe 


;  Liczba cykli = 4*N+2; N=100 => Liczba cykli = 402 

 
     MVK  .S1 50,A1       ; A1 <- 50 == N/2 
||   ZERO .L1 A7          ; A7 <- 0 
||   ZERO .L2 B7          ; B7 <- 0  
LOOP: 
     LDW  .D1 *A4++,A2    ; A2 <- a[i] a[i+1] ; A4 <- A4 + 4 
||   LDW  .D2 *B4++,B2    ; B2 <- b[i] b[i+1] ; B4 <- B4 + 4 
     SUB  .S1 A1,1,A1     ; A1 <- A1 - 1  

[A1] B    .S2 LOOP        ; jeżli to nie koniec to skocz

 

     NOP   2              ; trwa ładowanie składowych !

 

     MPY  .M1X A2,B2,A6   ; A6 <- a[i] * b[i] 
||   MPYH .M2X A2,B2,B6   ; B6 <- a[i+1] * b[i+1] 

     NOP                  ; trwa mnożenie

 

     ADD  .L1 A6,A7,A7    ; A7 <- A7 + A6 
||   ADD  .L2 B6,B7,B7    ; B7 <- B7 + B6 

; tu następuje skok

 

     ADD .L1X A7,B7,A4    ; iloczyn skalarny = A4 <- A7 + B7  

 

 
  Program przedstawiony w tablicy 12 podczas jednego przebiegu pętli dokonuje równolegle 
mnożenia składowych wektorów dla dwóch kolejnych indeksów oraz akumulacji wyników. 
Zauważmy, że każda instrukcja pętli wykonywana jest przez inną jednostkę wykonawczą. Można 
zatem wszystkie instrukcje wykonać jednocześnie łącząc je w jeden łańcuch (execute packet). W 
tym przypadku ze względu na zależności między argumentami poszczególnych instrukcji 
realizowane będą elementy kilku pętli jednocześnie. Odpowiedni program pokazany jest w 
tablicy 13. W chwili gdy wykonywany jest n-ty raz łańcuch instrukcji wskazywany przez etykietę 
LOOP realizowana jest: 

!"

Akumulacja iloczynu składowych o indeksie 2n-12 oraz 2n-11. 

!"

Mnożenie składowych o indeksie 2n-10 a[2n-10]·b[2n-10] oraz składowych o indeksie 
2n-9 a[2n-9]·b[2n-9]

!"

Dekrementacja licznika pętli oraz skok do etykiety LOOP. 

!"

Ładowanie dwóch kolejnych składowych pierwszego wektora tzn. składowej o indeksie 
2n — a[2n] — oraz składowej o indeksie 2n++1 — a[2n+1]

!"

Ładowanie dwóch kolejnych składowych drugiego wektora tzn. składowej o indeksie 2n 
— b[2n] — oraz składowej o indeksie 2n+1 — b[2n+1]

Licznik pętli dekrementowany jest od wartości N/2+1 (N — liczba składowych mnożonych 
wektorów) do wartości 0. W tym momencie przestaje być wywoływana pętla LOOP natomiast 

                                                            

39 Z uwzględnieniem inicjacji pętli i końcowej akumulacji. 

background image

 37

akumulatory zawierają już iloczyny składowych o indeksie N-12 oraz N-11. Pętla LOOP jest 
jednak wykonana dalej dopóki, dopóty tworzące ją instrukcje znajdują się w potoku. Oznacza to 
że pętla zostanie wykonana jeszcze pięć razy tak, aby ostatecznie dokonać akumulacji iloczynów 
składowych o indeksach N-2 i N-1. Jeżeli uwzględnimy instrukcje zaczynające program, których 
zadaniem jest zerowanie zmiennych oraz wypełnienie potoku instrukcji kopiami pętli LOOP, 
oraz ostatnią instrukcję obliczającą iloczyn skalarny to dla przemnożenia dwóch wektorów o stu 
składowych każdy potrzeba zaledwie 57 taktów zegarowych. Siedem razy mniej niż w przypadku 
przetwarzania równoległego i 28 razy mniej niż w przypadku przetwarzania szeregowego. Jednak 
nie ma róży bez kolców — tak ciasna pętla programowa nie może zostać przerwana w celu 
obsłużenia przerwania40. 
 

Tablica 13. Obliczanie iloczynu skalarnego – programowe zakładkowanie 


;  Liczba cykli = N/2+7; N=100 => Liczba cykli = 57 

       B    .S2 LOOP          ; skok do pętli 

 

||     MVK  .S1 51,A1         ; A1 <- N/2 + 1 == 51 

       B    .S2 LOOP          ; skok do pętli

 

       B    .S2 LOOP          ; skok do pętli

 

||     ZERO .L1 A7            ; suma0 == A7 <- 0  
||     ZERO .L2 B7            ; suma1 == B7 <- 0 

       B    .S2 LOOP          ; skok do pętli

 

||     ZERO .L1 A6            ; wynik_mnożenia0 == A6 <

- 0 

||     ZERO .L2 B6            ; wynik_mnożenia1 == B6 <

- 0 

       B    .S2 LOOP          ; skok do pętli

 

|| 

    ZERO .L1 A2            ; mnożna  == A2  <

- 0  

||     ZERO .L2 B2            ; mnożnik == B2  <

- 0  

LOOP: 
       ADD  .L1 A6,A7,A7      ; sum0 += a[2n-12] * b[2n-12] 
||     ADD  .L2 B6,B7,B7      ; sum1 += a[2n-11] * b[2n-11] 
||     MPY  .M1X A2,B2,A6     ; a[2n-10] * b[2n-10] 
||     MPYH .M2X A2,B2,B6     ; a[2n-9] * b[2n-9] 
||[A1] ADD  .S1 -

1,A1,A1      ; dekrementuj licznik pętli

 

||[A1] B    .S2 LOOP          ; skok do pętli

 

||     LDW  .D1 *A4++,A2      ; ładuj a[2n] & a[2n+1] z pamięci

 

||     LDW  .

D2 *B4++,B2      ; ładuj b[2n] & b[2n+1] z pamięci

 

; tu następuje skok 

 

       ADD .L1X A7,B7,A4      ; iloczyn_skalarny = suma0 + suma1 

 

 
 

7. Supermikrokontroler — projekt TriCore 

Współczesna technologia elektronowa coraz częściej daje możliwość konstrukcji całych urządzeń 
cyfrowych w postaci pojedynczej struktury scalonej. Układ taki składa się zazwyczaj z: 

!"

Szybkiego 32-bitowego mikrokontrolera konstrukcyjnie przystosowanego do 
przetwarzania liczb z szybkością porównywalną z szybkością procesora sygnałowego. 

!"

Najróżniejszych pamięci półprzewodnikowych np. DRAM, SRAM, ROM, flash itp. 

!"

Układów logicznych charakterystycznych dla danej aplikacji (ang. ASIC — application 
specific integrated circuit). 

                                                            

40 Istnieje jeszcze jeden mankament — realizując algorytm sięgamy w pamięci poza 

tablicę a[i] oraz poza tablicę b[i]. 

background image

 38

Konfiguracja taka pozwala na programową realizację wielu zadań, które dotychczas 
wykonywano sprzętowo, a to: 

!"

Na ogół zmniejsza koszt projektu ponieważ można wykorzystać go w całości lub w części 
w innych projektach. 

!"

Pozwala na eliminację ewentualnych błędów poprzez wymianę oprogramowania nawet 
jeżeli urządzenie jest już u klienta. 

!"

Daje klientowi możliwość instalacji nowej wersji oprogramowania o udoskonalonych 
własnościach użytkowych. 

Np. w przypadku cyfrowego telefonu komórkowego całość przetwarzania cyfrowego może być 
realizowana przez jeden układ. W typowej obecnie konstrukcji, tak jak ilustruje to rysunek 1, 
stosowane są przynajmniej dwa układy. Procesor sygnałowy zaangażowany jest w celu kompresji 
i dekompresji sygnału mowy, kodowania i dekodowania danych cyfrowych, realizacji modulacji i 
demodulacji w paśmie podstawowym. Jednym słowem realizuje protokoły transmisji leżące w 
warstwie fizycznej modelu ISO/OSI. Natomiast mikrokontroler realizuje protokoły transmisji 
należące do warstwy połączeniowej oraz obsługuje interfejs użytkownika [13]. Te same zadania 
może realizować jeden szybki, 32-bitowy mikrokontroler o charakterystyce zbliżonej do 
charakterystyki procesora sygnałowego [11]. Przykładem takiego układu jest procesor TC-1 — 

Pamięć programu

Pamięć notatnikowa

Pamięć kontekstu

Pamięć podręczna

Pobranie instrukcji

64 bit = 2 do 4 instrukcji

Arytmometr dla

obliczania

adresów

Generator

adresów

Rejestry

adresowe

Jednostka centralna Koprocesor

ALU

MAC

64 bit

64 bit

32 bit

Pamięć danych

Pamięć programu

Wymiana danych

Pamięć podręczna

Pamięć notatnikowa

32 bit

32 bit

32 bit

16 bit

8 bit

32 bit

Emulator

System przerwań

Procesor we/wy A

Procesor we/wy B

Procesor we/wy C

Moduł PCP

M

A

G

I

S

T

R

A

L

A

JTAG

Rejestry

danych

Sterowanie

Rejestry

systemowe

Operacje

na bitach

Rysunek 6. Schemat blokowy procesora TC-1

background image

 39

pierwszy z rodziny układów o architekturze TriCore opracowanej przez firmę Siemens 
Microelectronics Inc.41 Cechy charakterystyczne tego układu to: 

!"

Architektura będąca hybrydą mikrokontrolera i stałoprzecinkowego procesora 
sygnałowego. 

!"

Szybkie przełączanie zadań. Procesor TC-1 może przejść od realizacji zadania 
charakterystycznego dla mikrokontrolera do zadania charakterystycznego dla procesora 
sygnałowego w czasie zaledwie dwóch cykli zegarowych! 

!"

Możliwość integracji razem z pamięcią półprzewodnikową o dużej pojemności co 
podnosi wydajność systemu, jego niezawodność oraz zmniejsza zużycie energii42. 

!"

Możliwość dołączania zewnętrznych urządzeń peryferyjnych praktycznie bez 
pośredniczących układów logicznych. 

!"

Lista instrukcji zakodowana w postaci słów 16-bitowych i 32-bitowych tak, aby typowe 
programy były możliwie małe. 

Lista instrukcji oraz architektura procesora zbliżona jest do architektury typu RISC (ang. reduced 
instuction set procesor) co pozwala na konstrukcję efektywnych kompilatorów języka C/C++. 
 
7.1 Jednostka centralna procesora TC-1 
Schemat blokowy procesora TC-1 przedstawiony jest na rysunku 6. Jest to procesor o 
architekturze Harvard z magistralą danych rozdzieloną od magistrali programu. Procesor jest 
układem superskalarnym zawierającym trzy jednostki wykonawcze: 

!"

Jednostka stałoprzecinkowa. Przetwarza potokowo, w czterech etapach, instrukcje 
arytmetyczno-logiczne. Przetwarzanie odbywa się z wykorzystaniem dwóch 16-bitowych 
układów mnożących i jednostki arytmetyczno-logicznej. W potoku tym w jednym takcie 
zegarowym można wykonać dwa mnożenia połączone z akumulacją. Jednostka dysponuje 
interfejsem do zewnętrznego układu koprocesora, który może wykonywać np. operacje na 
liczbach zmiennoprzecinkowych. 

!"

Jednostka realizująca operacje ładowania z pamięci LD i składowania w pamięci ST. 
Wszystkie instrukcje arytmetyczne i logiczne używają w charakterze argumentów 
rejestrów wewnętrznych procesora. Dane z oraz do pamięci przenoszone są przez parę 
instrukcji LD/ST przetwarzanych w osobnym, czteroetapowym potoku.  

!"

Jednostka realizująca rozkazy skoku. Przetwarza rozkazy potokowo w dwóch etapach. 

W ten sposób w każdym cyklu zegarowym może kończyć się realizacja nawet trzech instrukcji. 
W praktyce procesor taktowany zegarem 100 MHz ma wydajność 130 MIPS [21]. 
  Procesor TC-1 posiada trzydzieścidwa 32-bitowe rejestry wewnętrzne. Szesnaście z nich 
A0-A15 przeznaczonych jest do adresowania. Pozostałe szesnaście rejestrów D0-D15 to rejestry 
danych. Niektóre z tych rejestrów są wyróżnione. Np. D15 jest domyślnym rejestrem danych, 
natomiast rejestr A10 to wskaźnik stosu. Poza tym procesor zawiera trzy 32-bitowe rejestry 
systemowe: PC — licznik rozkazów oraz PCXI, PSW — przechowujące dane dotyczące stanu 
wewnętrznego procesora. Rejestry procesora TC-1 pokazane są na rysunku 7. 
  W zasadzie wszystkie instrukcje procesora TC-1 są instrukcjami 32-bitowymi. Jednak te, 
które są  używane najczęściej mają swoje wersje 16-bitowe co pozwala na zmniejszenie 

                                                            

41 Od 1 kwietnia firma Siemens SMI jest wydzielona z koncernu Siemens i nosi nazwę 

Infineon Inc. 

42 Oczywiście w stosunku do systemu którego pamięć umieszczona została w innym 

układzie scalonym. 

background image

 40

rozmiarów typowych programów oraz podnosi szybkość przetwarzania — w jednym cyklu 
pobiera się i kieruje do przetwarzania cztery zamiast dwóch instrukcji. Krótkie instrukcje: 

!"

Są instrukcjami dwuargumentowymi a nie trójargumentowymi, tak jak ich 32-bitowe 
odpowiedniki. 

!"

Często stosują argumenty domyślne — rejestry adresowe i rejestr danych. 

!"

Ich argumenty natychmiastowe oraz adresy względne są krótkie. 

Zestaw instrukcji obejmuje: 

!"

Instrukcje  ładowania i składowania — jedyne instrukcje dokonujące wymiany danych 
między procesorem a pamięcią operacyjną. 

!"

Instrukcje arytmetyczno-logiczne: 

⇒ 

Przesłania między rejestrami. 

⇒ 

Dodawanie i odejmowanie liczb stałoprzecinkowych ze znakiem lub bez. Istnieje osobny 
zbiór instrukcji realizujących dodawanie z nasyceniem gdy wynik przekroczy największą 
(najmniejszą) liczbę którą można zapisać w danym formacie. 

⇒ 

Mnożenie dwóch 32-bitowych liczb stałoprzecinkowych połączone z dodawaniem 
(akumulacją). Mnożone liczby mogą być liczbami ułamkowym w formacie 1.31 lub 
liczbami całkowitymi. 

⇒ 

Instrukcje wspomagające programową realizację dzielenia liczb stałoprzecinkowych. 

⇒ 

Obliczanie wartości bezwzględnej, wartości bezwzględnej z różnicy, wybieranie 
większego lub mniejszego argumentu. 

Rysunek 7. Rejestry procesora TC-1

background image

 41

⇒ 

Warunkowe instrukcje dodawania i odejmowania. Realizacja instrukcji uzależniona jest od 
wartości jednego z argumentów (rejestru). Jeżeli jest różny od zera instrukcja jest 
wykonywana. W przeciwnym wypadku procesor pomija ją. 

⇒ 

Instrukcje logiczne realizujące operacje na każdej parze odpowiadających sobie bitów 
argumentów: AND, OR, XOR, NAND, NOR, XNOR. Dwie instrukcje dokonują 
dodatkowo negacji jednego z argumentów ANDN i ORN. 

⇒ 

Instrukcje zliczające nadmiarowe bity znaku, początkowe zera oraz początkowe jedynki. 

⇒ 

Przesunięcia arytmetyczne w lewo i w prawo o dowolną liczbę bitów. 

⇒ 

Ekstrakcja dowolnego pola bitowego argumentu. 

!"

Instrukcje arytmetyczne realizujące operacje na spakowanych argumentach. Każdy z 
trzydziestodwubitowych rejestrów-argumentów przechowuje dwa argumenty 16-bitowe 
lub cztery argumenty 8-bitowe. Operacja arytmetyczna (dodawanie, odejmowanie, 
mnożenie, obliczanie wartości bezwzględnej) realizowana jest dla odpowiadających sobie 
argumentów 16-bitowych lub 8-bitowych. W ten sposób procesor realizuje elementy 
przetwarzania wektorowego (ang. SIMD — single instruction multiple data). W 
przypadku cyfrowego przetwarzania sygnału akustycznego 16-bitowa reprezentacja liczb 
jest na ogół wystarczająca, natomiast w przypadku obrazów wystarcza nawet 
reprezentacja 8-bitowa. 

!"

Instrukcje porównania — wynik porównania umieszczony jest w rejestrze ogólnego 
przeznaczenia przy czym zero oznacza fałsz natomiast wartość różna od zera oznacza 
prawdę. 

!"

Operacje logiczne wykonywane na pojedynczych bitach argumentów. 

!"

Operacje arytmetyczne i operacje porównania wykonywane na rejestrach adresowych. 
Pozwalają na programową realizację trybów adresowania, które nie są wspomagane 
bezpośrednio przez procesor. 

!"

Skoki warunkowe i bezwarunkowe. Wykonanie instrukcji warunkowej uzależnione jest 
od zawartości rejestru ogólnego przeznaczenia przy czym zero oznacza fałsz a wartość 
różna od zera prawdę. 

!"

Instrukcje systemowe pozwalające na manipulacje zawartością rejestrów sterujących 
pracą procesora. 

 
7.2 Pamięć oraz tryby adresowania 
Najmniejszym adresowanym przez procesor TC-1 elementem danych jest jeden bajt. Ponieważ 
adresy są 32-bitowe daje to przestrzeń adresową o pojemności 4 Gbajty. Jest to wspólna 
przestrzeń danych, programu43 oraz urządzeń peryferyjnych. Przestrzeń adresowa podzielona 
jest na szesnaście 256 Kbajtowych segmentów o numerach od 0 do 15. Numer segmentu tworzą 
cztery najstarsze bity adresu. Pierwsze 16 Kbajtów każdego segmentu można zaadresować w 
trybie adresowania bezpośredniego [21]. Ostatnie dwa segmenty (o numerze 14 i 15) 
przeznaczone są dla urządzeń peryferyjnych. 
  Procesor oprócz bajtów może adresować słowa 16-, 32- i 64-bitowe. Dostępnych jest przy tym 
siedem trybów adresowania. Tryby adresowania procesora TC-1 zostały zebrane w tablicy 14. 
Oprócz adresowania bezpośredniego dostępne są różne warianty adresowania pośredniego przez 
rejestr. Mnogość trybów adresowania ułatwia konstrukcję kompilatora języka C/C++ oraz 

                                                            

43 Mimo, że magistrala programu i magistrala danych są rozdzielone. 

background image

 42

pozwala na łatwy dostęp do typowych struktur danych tzn. tablic, stosów, buforów cyklicznych 
itp. 
 

Tablica 14. Tryby adresowania procesora TC-1 

Tryb adresowania 

Argumenty 

Poślizg 

(l. Bitów) 

Bezpośrednie 

 adres 18 bitowy 

Pośrednie przez rejestr 

rejestr bazowy + poślizg 10 

16 

pośrednie przez rejestr z preinkrementacją 

rejestr bazowy + poślizg 10 

Pośrednie przez rejestr z postinkrementacją 

rejestr bazowy + poślizg 10 

Adresowanie pośrednie cykliczne 

dwa rejestry adresowe  

10 

adresowanie pośrednie z odwróceniem bitów 

dwa rejestry adresowe  

 
 
7.3 Zadania i konteksty 
Procesor TC-1 wspomaga sprzętowo szybkie przełączanie zadań i wymianę kontekstu. Przez 
kontekst rozumie się zawartość wszystkich rejestrów procesora niezbędnych dla wznowienia 
wykonywania zadania. Procesor dzieli kontekst na „górny” (ang. upper) oraz „dolny” (ang. 
lower). Kontekst górny tworzą rejestry systemowe PCXI, PSW, rejestry danych D8-D15 oraz 
rejestry adresowe A10-A15. Kontekst dolny tworzy licznik rozkazów PC, rejestry danych D0-D7 
oraz rejestry adresowe A2-A7. Rejestry adresowe A0, A1, A8 i A9 mają znaczenie globalne i nie 
należą do kontekstu żadnego zadania. Procesor przechowuje w pamięci operacyjnej połączoną 
listę obszarów CSW (ang. context switch area). Każdy z tych obszarów składa się z szesnastu 
32-bitowych słów, które przechowują dokładnie jeden kontekst górny lub jeden kontekst dolny. 
Dzięki specjalnej magistrali łączącej procesor oraz zintegrowaną z nim pamięć czas przesłania 
kontekstu do pamięci wynosi zaledwie dwa takty zegarowe [21]. Wymiana kontekstu następuje w 
przypadku obsługi przerwania oraz wywołania podprogramu. 
 
 7.4 System przerwań 
System przerwań procesora TC-1 jest bardzo rozbudowany. Składają się nań liczne moduły SRN 
(ang. service request node). Każdemu przerwaniu, poprzez programowanie odpowiadającego mu 
modułu SNR, nadaje się  właściwy priorytet44. Procesor dopuszcza bowiem zagnieżdżanie 
przerwań. Tylko przerwanie o wyższym priorytecie może przerwać realizację procedury obsługi 
przerwania o niższym priorytecie. Procedury obsługi przerwań identyfikowane są według 
priorytetu tzn. wszystkie przerwania o tym samym priorytecie obsługiwane są przez tę samą 
procedurę. Tablica wektorów przerwań zawiera kolejno procedury obsługi przerwań o coraz 
wyższym priorytecie. Każda taka procedura składa się z ośmiu instrukcji. Jeżeli to nie wystarcza 
trzeba wykonać skok do właściwej procedury obsługi przerwania leżącej poza tablicą wektorów 
przerwań. Wyboru zgłoszenia przerwania o najwyższym priorytecie dokonuje moduł ICU (ang. 

                                                            

44 Możliwe jest także określenie, czy przerwanie będzie obsługiwane przez jednostkę 

centralną czy też przez procesor peryferyjny (PCP). 

background image

 43

Rysunek 8. Obsługa przerwań przez procesor TC-1

Zadanie A

Zadanie A

Procedura obsługi

przerwania

Przerwanie

Zachowaj

górny kontekst A

Ładuj

górny kontekst A

A) Nieskomplikowana procedura
obsługi przerwania

Czas

Zadanie A

Zadanie A

Procedura obsługi

przerwania

Przerwanie

Zachowaj

górny kontekst A
dolny kontekst A

Ładuj

górny kontekst A
dolny kontekst A

B) Przerwanie - przypadek
ogólny

Czas

Zadanie A

Zadanie A

Procedura obsługi

przerwania

Przerwanie

Zachowaj

górny kontekst A

dolny kontekst A

Ładuj

górny kontekst A

dolny kontekst A

C) Przerwanie z wymianą
kontekstu

Czas

Zachowaj

górny kontekst A

dolny kontekst A

Ładuj

górny kontekst A
dolny kontekst A

interrupt control unit) a następnie zgłasza je do procesora w celu uruchomienia właściwej 
procedury obsługi przerwania. Procesor podejmuje wtedy następujące działania45: 

!"

Zachowuje w pamięci górny kontekst. 

!"

Blokuje system przerwań. 

!"

Zapamiętuje priorytet obsługiwanego przerwania (priorytet przerwania staje się 
priorytetem jednostki centralnej). 

!"

Inicjuje system ochrony pamięci i urządzeń peryferyjnych. 

!"

Sięga do tablicy wektorów przerwań po pierwszą instrukcję procedury obsługi 
przerwania. 

Rysunek 8 pokazuje trzy możliwe scenariusze jakie może realizować procedura obsługi 
przerwania. W najprostszym przypadku wystarcza jej dla realizacji swojego zadania korzystanie 
z rejestrów automatycznie zachowanego kontekstu górnego — rysunek 8a. W ogólnym 
przypadku procedura obsługi przerwania musi zachować także dolny kontekst — rysunek 8b. 

                                                            

45 O ile np. system przerwań procesora nie jest zablokowany. 

background image

 44

Przerwanie może także powodować wznowienie wykonywania wcześniej rozpoczętego zadania 
B — rysunek 8c. Wymaga to na początku sprowadzenia zachowanego w pamięci kontekstu 
zadania B, a przed zarzuceniem jego dalszego wykonywania kontekst zadania B musi być 
zachowany w pamięci. 
 
7.5 Ochrona pamięci oraz urządzeń peryferyjnych [22] 
Kiedy system ochrony pamięci procesora TC-1 jest uaktywniony, sprawdza „legalność” każdego 
dostępu do pamięci systemu. Dotyczy to tak zapisu jak i odczytu oraz pobrania instrukcji. System 
ten zbudowany jest w oparciu o zbiór rejestrów wyznaczających granice obszarów chronionych. 
Dla każdego obszaru chronionego określony jest typ dopuszczalnych operacji. Istnieje zawsze 
kilka (od dwóch do czterech) takich zbiorów, przechowywanych w obszarze CSFR (ang. core 
special function registers). Każdy ze zbiorów rejestrów ochrony związany jest z jednym z 
wykonywanych zadań. System ochrony pozwala „przetrwać” kluczowym dla urządzenia 
zadaniom systemowym mimo błędnego działania innych mniej istotnych zadań.  
 System 

ochrony 

pamięci chroni także urządzenia peryferyjne — przestrzeń adresowa urządzeń 

peryferyjnych zajmuje dwa ostatnie segmenty przestrzeni adresowej danych. Dla każdego 
zadania określony jest stopień uprzywilejowania w stosunku do urządzeń peryferyjnych: 

!"

User-0 Mode: zadanie nie ma prawa dostępu do urządzeń peryferyjnych. 

!"

User-1 Mode: zadanie ma dostęp do wspólnych urządzeń nie objętych ochroną. 

!"

Supervisor Mode: zadanie ma dostęp do wszystkich zasobów systemu oraz do wszystkich 
rejestrów systemowych. 

 
7.6 Magistrala FPI 
Jednostka centralna procesora TC-1 łączy się z urządzeniami peryferyjnymi umieszczonymi na 
tym samym chipie za pośrednictwem magistrali FPI (ang. flexible peripherial bus). Jest to to 
uniwersalna magistrala z 32 liniami adresowymi i 64 liniami danych. Taktowana zegarem 
100 MHz może przesyłać do 800 MB/s. Magistralę FPI charakteryzuje ponadto: 

!"

Możliwość koegzystencji do 16 urządzeń-nadzorców magistrali (ang. master). 

!"

Praca synchroniczna. 

!"

Możliwość transmisji słów 8-, 16-, 32- i 64-bitowych. 

!"

Realizacja pojedynczych przesłań oraz przesłań blokowych. 

Urządzenia dołączane do magistrali FPI mogą aktywnie uczestniczyć w realizacji protokołu 
transmisji (ang. master) lub być urządzeniami pasywnymi (ang. slave), których rejestry są 
zapisywane lub odczytywane przez urządzenia aktywne. 
 
7.7 Procesor peryferyjny (PCP) 
Procesor peryferyjny (ang. PCP — peripherial control processor module) przeznaczony jest dla 
obsługi urządzeń zewnętrznych zaimplementowanych poza układem procesora. Jego zadaniem 
jest nadzorowanie transmisji danych od i do obsługiwanych urządzeń. Układ może obsługiwać do 
255 kanałów logicznych na zasadzie obsługi  żądania przerwania. Obsługiwanych może być 
nawet 64 urządzeń zewnętrznych [21] bez konieczności przerywania pracy właściwej jednostki 
centralnej. Procesor PCP może przy tym wykonywać następujące zadania: 

!"

Przenosić dane z jednego obszaru pamięci do drugiego lub pomiędzy pamięcią a 
urządzeniem zewnętrznym. 

!"

Przenosić dane pomiędzy pamięcią wewnętrzną procesora PCP i urządzeniem 
zewnętrznym. 

background image

 45

!"

Czytać dane, modyfikować wykonując na nich operacje arytmetyczne lub logiczne i 
zapisywać wynik z powrotem. 

!"

Przenosić dane z jednego miejsca na drugie aż do napotkania wśród przenoszonych 
danych określonej wartości. 

!"

Czytać dane, badać ich wartość i podejmować na tej podstawie stosowne działania. 

!"

Czytać dane i dokonywać ich akumulacji. 

W ten sposób procesor PCP może wykonywać zadania, które w przeciwnym razie musiały by 
zostać wykonane przez jednostkę centralną. Np. procesor peryferyjny może: 

!"

Załadować do rejestru urządzenia zewnętrznego stałą w celu inicjalizacji timera. 

!"

Zmodyfikować pojedynczy bit lub pole bitowe w rejestrze urządzenia zewnętrznego w 
celu uruchomienia przetwarzania analogowo/cyfrowego. 

!"

Uśredniać wyniki pomiarów okresu przebiegu. 

Procesor PCP posiada swój własny układ arbitrażowy, który wybiera spośród wszystkich 
zgłoszeń to o najwyższym priorytecie i inicjuje jego obsługę. Programy realizowane przez 
procesor PCP mogą być przechowywane w jego własnej pamięci wewnętrznej lub w pamięci 
danych i wtedy są mu udostępniane za pośrednictwem magistrali FPI.  
 
7.8 Emulator sprzętowy 
Procesor TC-1 wyposażony jest w emulator sprzętowy dołączony do systemu za pośrednictwem 
magistrali FPI. Emulator wspomaga następujące zadania: 

!"

Zakładanie pułapek sprzętowych podczas uruchamiania programów. 

!"

Śledzenie zawartości rejestrów procesora oraz pamięci w czasie rzeczywistym. 

!"

Śledzenie działania urządzeń peryferyjnych. 

 

8. Podsumowanie 

Architektura wszystkich typów procesorów wydaje się coraz bardziej ujednolicać. Procesory 
sygnałowe przejmują funkcje mikrokontrolerów, mikroprocesory ogólnego przeznaczenia 
specjalizują się w wykonywaniu algorytmów cyfrowego przetwarzania sygnałów, 
mikrokontrolery przygotowywane są do pracy pod kontrolą wielozadaniowego systemu 
operacyjnego np. Windows CE oraz do przetwarzania sygnałów. Być może niedługo hasło jeden 
miliard tranzystorów, jeden procesor, jeden chip (i jeden system operacyjny — Bill Gates) w 
każdym żyrandolu stanie się rzeczywistością [17]. 
 

Literatura 

[1] 

Andrew S. Tanenbaum: Organizacja maszyn cyfrowych w ujęciu strukturalnym, WNT, 
Warszawa 1980 

[2] M. 

Morris 

Mano, 

Architektura komputerów, WNT, Warszawa 1988 

[3] Bolesław Pochopień,  Arytmetyka systemów cyfrowych, Skrypt Pol. Śl. Nr 1548, 

Gliwice 1990  

[4] Stefan 

Węgrzyn:  Systemy sterowane przepływem operacji i systemy sterowane 

przepływem argumentów, Zeszyty Naukowe Pol. Śl., Seria: Informatyka, Z.24, Gliwice 
1993, ss.9-19 

[5] Stefan 

Węgrzyn:  Przyspieszenie realizacji algorytmów w systemach sterowanych 

przepływem argumentów, Zeszyty Naukowe Pol. Śl., Seria: Informatyka, Z.28, Gliwice 
1994, ss.67-75 

[6] 

http://www.ti.com/sc/docs/integrat/97dec/dspfirst.html

 

background image

 46

[7] Texas 

Instruments, 

TMS320C1x/2x/2xx/5x Assembly Language Tools, Users Guide, 1995 

(SPRU018D) 

[8] Texas 

Instruments, 

TMS320C5x Users Guide, 1996 (SPRU056C) 

[9] Nat 

Seshan, 

High VelociTI Processing, IEEE Signal Processing Magazine, Vol. 15, No 2, 

marzec 1998, ss.86-101 

[10] Tsuhan Chen [ed.], VLSI Design and Implementation Fuels Signal-Processing 

Revolution, IEEE Signal Processing Magazine, Vol. 15, No 1, styczeń 1998, ss.22-37 

[11] Manfred 

Schlett, 

Trends in Embedded-Microprocesor Design, Computer, Vol 31, No 8, 

sierpień 1998, ss.44-49 

[12] Carole 

Dulong, 

The IA-64 Architecture at Work, Computer, Vol 31, No 7, lipiec 1998, 

ss.24-32 

[13]  Jennifer Eyre, Jeff Bier, DSP Processors Hit the Mainstream, Computer, Vol 31, No 8, 

sierpień 1998, ss.51-59 

[14] Texas 

Instruments, 

TMS320C62xx CPU and Instruction Set Reference Guide, styczeń 

1997 (SPRU189A) 

[15] Doug 

Matzke, 

Will Physical Scalability Sabotage Performance Gains?, Computer, Vol 

30, No 9, wrzesień 1997, ss.37-39 

[16]  Keith Diefendorff, Pradeep K. Dubey: How Multimedia Workloads Will Change 

Processor Design, Computer, Vol 30, No 9, wrzesień 1997, ss.43-45 

[17]  Yale N. Patt, Marius Evers, Daniel H. Friendly, Jared Stark: One Billion Transistors, One 

Uniprocessor, One Chip, Computer, Vol 30, No 9, wrzesień 1997, ss.51-57 

[18] Texas Instruments, TMS320C62xx Peripherals Reference Guide, styczeń 1997, 

(SPRU190)  

[19] Texas 

Instruments, 

TMS320C62xx Programmer’s Guide, styczeń 1997, (SPRU198) 

[20] Texas 

Instruments, 

TMS320C6x Optimizing C Compiler User’s Guide, styczeń 1997, 

(SPRU187A) 

[21] Siemens 

A.G., 

TriCore Architecture Overview Handbook, 22 luty 1999 

[22] Siemens 

A.G., 

TriCore Architecture Manual, 14 grudzień 1998 

[23] Intel, 

Using MMX* Technology Instructions to Compute a 16-Bit FIR Filter, Application 

Note AP-559

http://developer.intel.com/drg/mmx/AppNotes/AP559.htm

 

[24] Intel, 

MMX Technology Technical Overview

http://developer.intel.com/drg/mmx/Manuals/overview/index.htm

 

[25] Jeff 

Stevens: 

DSPs in Communications, IEEE Spectrum, wrzesień 1998, ss.39-46 

[26]  Christopher Inacio, Denise Ombres: The DSP Decision: Fixed Point or Floating?, IEEE 

Spectrum, wrzesień 1996, ss.72-74 

[27]  Edward A.Lee, David G.Messerschmitt, Digital Communication, Kluwer Academic 

Publishers, 1994 

[28] John 

G.Proakis: Digital Communications, McGraw Hill, 1995 

[29]  Ian Glover, Peter Grant: Digital Communications, Prentice Hall Inc., 1998 
[30]  Jacek Izydorczyk, Grzegorz Płonka, Grzegorz Tyma: Teoria sygnałów, wstęp

Wydawnictwo Helion, Gliwice 1999 

[31] Analog 

Devices: 

ASDP-2100 Family User’s Manual, 1995  

[32] ZSP 

Corporation: The ZSP16401 Digital Signal Processor, Product Note v0.6, 27 marzec 

1998 

[33] Grzegorz 

Płonka, Grzegorz Tyma: Laboratorium Cyfrowego Przetwarzania Sygnałów 

Instytutu Elektroniki Politechniki Śląskiej, Przegląd Telekomunikacyjny + Wiadomości 
Telekomunikacyjne, nr 10, 1996 

background image

 47

[34] Analog 

Devices: 

ADSP-21160 Technical Specifivation, Rev 3.0, 24 luty 1999 

[35] Intel: 

P6 Family of Processors Hardware Developer’s Manual, wrzesień 1998 

[36] 

http://www.cyrix.com/html/products/mii/index.htm

 

[37]  Advanced Micro Devices: AMD-K6 Data Sheet, 1998