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: 10 0 = 1, 10 1 = 10, 10 2 = 100, 10 3 = 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 1- es 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 12 1 = 12 = dozen (tucat), 12 2 = 144 = gross és 12 3 = 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, 3- as, 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 elnevezés kombináció száma = 2 n 1 bit 2 2 4 3 8 4 nibble 16 8 byte 256 10 1024 16 word 65536 24 16777216 32 longword 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ő: n 2 n n 2 n n 2 n 0 1 6 64 12 4096 1 2 7 128 13 8192 2 4 8 256 14 16384 3 8 9 512 15 32768 4 16 10 1024 16 65536 5 32 11 2048 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, 2 16-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. 2 3 2 2 2 1 2 0 DEC HEX 2 3 2 2 2 1 2 0 DEC HEX 0 0 0 0 0 0 1 0 0 0 8 8 0 0 0 1 1 1 1 0 0 1 9 9 0 0 1 0 2 2 1 0 1 0 10 A 0 0 1 1 3 3 1 0 1 1 11 B 0 1 0 0 4 4 1 1 0 0 12 C 0 1 0 1 5 5 1 1 0 1 13 D 0 1 1 0 6 6 1 1 1 0 14 E 0 1 1 1 7 7 1 1 1 1 15 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: x = N i= 0 i a i 2 (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 [-2 15, 2 15-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. -2 3 2 2 2 1 2 0 DEC (Z) -2 3 2 2 2 1 2 0 DEC (Z) 0 0 0 0 0 1 0 0 0-8= -8 +0 0 0 0 1 1 1 0 0 1-7= -8 +1 0 0 1 0 2 1 0 1 0-6= -8 +2 0 0 1 1 3 1 0 1 1-5= -8 +3 0 1 0 0 4 1 1 0 0-4= -8 +4 0 1 0 1 5 1 1 0 1-3= -8 +5 0 1 1 0 6 1 1 1 0-2= -8 +6 0 1 1 1 7 1 1 1 1-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 1 i= 0 N i x = a N 2 + a 2 (2) 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). i
A bináris számrendszer, bináris pontjától jobbra levő helyiértékek a követkzőek: n 2 -n n 2 -n n 2 -n 1 0.5 6 0.015625 11 0.00048828125 2 0.25 7 0.0078125 12 0.000244140625 3 0.125 8 0.00390625 13 0.0001220703125 4 0.0625 9 0.001953125 14 0.00006103515625 5 0.03125 10 0.0009765625 15 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 2 15 = 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: Z Qn 2 n = és Z 2 n = Q 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 2 13 = +8192 őt jelent, ha ezt elosztjuk 2 15 = 32768-al akkor 0.25-öt kapunk. A B szám egészként -2 15 +2 14 = -32768+16384 = -16394-et jelent, ha ezt elosztjuk 2 15 = 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.q15 0.1 ; 0CCCh S2.q15 0.5 ; 4000h S3.q15-0.25 ; 0E000h S4.q15-0.0600 ; 0F852h S5.q15 0.000061035158 ; 0002h S6.q15 0.000030517579 ; 0001h.ps 0a00h.entry.include "TMSINIT.ASM" LOOP LDP #S1 LACC S3 ; ACC=- 0.25 0E00h ADD S2 ; ACC=- 0.25 + 0.5 = 0.25 2000h ADD S4 ; ACC= 0.25 + ( -.0600 ) = 0.19 1852h ADD S1 ; ACC= 0.19 + 0.1 = 0.29 251Eh B LOOP.end
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.q15 0.1 ; 0CCCh S2.q15 0.5 ; 4000h S3.q15-0.25 ; 0E000h S4.q15-0.0600 ; 0F852h S5.q15 0.000061035158 ; 0002h S6.q15 0.000030517579 ; 0001h.ps 0a00h.entry.include "TMSINIT.ASM" LOOP LDP #S1 LACC S3 ; ACC=- 0.25 0E00h SUB S2 ; ACC=- 0.25-0.5 =-0.75 0A000h SUB S4 ; ACC= -0.75 - ( -.0600 ) =-0.69 0A7AEh SUB S1 ; ACC= -0.69-0.1 =-0.79 9AE2h B LOOP.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 ##