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
2
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.
3
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):
4
!"
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.
5
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ć.
6
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.
7
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.
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
2
64K
5
50/35/25
132 pin BQFP
'LC50
PQ
1056
9K
2K
2
64K
3.3
50/40/25
132 pin BQFP
'C51
PQ
1056
1K
8K
2
64K
5
50/35/25/20
132 pin BQFP
'C51
PZ
1056
1K
8K
2
64K
5
50/35/25/20
100 pin TQFP
'LC51
PQ
1056
1K
8K
2
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
1
64K
5
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
1
64K
3.3
50/40/25
100 pin QFP
'LC52 PZ
1056 ─
4K
1
64K
3.3
50/40/25
100 pin TQFP
'C53
PQ
1056
3K
16K
2
64K
5
50/35/25
132 pin BQFP
'C53S
PZ
1056
3K
16K
2
64K
5
50/35/25
100 pin TQFP
'LC53
PQ
1056
3K
16K
2
64K
3.3
50/40/25
132 pin BQFP
'LC53S
PZ
1056
3K
16K
2
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
5
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
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.
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
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.
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
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.
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.
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.
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].
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.
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.
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
1
Mnożenie górnej części rejestru
PMULLW
1
Mnożenie dolnej części rejestru
PMADDWD
1
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]
2
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
1
AND
NOT
POR
1
OR
PXOR
1
XOR
Przesunięcia
PSLL[W,D,Q] 6
Przesunięcie logiczne w lewo [8,16,32bity]
PSRL[W,D,Q]
6
Przesunięcie logiczne w prawo [8,16,32bity]
PSRA[W,D]
4
Przesunięcie arytmetyczne w prawo [8,16bitów]
Przesłania MOV[D,Q]
4
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
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.
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.
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
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
3
nop Nop nop nop nop C
nop nop
4
nop Nop nop nop nop D
nop nop
5
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
24
6
F
Nop nop nop nop nop nop nop
7
nop Nop nop nop nop nop G
nop
8
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
3
F
Nop nop nop nop nop nop nop
4
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
1
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).
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.
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.
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.
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
8
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
2
1
1
Instrukcja ładowania danych: LD(B,H,W,D)
5
4
1
Instrukcja skoku: B
6
5
1
Wszystkie pozostałe instrukcje
1
0
1
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.
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.
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ę
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.
32
Tablica 10. Schemat konfliktów podczas dostępu do wewnętrznej pamięci danych procesora
TMS320C6201
D1
bajt
Pó
s owo
s
owo
D2 LSB
adresu
0
0
0
0
0
1
0
1
0
0
1
1
1
0
0
1
0
1
1
1
0
1
1
1
0
0
0
0
1
0
1
0
0
1
1
0
00
0
10
0
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.
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.
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
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.
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.
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].
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
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.
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
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.
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).
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.
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.
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]
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
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