7.2.1. A racionális számok és a fixpontos processzorok numerikus felületének a kapcsolata A valósidejű jel- és képfeldolgozás területére eső alkalmazások esetében legtöbbször igény mutatkozik arra, hogy a mikrokontrollert ne C nyelven programozzuk, hanem assembly alatt. Ezek a feladatok általában numerikus jellegűek valamint a műveletekbe bejövő adatok fix aritmetikával rendelkeznek és különböző pontossági osztályba tartoznak. Az ilyen nyers adatokat kezelni kell és a művelet végén keletkező adatokat, viszont értelmezni kell. Ennek az alfejezetnek az a célja, hogy ebben segítsen. Először röviden felvezetjük ennek a kérdéskörnek a matematikai alapjait, majd egy pár példán keresztül a problémakört meg fogjuk világítani. A 7.2 fejezet akkor nyer értelmet, amikor következő probléma típusokat kell megoldani: - FPGA beágyazott környezetben kell kiépíteni fix pontos aritmetikával adott adatszélességű DSP feldolgozó magot. Vagy - be kell ágyazni assembly nyelvű valós idejű részt, amit fixpontos aritmetikával rendelkező DSP processzorral kell megoldanunk. Ebben sokat segíthet ennek az anyagnak az ismerete, a nem villamosmérnök előképzettségű fejlesztőknek. Segíti megérteni, hogy működik egy beágyazott DSP mag és miként kell megépíteni egy programozható beágyazott felületet, amit a későbbiekben akár egy sajátfejlesztésű assemblyvel is programozhat a fejlesztő vagy felhasználója a környezetnek. Ebben a fejezetrészben sok minden ismert a jegyzetet használóinak, de szerettük volna összefoglalni és olyan szemszögből megvilágítani, hogy a további részek értelmet kapjanak. A számok A szám matematikai fogalom, a mennyiségek leírására szolgál. A számokat tulajdonságaik alapján hamazokba sorolhatjuk. A legelterjetteb halmazba sorolás (1. ábra): természetes, egész, racionális és valós számok halmazát különböztet meg. Ha nem hangsúlyozunk ki mást, számon általában valós számot kell érteni. A számok számossága végtelen! (megj: a 0 számot az alkalmazott definiciótól függően vagy a természetes, vagy az egész számok közé soroljuk).
1. ábra – számhalmazok A számok számjegyekből állnak. A helyiértékes alakban felírt számok esetében, egy számjegy értéke függ a számban elfoglalt helyétől. Például a 53, 347 és 131 számok mindegyikében szerepel a 3-as számjegy, de más-más helyen. Ezért értéke (sorban): 3 db egyesnek, 3 db százasnak s 3 db tízesnek felel meg, amennyiben a számokat tízes számrendszerben olvassuk le. Amikor helyi értékes alakban van felírva egy szám, akkor az általa képviselt érték helyes leolvasásához elengedhetetlen, hogy ismerjük a számrendszert, amelyben fel lett írva.
Ugyanis a számrendszer alapja határozza meg a felhasználható számjegyek számát és az egyes pozíciók helyi értékét. Az emberek a hétköznapi életben a 10-es alapú számrendszert használják. Ebben a számrendszerben 10 számjegyet különböztetünk meg: 0, 1, 2, 3, 4, 5, 6, 7, 8 és 9. Ugyanekkor az érték egész része a tizedesponttól balra helyezkedik el, a törtrésze pedig jobbra. A tizedesponttól balra a helyi értékek sorban a 10 hatványai: 100 = 1, 101 = 10, 102 = 100, 103 = 1000 és így tovább, amit egyeseknek, tízeseknek, százasoknak és ezreseknek nevezünk. A tizedesponttól jobbra levő helyiértékek a 10 hatványainak recoprokai: 10-1 = 1/10 = 0.1, 10-2 = 1/100 = 0.01, 10-3 = 1/1000 = 0.001 és így tovább, amit tizednek, századnak és ezrednek nevezünk. A tízes alapú számrendszer mellett, történelmi vagy gyakorlati okokból más alapú számrendszerekkel is találkozhatunk pl.: 2, 12, 16, 60. • A 2-es alapú – más néven bináris – számrendszer a digitális korral és a számítógépekkel lelt alkalmazásra. Ennek az alaknak csak két számjegye a 0 és 1es van. • A sokjegyes bináris számok leírása és megjegyzése körülményessége hozta életre a 16-os alapú számrendszer – más néven hexadecimális – használatát. Ebben a számrendszerben 16 külön egykarakterű jelnek kell jelképeznie az egyes számjegyeket. Ezt a 0-9 számjegyek és A-F betűk felhasználásával érték el. • A 12-es számrendszer – más néven duodecimális - ma már nem használatos, nyelvi emlékét az angol és német nyelvek őrzik a: eleven, twelve és elf és zwölf „számjegyeikkel”, valamint a 121 = 12 = dozen (tucat), 122 = 144 = gross és 123 = 1728 = grand gross helyi érték elnevezésekkel. Eredete valószínűleg Mezopotámia. Ebben a számrendszerben számolva könnyen lehet kisebb mennyiségű árút 2-es, 3as, 4-es és 6-os csoportra bontani. • A 60-as számrendszer – más néven sexagesimal – eredete a Sumér birodalomban (i.e. III.évezred) keresendő. Napjainkban szögméréshez, időméréshez és földrajzi koordináták jelöléséhez használatos. A 60 tizenkét osztóval rendelkezik: 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60, ezért az ebben a számrendszerben felírt számokat nagyon jól lehet egyenlő egész részekre osztani. Pl. egy órát 2, 3, 4, 6 vagy 12 részre osztva 30, 20, 15, 10 vagy 5 perces részek keletkeznek. A számok ábrázolása számítógépekben A modern digitális számítógépek felépítésükből adódóan a kettesalapú, bináris számrendszert használják az adatok és programok tárolására. A számítástechnikában az információ alapegysége a bit, amit kettes számrendszerben 0-val vagy 1-el lehet ábrázolni. Ahhoz hogy több információt lehessen ábrázolni, össze lehet kapcsolni több bitet. Minden egyes újabb bit hozzáadásával megkétszereződik a lehetséges kombinációk száma (1. táblázat). n - bitek száma 1 2 3 4 8 10 16 24 32
elnevezés bit
nibble byte word longword
kombináció száma = 2n 2 4 8 16 256 1024 65536 16777216 4294967296
1. táblázat – a bitek száma és a lehetséges kombinációk száma A számok számossága végtelen, de a processzorok regisztereinek, memóriájának, akumulátorának és ALU ##Arithmetical Logical Unit## bitszáma véges, általában 16 vagy 32 bit. Ebből következik, hogy a kombinációk száma, avagy az ábrázolható számok tartománya is véges. A természetes számok ábrázolása
A proceszorok a természetes számokat a kettes számrendszer helyiértéke szerint tárolják. Az első 17 helyiérték a követkző: 2n
n 0 1 2 3 4 5
2n
n 1 2 4 8 16 32
6 7 8 9 10 11
2n 4096 8192 16384 32768 65536
n
64 128 256 512 1024 2048
12 13 14 15 16
2. táblázat – a bináris számrendszer helyiértékei (a 2 hatványai) A 2. táblázat adatai szerint egy 16 bites regiszterben/akumulátorban a természetes számokat [0, 216-1], avagy [0, 65535] tartományban lehet egyes lépésekben ábrázolni. A 3. táblázatban egy nibble – 4 bit – minden lehetséges kombinációja szerepel. A négy biten összesen 16 különböző kombinációt lehet ábrázolni. A bináris kombinációk tízes- és tizenhatos számrendszerben leolvasva a második oszlopban tekintehetőek meg. 23 0 0 0 0 0 0 0 0
22 21 20 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1
DEC 0 1 2 3 4 5 6 7
HEX 0 1 2 3 4 5 6 7
23 1 1 1 1 1 1 1 1
22 21 20 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1
DEC 8 9 10 11 12 13 14 15
HEX 8 9 A B C D E F
3. táblázat – 4 biten ábrázolt egész számok 10-es és tízenhatos számrendszerben. A bináris szám egész számként történő leolvasását képlettel így lehet kifejteni: N
x = ∑ ai 2i i =0
(1)
Ezeket a számokat felsőbb programozási nyelvekben az unsigned int névvel szokták illetni.
Az egész számok ábrázolása
A processzorok az egész számokat, kettes komplemens alakban tárolják. Jellegzetes, hogy a pozitív számok legjelentősebb bitje (MSB ##Most Significant Bit##) 0, mig a negatívoké 1 értéket vesz fel. Mivel a bitek száma ugyanannyi marad, a kombinációk száma sem változik. Csak az értéktartomány tolódik el felével balra a negatív számok irányába. Egy 16 bites regiszterben/akumulátorban az egész számokat [-215, 215-1], avagy [-32768, 32767] tartományban lehet egyes lépésekben ábrázolni. A 4. táblázatban egy nibble – 4 bit – minden lehetséges kombinációja szerepel. A négy biten összesen 16 különböző kombinációt lehet ábrázolni. A bináris kombinációk tízes számrendszerben leolvasva a második oszlopban tekintehetőek meg. -23 22 21 20 0000 0001 0010 0011 0100 0101 0110 0111
-23 22 21 20 1000 1001 1010 1011 1100 1101 1110 1111
DEC (Z) 0 1 2 3 4 5 6 7
DEC (Z) -8= -8 +0 -7= -8 +1 -6= -8 +2 -5= -8 +3 -4= -8 +4 -3= -8 +5 -2= -8 +6 -1= -8 +7
4. táblázat – 4 biten ábrázolt egész számok 10-es és tízenhatos számrendszerben. A bináris szám egész számként történő leolvasását képlettel így lehet kifejteni: N
N −1
x = −a N 2 + ∑ ai 2i
(2)
i =0
Ezeket a számokat felsőbb programozási nyelvekben a signed int névvel szokták illetni. Az egész számokkal való aritmetikai műveletek (összeadás, kivonás és szorzás) nagyságrendekkel gyorsabbak a lebegőpontos műveleteknél. Amíg az eredmény benne marad az ábrázolható tartományban, a számítások gyakorlatilag hiba és kerekítésmentesek. A DSP proceszorok zömét az olcsóbban előállítható, kisebb komplexitású, fix-pontos számításokra előrelátott processzorok teszik ki. Amennyiben az algoritmus hozzá van igazítva az egész számokkal való műveletekhez ezek a processzorok hatékonyabbak a lebegőpontos számításokat végző processzoroknál. A racionális számok ábrázolása
A valós számok két egész szám hányadosa. Ezen számok ábrázolásakor a programozó gondolatban elmozdítja a bináris pontot balra vagy jobbra. A bináris ponttól balra továbba is 2 hatványai jelzik a helyiérték súlyzását (2. táblázat), míg a jobbra elhelyezkedőek a 2 reciporok hatványaival bírnak (5. táblázat).
A bináris számrendszer, bináris pontjától jobbra levő helyiértékek a követkzőek: 2-n
n 1 2 3 4 5
n
0.5 0.25 0.125 0.0625 0.03125
6 7 8 9 10
2-n 0.015625 0.0078125 0.00390625 0.001953125 0.0009765625
n 11 12 13 14 15
2-n 0.00048828125 0.000244140625 0.0001220703125 0.00006103515625 0.000030517578125
5. táblázat – a bináris számrendszer helyiértékei (a 2 hatványai) A számítógépeken ábrázolt racionális számok jelzése Qxx ahol az xx érték jelzi, hogy mennyi helyet lett eltolva a bináris pont balra. Így pl. a Q15 azt jelenti hogy a bináris pont 15 helyet lett eltolva balra. Mivel 215 = 32768, ekkor az ábrázolt racionális értéket úgy kapjuk meg, hogy leolvassuk a bináris alak által ábrázolt egész számot, amit elosztunk 32768-al. Képlettel leírva az egész számú ábrázolás és a racionális számok közötti kapcsolat:
Qn =
Z 2n
és
Z = Qn ∗ 2 n
(3)
2. ábra – A Q15, Q14 és Q13 helyiértékei és a bináris pont elhelyezkedése 1. példa : Olvassuk le az A és B 16 bites Q15-ös számot, ha A = 0010 0000 0000 0000 és B = 1100 0000 0000 0000. Az A szám egészként 213 = +8192 –őt jelent, ha ezt elosztjuk 215= 32768-al akkor 0.25-öt kapunk. A B szám egészként -215+214 = -32768+16384 = -16394-et jelent, ha ezt elosztjuk 215= 32768-al akkor -0.5-öt kapunk.
Az ‘5x assembly eszköz hasznos szolgáltatása a .Qxx és .LQxx alakú fordítási parancsok, amelyek lehetővé teszik 16 és 32 bites fix-pontos számok inicializált elhelyezését a memóriában (3.ábra). Ennek az a jelentősége, hogy közvetlenül az assembly forráskódba vihetjük be tizedes számokat, amit a fordító a megfelelő alakban fog tárolni. Természetesen a Q formátumok miatt az átalakítás gyakran a pontosság csökkenésével jár a korlátolt tárolási lehetőségek miatt. Ezt mindig a fejlesztőnek kell mérlegelnie. A 6. ábrán látható példában a 0.25 valós szám, mint 0x2000 lett ábrázolva Q15 alakban, a 9 valós szám, pedig mint 0x00000900 lett ábrázolva LQ24 alakban (3. irodalom).
3. ábra – Q15 és Q24 számok inicializált elhelyezése az adatmemóriában 2. példa Gyakorlati példa `5x processzor assemblyjében írt Q15-ösz számok összeadására. A megjegyzésekben láthatóak a kiinduló, a rész- valamint a végeredmény úgy racionális alakban mint a bináris érték HEX alakban.
; Program a DSP osszeadasanak a kivizsgalasara ; pozitiv es negativ q15-os formatum .mmregs .ds 0f00h S1 S2 S3 S4 S5 S6
.q15 .q15 .q15 .q15 .q15 .q15
0.1 0.5 -0.25 -0.0600 0.000061035158 0.000030517579
; 0CCCh ; 4000h ; 0E000h ; 0F852h ; 0002h ; 0001h
.ps 0a00h .entry .include "TMSINIT.ASM" LOOP LDP LACC ADD ADD ADD B .end
#S1 S3 S2 S4 S1 LOOP
; ; ; ;
ACC=ACC=ACC= ACC=
0.25 0.25 + 0.5 = 0.25 0.25 + ( -.0600 ) = 0.19 0.19 + 0.1 = 0.29
0E00h 2000h 1852h 251Eh
3. példa Gyakorlati példa `5x processzor assemblyjében írt Q15-ösz számok kivonására. A megjegyzésekben láthatóak a kiinduló, a rész- valamint a végeredmény úgy racionális alakban mint a bináris érték HEX alakban. ; Program a DSP kivonasanak a kivizsgalasara ; pozitiv es negativ q15-os formatum .mmregs .ds 0f00h S1 S2 S3 S4 S5 S6
.q15 .q15 .q15 .q15 .q15 .q15
0.1 0.5 -0.25 -0.0600 0.000061035158 0.000030517579
; 0CCCh ; 4000h ; 0E000h ; 0F852h ; 0002h ; 0001h
.ps 0a00h .entry .include "TMSINIT.ASM" LOOP LDP LACC SUB SUB SUB B
#S1 S3 S2 S4 S1 LOOP
; ; ; ;
ACC=- 0.25 ACC=- 0.25 - 0.5 =-0.75 ACC= -0.75 - ( -.0600 ) =-0.69 ACC= -0.69 - 0.1 =-0.79
0E00h 0A000h 0A7AEh 9AE2h
.end
(1) Stoyan Gisbert : „Numerikus Matematika Mérnököknek és programozóknak”, Typotex Budapest, 2007, ISBN 978 963 9664 41 8 (3) A DSK fejlesztőlap leírása: „TMS320C5x DSK Users Guide.pdf” ##LINK: http://www.ti.com/lit/ug/spru101a/spru101a.pdf ##