《TMS320C3X系列-DSP原理与开发技术》课件第3章_第1页
《TMS320C3X系列-DSP原理与开发技术》课件第3章_第2页
《TMS320C3X系列-DSP原理与开发技术》课件第3章_第3页
《TMS320C3X系列-DSP原理与开发技术》课件第3章_第4页
《TMS320C3X系列-DSP原理与开发技术》课件第3章_第5页
已阅读5页,还剩151页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章TMS320C3x的浮点数格式

与寻址类型

3.1浮点数格式3.2寻址类型3.3寻址方式

3.4系统堆栈和用户堆栈管理本章小结

思考题与习题

TI公司的TMS320C3x系列浮点DSP芯片,支持三种数据格式:有符号整数、无符号整数和浮点数,其中有符号整数和无符号整数可认为是相同的。TMS320C3x支持的有符号整数和无符号整数包括短数据格式和单精度格式,支持的浮点数包括短浮点格式、单精度浮点格式和扩展精度浮点格式,如图3.1所示。需要特别说明的是,TI公司的TMS320C3x系列浮点DSP芯片,支持的浮点数不是IEEE的浮点格式,而是TI公司自己定义的一种浮点格式。所以本章将详细介绍TMS320C3x系列DSP支持的浮点数格式及数据间的转换。图3.1C3x支持的数据格式3.1浮

3.1.1IEEE浮点数格式

IEEE 754—1985标准定义了4种浮点数格式,即单精度浮点数格式、扩展精度浮点数格式、双精度浮点数格式和扩展双精度浮点数格式。浮点数格式由三个区组成:指数区(e)、一位符号区(s)和分数区(f)。存放顺序依次为e、s、f。指数区是一个二进制的补码,符号区和分数区可以作为一个单元,称为尾数区。尾数用来表示一个归一化的二进制的补码数。在归一化表示中,最大非符号数有效位是隐含表示的,由此提供附加一位的精度。浮点数x作为e、s和f区的函数可写为:当s=0时,x=01.f×2e;当s=1时,x=10.f×2e;当e取最大负数2的补码值时,x=0。在DSP中,单精度格式用的最多,因此主要介绍IEEE单精度浮点数格式的表示方法。单精度浮点数格式总长度为32位,其中s是尾数m的符号位,仅1位,s = 0表示正数,s = 1表示负数;e是指数,用无符号数表示,共8位,取值范围为0~255;f为尾数的分数部分,共23位。一个单精度浮点数x用e、s和f表示可分为以下5种情况。

(1)如果0<e<255,则x = (-1)s2e-127(1.f),式中s = 0或1,而e和f均为十进制数。

(2)如果e = 0,且f≠0,则x是一个非归一化的数,且x = (-1)s2-126(0.f),s = 0或1,f用十进制数表示。

(3)如果e = 0,且f = 0,则x = 0。

(4)如果e = 255,且f ≠ 0,则x是一个无效数。

(5)如果e = 255,且f = 0,则x为无穷大。3.1.2TMS320C3x的浮点数格式为了在硬件实现时获得更高的效率,TMS320C3x采用了不同于IEEE标准的浮点数格式。TMS320C3x共定义了3种浮点数格式。与IEEE浮点数格式一样,每种都可以分为3个区域,即指数区(e)、1位符号位(s)和分数区(f)。指数区是二进制的补码数,符号区和分数区可以作为一个单元,称为尾数man(mantissa),其存放格式如图3.2所示。图3.2通用浮点数格式浮点数x用指数e、符号s和分数f可以表示为

x=ss.f×2e(3.1)其中,s为符号位的数值;s为符号位取“非”后的数值;f为分数区的二进制数值;e为指数区的十进制数值。

s是隐含的,由此可以提供附加一位的精度。采用上述符号后,尾数可表示为ss.f。当符号位s为0时,浮点数x为正数,此时尾数为01.f;当符号位s为1时,浮点数x为负数,此时尾数为10.f。指数e在存储器中是以二进制的补码表示的,在式(3-1)中是以十进制数表示的,以十进制表示的数值即e就是尾数中小数点移动的位数。例如,若尾数man = 01.000000000012,指数e = 1110,那么尾数的二进制数的小数点将右移11位,此时结果为01000000000012,也即表示的十进制数为2049。指数e是有符号的,若指数e为“正”,则表示尾数中的小数点右移;若指数e为“负”,则表示尾数中的小数点左移。

1.浮点数格式

TMS320C3x支持三种浮点数格式:短浮点数格式、单精度浮点数格式、扩展精度浮点数格式。

1)短浮点数格式短浮点数格式的总长度为16位,包括4位指数、1位符号和11位分数,隐含的二进制小数点位于第11位和第10位之间,如图3.3所示。短浮点数x的二进制形式表示如下:若s = 0,则x = 01.f × 2e;若s = 1,则x = 10.f × 2e;若s = -8,则x = 0。图3.3短浮点数格式若用短浮点数格式表示零,那么必须满足下面的条件:E=-8,s=0,f= 0下面的例子说明了短浮点数格式的数的范围。当s=0,e=7,f的11位均为1时,表示的浮点数为最大正数:x = (2-2-11) × 27 = 2.5594 × 102当s=0,e=-7,f的11位均为0时,表示的浮点数为最小正数:x = 1 × 2-7 = 7.8125 × 10-3当s = 1,e = -7,f的11位均为1时,表示的浮点数为绝对值最小的负数:x = (-2-2-11) × 2-7 = -708163 × 10-3当s = 1,e = 7,f的11位均为0时,表示的浮点数为绝对值最大的负数:x = -2 × 27 = -205600 × 102当s=1,e=-7,f的11位均为1时,表示的浮点数为绝对值最小的负数:X=(-2-2-11)×2-7=-708163×10-3当s=1,e=7,f的11位均为0时,表示的浮点数为绝对值最大的负数:x= -2× 27 = -205600×102

2)单精度浮点数格式单精度浮点数格式是最常用的浮点数格式,其总长度为32位,包括8位指数、1位符号和23位分数。隐含的二进制小数点位于第23位和第22位之间,如图3.4所示。单精度浮点数x的二进制形式可表示如下:若s=0,则x=01.f×2e;若s=1,则x=10.f×2e;若s=-128,则x=0。图3.4单精度浮点数格式若用单精度浮点数格式表示零,那么必须满足下面的条件:e=-128,s=0,f=0下面的例子说明了单精度浮点数格式的数的范围。当s=0,e=127,f的23位均为1时,表示的浮点数为最大正数:x=(2-2-23)×2127=3.4028234×1038当s=0,e=-127,f的23位均为0时,表示的浮点数为最小正数:x=1×2-127=5.8774717×10-39当s=1,e=-127,f的23位均为1时,表示的浮点数为绝对值最小的负数:x=(-1-2-23)×2-127=-5.8774724×10-39当s=1,e=127,f的23位均为0时,表示的浮点数为绝对值最大的负数:x=-2×2127=-3.4028236×1038

3)扩展精度浮点数格式扩展精度浮点数格式的总长度为40位,包括8位指数、1位符号和31位分数,隐含的二进制小数点位于第31位和第30位之间,如图3.5所示。扩展精度浮点数x的二进制形式可表示如下:若s=0,则x=01.f×2e;若s=1,则x=10.f×2e;若s=-128,则x=0。图3.5扩展精度浮点数格式若用扩展精度浮点数格式表示零,那么必须满足下面的条件:e=-128,s=0,f=0下面的例子说明了扩展精度浮点数格式的数的范围。当s=0,e=127,f的31位均为1时,表示的浮点数为最大正数:x=(2-2-23)×2127=3.4028234×1038当s=0,e=-127,f的31位均为0时,表示的浮点数为最小正数:x=1×2-127=5.877471754 1×1038当s=1,e=-127,f的31位均为1时,表示的浮点数为绝对值最小的负数:x=(-1-2-31)×2-127 = -5.8774717569×10-39当s=1,e=127,f的31位均为0时,表示的浮点数为绝对值最大的负数:x=-2×2127=-3.4028236691×1038

2.单精度浮点数格式的表示方法由于TMS320C3x中用的最多的是单精度浮点数格式,下面就以这种格式为例说明浮点数的表示方法。在实际浮点数操作情况下,多用32位的十六进制表示,高8位(第24~31位)为指数e,第23位为符号位s,其余的低23位(第0~22位)为分数f。若需要换算成整数,则分别写出指数e、符号位s、分数f,根据单精度浮点数格式,转换成相应的整数。例如,设浮点数x的32位十六进制数用F表示,即F = 00000000h,则指数e = 00(第24~31位),符号位s=0(第23位),分数f=0(第0~22位),因为s = 0,故浮点数x的二进制值为01.f × 20 = 1,那么十进制值也为1。

3.1.3数据格式间的转换

1.整数和浮点数格式的转换

1)浮点数到整数的转换(fix指令)使用fix指令,可以在单精度内把扩展精度浮点数转换为单精度整数。x值由浮点数转换为整数用fix(x),如果待转换值a在-231<a<231-1范围内,则转换时不会溢出。首先必须确定a(exp)≤31,若没有在此范围内,将会发生溢出。若溢出发生在正方向,则输出是最大正整数;若溢出发生在负方向,则输出是最大负整数。如果a(exp)在有效范围内,那么a包含于有效范围内,是有符号扩展数,而且根据rs = 31-a(exp)进行右移。右移出的那些位与尾数的分数部分相对应。例如如果0≤x<1,那么fix(x) = 0;如果-1≤x<0,那么fix(x) = -1。

2)整数到浮点数的转换(float指令)使用float指令把整数转换为浮点数,允许单精度整数转换为扩展精度浮点数。

2.单精度浮点数转换为整数在数据处理中,经常需要把浮点数转换成整数,转换步骤如下:

(1)把二进制形式的指数转换成十进制数。浮点数格式的指数是以二进制的补码形式出现的,把它转换成十进制数时要看它的最高位。若最高位为0,则可以直接把二进制数转换成十进制数;若最高位为1,则需要对指数的二进制数求补码,然后再把它转换成十进制数。

(2)把尾数转换成满足条件的二进制形式。尾数是由一位符号位和分数组成的,其中在符号位和分数之间隐含了一个二进制的小数点。若符号位s=0,则尾数被改写为01,同时加上二进制的小数点,然后在小数点后面附加上分数f。例如,若f = 101000000002,则尾数变为man = 01.101000000002。若符号位s = 1,则尾数被改写为10,同时加上二进制的小数点,然后在小数点后面附加上分数f,例如f = 101000000002,那么此时的尾数变为man = 10.101000000002。

(3)根据指数的值移动改写后尾数的小数点。若指数为正,则小数点向右移;若指数为负,则小数点向左移。例如,如果e = 210且man = 01.110000000002,那么尾数的小数点右移两位,得到的结果为0111.0000000002,也即十进制值为7;如果e = -210且man = 01.10000000002,那么尾数的小数点左移两位,得到的结果为0.01100000000002,也即十进制值为3/8。下面的例子说明了如何由浮点数得到整数、分数。例3.1浮点数转换后为正整数。浮点数转换后为正整数的例子如图3.6所示。图3.6浮点数转换后为正整数例例3.2浮点数转换后为负整数。浮点数转换后为负整数的例子如图3.7所示。图3.7浮点数转换后为负整数例例3.3浮点数转换后用分数表示。浮点数转换后为分数的例子如图3.8所示。图3.8浮点数转换后为分数例

3.浮点数格式间的转换对于上面提到的几种浮点数格式,在进行浮点数操作时,经常要求从一种浮点数格式转换为另一种浮点数格式,并且浮点数格式转换也是浮点运算的一部分,它不需要花费额外的时间,而是自动地在硬件中完成的。图3.9~图3.12为四种格式转换的例子。在下面的例子中,s为指数的符号位,y为短浮点数格式中的尾数,x为短浮点数格式中的指数,z为扩展精度的低8位。由图3.9可看出,在转换后的单精度浮点数格式中,指数区的符号得到扩展,尾数区的低12位填充“0”。图3.9短浮点数格式转换为单精度浮点数格式由图3.10可看出,在转换后的扩展精度格式中,指数区的符号得到扩展,尾数区的低20位填充“0”。图3.10短浮点数格式转换为扩展精度浮点数格式由图3.11可看出,在转换后的扩展精度格式中,尾数区的低8位填充“0”。图3.11单精度浮点格式转换为扩展精度浮点数格式由图3.12可看出,转换后的单精度格式是把原来的扩展精度格式中的低8位截掉了。图3.12扩展精度浮点数格式转换为单精度浮点数格式3.1.4浮点数的运算

1.浮点数的乘法一个浮点数a可用下面公式表示:a=a(man)×2a(exp)(3.2)式中,a(man)为浮点数的尾数;a(exp)为浮点数的指数。两个浮点数a和b相乘,其乘积结果为c,则定义如下形式:c=a×b=a(man)×b(man)×2(a(exp)× b(exp))(3.3)由式(3-3)可见:c(man)=a(man)×b(man)(3.4)c(exp)=a(exp)+b(exp) (3.5)浮点数在做乘法运算时,源操作数都假定为单精度浮点数格式。若源操作数是短浮点格式,则它必须先被转换为单精度浮点数格式;若源操作数是扩展精度浮点数格式,则也必须先被转换为单精度浮点数格式。这些转换都在硬件中自动完成而毋须花费更多时间。所有浮点数乘积的结果都为扩展精度浮点数格式,并且整个乘法运算是在单周期内完成的。

2.浮点数的加法和减法在浮点数加法和减法中,若两个浮点数a和b能定义为a=a(man)×2a(exp),b=b(man)×2b(exp)则a和b的和与差c可定义为

c=a±b

=(a(man)±(b(man))×2-(a(exp)-b(exp)))×2a(exp),若a(exp)≥b(exp)

=(a(man)×2-(b(exp)-a(exp)))±b(man)×2b(exp),若a<b(exp)

3.浮点数的除法浮点数DSP芯片一般不提供专门的除法指令,因为实现浮点数除法必须用子程序来实现。实现浮点数除法可以采用近似迭代的方法来实现。设z=x/y,如果先求得y的倒数1/y,则将x乘以y的倒数即可求得x/y。求y的倒数的迭代方法为e[i]=e[i-1]×(2.0-ye[i-1])采用这个迭代公式需要一个初始估值e[0],设y=m×2e,则e[0]的一个较好估值为e[0]=1.0×2-e-1例3.4浮点数求倒数的TMS320C3x汇编程序。汇编程序如下:

INVF: LDF R0,R3 ;保存输入数 ABSFR0 ;求绝对值

PUSHFR0

POP R1

ASH-24,R1;R1的低8位包含指数部分

NEGIR1

SUBI1,R1

ASH24,R1

PUSH R1

POPF R1 ;R1=v[0]=1.0*2**(-e-1) MPYF R1,R0,R2 ;第一次迭代

SUBRF 2.0,R2 MPYF R2,R1 MPYF R1,R0,R2 ;第二次迭代 SUBRF 2.0,R2

MPYF R2,R1 MPYF R1,R0,R2 ;第三次迭代 SUBRF 2.0,R2MPYF R2,R1MPYF R1,R0,R2 ;第四次迭代SUBRF 2.0,R2MPYF R2,R1RND R1 ;最后一次迭代采用e[5] = (e[4]*(1.0-(v*e[4]))) + e[4]MPYFR1,R0,R2SUBRF1.0,R2MPYFR1,R2ADDFR2,R1

RNDR1,R0 ;处理负数情况

NEGFR0,R2

LDFR3,R3

LDFNR2,R0 ;若v<0,R0=-R0

RETS该例是求浮点倒数的TMS320C3x的汇编程序,输入数v及其倒数均在寄存器R0中,这个程序采用5次迭代。要想获得更高的精度,增加迭代次数即可。3.2寻址类型

TMS320C3x系列的DSP共有七种寻址类型,通过这些寻址操作可以完成从存储器、寄存器以及指令字中存取数据。这七种寻址类型分别是立即寻址、直接寻址、寄存器寻址、间接寻址、PC相对寻址、循环寻址和位反转寻址。3.2.1立即数寻址立即数寻址就是寻找的对象(操作数)直接在指令中出现,指令在被汇编器编译成机器代码时,所需要的数据可以直接拿出来使用,不需要到寄存器或存储器中去取操作数。在这种寻址方式中,立即数的大小受到指令字最低有效位数的限制,一般有16位和32位两种情况,据此立即数寻址可以划分为短立即数寻址和长立即数寻址。

1.短立即数寻址短立即数寻址的操作数是包含在指令字中低16位有效位中的立即数。根据指令字的数据类型,短立即数表现形式可以是负数(以二进制的补码形式表示)、无符号整数或浮点数。涉及到短立即数寻址的常见指令有ADDI、AND、CMPI、SUBI、MPYI等。例3.5短立即数寻址。如:SUBI1,R0指令执行前

指令执行后

R0

=

0000000000h R0

=

00FFFFFFFFh说明:在例3.5中指令SUBI的源操作数为1,源操作数在指令中是以短立即数寻址的方式出现的,而目的操作数R0则是以寄存器寻址的方式出现的,所以指令的寻址是对具体的操作数而言的,不同的操作数类型对应的寻址方式会出现差异。

2.长立即数寻址长立即数寻址的操作数是包含在指令字中的低24位有效位中的立即数。长立即数的数据形式主要是无符号整数。涉及到长立即数寻址的常见指令有BR、BRD等。例3.6长立即数寻址。如:BR80000h指令执行前

指令执行后

PC = 0h PC = 80000h在立即数寻址中,由于寻找对象(操作数)就在计算机指令中,读到指令就找到了操作数,因此寻址花费的时间较少,寻址速度较快。但同时也存在一些不足之处:首先程序指令的设计不灵活,由于操作数固化在指令中,要想对数据进行修改就必须修改指令,变动程序。其次由于寻址的对象是立即数,最大位数为24位,操作数的取值范围受到了限制。为了扩大寻址空间,可以将操作数的地址放在指令中,于是出现了直接寻址。3.2.2直接寻址对于直接寻址来说,寻找的对象(操作数)不在计算机指令中,而在内部存储器中,该存储器的单元地址由计算机指令直接给出。在直接寻址的过程中,数据地址由数据页指针寄存器(DP)的低8位和指令字的低16位连接而成,使程序在256页(每页64K字)中不需改变页指针就有一个很大的寻址空间。数据地址格式如图3.13所示,图中expr是表示地址的数值或符号。图3.13直接寻址例3.7直接寻址。如:ADDI@0BCDEh,R7

例3.8直接寻址。如:SIZE.word123456h

.text

LDI@SIZE,R0

直接寻址中由于计算机指令直接给出的单元地址往往超过了16位,寻址空间可以达到64K个单元,寻址空间的范围扩大了。但是直接寻址在确定数据的地址之后还需要对内存进行访问,才能找到操作数,因此直接寻址与立即数寻址方式相比,其寻址速度明显降低。3.2.3寄存器寻址为了进一步提高寻址速度,可以将操作数直接存放在CPU寄存器中,通过对寄存器的操作实现对数据的存取处理,这种寻址方式称为寄存器寻址。例3.9寄存器寻址。如:PUSHR1;

TMS320VC33中可用作寄存器寻址的寄存器共有28个,分别是扩展精度寄存器R0~R7,辅助寄存器AR0~AR7,数据页指针DP,索引寄存器IR0、IR1,块寄存器BK,堆栈指针寄存器SP,状态寄存器ST,中断控制寄存器IE,中断标志寄存器IF,I/O控制寄存器IOF,块重复计数器RC,块重复起始地址RS,块重复结束地址RE。有关CPU寄存器的详细资料见第2章。寄存器寻址是通过指令字中寄存器的机器代码找到操作数的,整个寻址过程在CPU内部完成,不需要访问寄存器,因此寻址速度非常快。不足的是,在寄存器寻址中用于存放数据的CPU寄存器太少,为了提高寄存器的利用率,扩大寻址空间,可采用间接寻址。3.2.4间接寻址与寄存器寻址不同的是,间接寻址在CPU寄存器中放入的不是操作数,而是该操作数存储单元的地址,该地址是由辅助寄存器、偏移量和索引寄存器来确定的,其中辅助寄存器和索引寄存器仅使用低24位有效位,这24位对应的无符号数在辅助寄存器运算单元(ARAU)中进行运算,高8位保持不变。在所有的寻址类型中间接寻址的形式变化最多,寻址方式最灵活,应用范围最广。表3.1~3.3列出了各种间接寻址指令的句法、操作及其功能。其中表3.1是带有偏移量disp的间接寻址指令,表3.2是通过索引寄存器IRm(IRm为IR0或IR1)调整偏移量的间接寻址指令,表3.3是特殊的间接寻址指令。表3.1带有偏移量的间接寻址表3.2通过索引寄存器IRm调整偏移量的间接寻址表3.3间接寻址的特殊情况

1.直接给出偏移量的间接寻址这类寻址方式的指令如表3.1所示,所取操作数的地址是由辅助寄存器ARn的内容与偏移量disp确定的,其中偏移量可以是默认值1,也可以是包含在指令字中的8位无符号整数,能够表示的数值范围为0~255。应该注意的是,在三操作数的指令中偏移量disp只能取0,1。下面例3.10~3.17对这些指令进行逐条详解。例3.10预加偏移量的间接寻址。所取操作数的地址是辅助寄存器ARn的内容与偏移量disp之和。

句法:*+ARn(disp)操作:操作数地址=ARn+disp如:LDI*+AR0(1),R0指令执行前

指令执行后

AR0 = 800000h AR0

=

800000h

R0 = 0h R0

=

123456h

800001中数据 = 123456h 800001中数据 = 123456h例3.11预减偏移量的间接寻址。

所取操作数的地址是辅助寄存器ARn的内容减去偏移量disp。句法:*-ARn(disp)操作:操作数地址=ARn-disp如:LDI*-AR0(253),R0指令执行前

指令执行后

AR0 = 800253h AR0

=

800253h

R0 = 0h R0

=

123456h

800000中数据 = 123456h800000中数据 = 123456h例3.12预加偏移量和修改辅助寄存器的间接寻址。操作数的地址是辅助寄存器ARn的内容与偏移量disp之和。取数据后,辅助寄存器内容变为更新后的地址。句法:*++ARn(disp)操作:操作数地址 = ARn+dispARn = ARn+disp

如:LDI*++AR0(2),R0指令执行前

指令执行后

AR0 = 800000h AR0

=

800002h

R0 = 0h R0

=

123456h

800002中数据 = 123456h800002中数据 = 123456h例3.13预减偏移量和修改辅助寄存器的间接寻址。所取操作数的地址是辅助寄存器ARn的内容减去偏移量disp,取数据后,辅助寄存器内容变为更新后的地址。句法:*--ARn(disp)操作:操作数地址=ARn-disp

ARn=ARn-disp如:LDI*--AR0(2),R0指令执行前

指令执行后AR0 = 800002h AR0

=

800000hR0 = 0h R0

=

123456h800000中数据 = 123456h

800000中数据 = 123456h例3.14后加偏移量和修改辅助寄存器的间接寻址。所取操作数的地址是辅助寄存器ARn的内容。取操作数后,偏移量disp加到辅助寄存器中。句法:*ARn++(disp)操作:操作数地址 = ARnARn = ARn+disp如:LDI*AR0++(2),R0指令执行前

指令执行后AR0 = 800000h AR0

=

800002hR0 = 0h R0

=

123456h800000中数据 = 123456h 800000中数据 = 123456h例3.15后减偏移量和修改辅助寄存器的间接寻址。所取操作数的地址是辅助寄存器ARn的内容。取操作数后,辅助寄存器内容减去偏移量disp。句法:*ARn--(disp)操作:操作数地址 = ARnARn = ARn-disp

如:LDI*AR0--(2),R0指令执行前

指令执行后AR0 = 800002h AR0 = 800000hR0 = 0h R0 = 123456h800002中数据 = 123456h 800002中数据 = 123456h例3.16后加偏移量和循环修改辅助寄存器的间接寻址。所取操作数的地址是辅助寄存器ARn的内容。取操作数后,偏移量disp用循环寻址方式加到辅助寄存器中,结果用来更新辅助寄存器内容。句法:*ARn++(disp)%操作:操作数地址 = ARnARn = 循环(ARn+disp)如:设循环缓冲器的大小R = 6,该缓冲器的首地址为800000h。LDI*AR0++(4)%,R0指令执行前

指令执行后AR0 = 800003h AR0 = 800001hR0 = 0h R0 = 123456h800003中数据=123456h 800003中数据 = 123456h例3.17后减偏移量和循环修改辅助寄存器的间接寻址。所取操作数的地址是辅助寄存器ARn的内容。取操作数后,偏移量disp以循环寻址方式从辅助寄存器内容中减去,结果用来更新辅助寄存器内容。句法:*ARn--(disp)%操作:操作数地址 = ARnARn = 循环(ARn-disp)如:设循环缓冲器的大小为6,该缓冲器的首地址为800000h。LDI*AR0--(2)%,R0指令执行前

指令执行后AR0 = 800005hAR0 = 800003hR0 = 0h R0 = 123456h800005中数据 = 123456h800005中数据 = 123456h

2.通过索引寄存器调整偏移量的间接寻址在带有偏移量的间接寻址中,对于辅助寄存器的调整往往受到偏移量取值范围的限制,为了扩大基址的调整幅度,引入索引寄存器。通过索引寄存器调整偏移量的间接寻址的指令如表3.2所示。所取操作数的地址是由辅助寄存器ARn的内容与索引寄存器IRm(IR0或IR1)确定的。下面的例3.18~3.25对这些指令进行逐条详解。例3.18预加变址的间接寻址。

所取操作数的地址是辅助寄存器ARn和索引寄存器(IR0或IR1)内容之和。指令执行前辅助寄存器中的内容不发生变化。句法:*+ARn(IRm)操作:操作数地址 = ARn+IRm如:LDI10h,IR0

LDI*+AR0(IR0),R0指令执行前

指令执行后

IR0 = 0h IR0 = 10h

AR0 = 800000h

AR0 = 800000h

R0

=

0h

R0

=

123456h800010中数据

=

123456h 800010中数据

=

123456h例3.19预减变址的间接寻址。

所取操作数的地址是辅助寄存器ARn和索引寄存器(IR0或IR1)内容之差。指令执行前辅助寄存器中的内容不发生变化。句法:*-ARn(IRm)操作:操作数地址=ARn-IRm如:LDI10h,IR0

LDI*-AR0(IR0),R0指令执行前

指令执行后IR0 = 0h IR0

=

10hAR0 = 800010h AR0 = 800010hR0 = 0h R0 = 123456h800000中数据 = 123456h 800000中数据

=

123456h例3.20预加变址和修改辅助寄存器的间接寻址。

所取操作数的地址是辅助寄存器ARn和索引寄存器(IR0或IR1)内容之和。指令执行后用产生的新地址对辅助寄存器中的内容进行更新。句法:*++ARn(IRm)操作:操作数地址 = ARn+IRm

ARn = ARn+IRm如:LDI10h,IR0LDI*++AR0(IR0),R0指令执行前

指令执行后IR0 = 0h IR0 = 10hAR0 = 800000h AR0 = 800010hR0 = 0h R0 = 123456h800010中数据 = 123456h 800010中数据 = 123456h例3.21预减变址和修改辅助寄存器的间接寻址。

所取操作数的地址是辅助寄存器ARn和索引寄存器(IR0或IR1)内容之差。指令执行后用产生的新地址对辅助寄存器中的内容进行更新。句法:*--ARn(IRm)操作:操作数地址 = ARn-IRm

ARn = ARn-IRm如:LDI10h,IR0

LDI*--AR0(IR0),R0指令执行前

指令执行后IR0 = 0h IR0 = 10hAR0 = 800010h

AR0 = 800000hR0 = 0h

R0 = 123456h800000中数据 = 123456h 800000中数据 = 123456h例3.22后加变址和修改辅助寄存器的间接寻址。

所取操作数的地址是辅助寄存器ARn的内容。指令执行后索引寄存器IRm(IR0或IR1)内容加到辅助寄存器中去,对辅助寄存器进行更新。句法:*ARn++(IRm)操作:操作数地址 = ARn

ARn = ARn+IRm如:LDI10h,IR0

LDI*AR0++(IR0),R0指令执行前

指令执行后

IR0 = 0h IR0 = 10h

AR0 = 800000h

AR0 = 800010h

R0 = 0h

R0 = 123456h800000中数据 = 123456h 800000中数据 = 123456h例3.23后减变址和修改辅助寄存器的间接寻址。

所取操作数的地址是辅助寄存器ARn的内容。指令执行后,从辅助寄存器中减去索引寄存器IRm(IR0或IR1)内容,并对辅助寄存器进行更新。句法:*ARn--(IRm)操作:操作数地址 = ARn

ARn = ARn-IRm如:LDI10h,IR0

LDI*AR0--(IR0),R0指令执行前

指令执行后IR0 = 0h IR0 = 10hAR0 = 800010h AR0 = 800000hR0= 0h R0 = 123456h800010中数据 = 123456h 800010中数据 = 123456h例3.24后加变址和循环修改辅助寄存器的间接寻址。

所取操作数的地址是辅助寄存器ARn的内容。取操作数后,索引寄存器(IR0或IR1)的内容加到辅助寄存器中,这个值用循环寻址方式计算并对辅助寄存器的内容进行更新。有关循环寻址的计算详见本章3.2.6节的循环寻址。句法:*ARn++(IRm)%操作:操作数地址 = ARn

ARn = 循环(ARn+IRm)如:设循环缓冲器的大小R=6,该缓冲器的首地址为800000h。

LDI4h,IR0

LDI*AR0++(IR0)%,R0指令执行前

指令执行后

IR0 = 0h

IR0 = 4hAR0 = 800003h

AR0 = 800001hR0 = 0h R0 = 123456h800003中数据 = 123456h

800003中数据 = 123456h例3.25后减变址和循环修改辅助寄存器的间接寻址。

取操作数的地址是辅助寄存器ARn内容。取操作数后,从辅助寄存器中减去索引寄存器(IR0或IR1)内容,这个值用循环寻址方式计算并对辅助寄存器的内容进行更新。有关循环寻址的计算详见本章4.1.6节的循环寻址。句法:*ARn--(IRm)%操作:操作数地址 = ARn

ARn = 循环(ARn-IRm)如:设循环缓冲器的大小R=6,该缓冲器的首地址为800000h。LDI2h,IR0LDI*AR0--(IR0)%,R0指令执行前

指令执行后IR0 = 0h IR0 = 2hAR0 = 800005h AR0 = 800003hR0

=

0h R0

=

123456h800005中数据 = 123456h 800005中数据 = 123456h

3.特殊的间接寻址特殊的间接寻址指令如表3.3所示。下面例3.26~4.27对这些指令中的情况进行详解。例3.26辅助寄存器的间接寻址。

LDI*AR0,R0指令执行前

指令执行后

AR0 = 800005h

AR0 = 800005h

R0 = 0h R0 = 120000h800005中数据 = 120000h

800005中数据 = 120000h例3.27后加变址和以位反转方式修改辅助寄存器的间接寻址。

所取操作数的地址是辅助寄存器ARn的内容。取操作数后,索引寄存器(IR0)内容加到辅助寄存器中,采用反向进位方式计算,得到位反转(B)地址,用这个值替代辅助寄存器内容。句法:*ARn++(IR0)B操作:操作数地址 = ARn

ARn = B(ARn+IR0)假定一个8位的辅助寄存器AR2赋值01100000(60)是存储器数据起始地址,若此存储器有16条记录,IR0被赋值00001000(8),则指令*AR2++(IR0)B被多次执行后的结果见例3.27。3.2.5PC相对寻址

PC相对寻址主要用于控制程序跳转。在一般的程序执行过程中,指令逐条顺序执行,指令的地址由PC+1→PC控制,而在程序执行跳转指令,下一条指令的地址不再由程序计数器PC决定,而是由指令直接给出。在C3x系列的PC相对寻址中,通过把指令字中16位或者24位的最低有效位上的内容和当前的程序计数器PC相加,利用相加后的结果对当前的PC进行更新。例3.28PC相对寻址。如:BRNEWPC指令执行前

指令执行后

PC = 1001h PC = 1005h标号NEWPC对应的地址为1005h。

16位的PC相对寻址主要用于条件跳转指令编码(例如:Bcond、BcondD、CALLcond)。指令编码的第25位表示源操作数的寻址方式,跳转的偏移量以16位有符号数的形式存放在指令字的最低有效位上,指令编码的第21位决定跳转的类型(D=0表示标准跳转,D=1表示延迟跳转)。对于标准跳转来说,跳转条件一旦满足便立即跳转,新的PC值=偏移量+当前PC值+1;而对于延迟跳转来说,在条件满足的前提下,需继续执行后面的三条指令后再进行程序跳转,新的PC值=偏移量+当前PC值+3,如图3.14所示。图3.1416位PC相对寻址方式编码

24位的PC相对寻址涉及到的控制指令主要有BR、BRD、CALL、RPTB和RPTBD。在指令编码中,指令字中的最低24位有效位上存放的是源操作数或者是标号对应的PC值,新的PC值直接由指令字中的最低24位有效位中的数据决定,第24位代表跳转类型(D = 0表示标准跳转,D = 1表示延迟跳转)。其中延迟跳转与上面的16位的PC相对寻址情况相同,需延迟三条指令后再进行程序跳转,图3.15是24位PC相对寻址方式编码。图3.1524位PC相对寻址方式编码3.2.6循环寻址循环寻址是DSP中经常用到的一种寻址类型,它可以实现对某一特定存储区域进行循环操作,这种寻址类型对于数字信号处理中的FIR、卷积等运算有着极其重要的意义。循环寻址的实质是实现一个滑动窗,窗内包含要处理的最新数据,每处理完当前的数据缓冲寄存器中的数据,指针会按一定步长移动,使新的数据进来覆盖旧的数据,然后对缓冲器中的数据再进行处理,如此往复,当指针到达缓冲区的末端时,重新设置指针指向缓冲器首地址。图3.16(a)表示包含6个数值的循环缓冲器,图3.16(b)表示这个缓冲器是如何在C3x的存储空间内实现的;图3.17表示写入3个值后的缓冲器状态;图3.18表示写入8个值后的缓冲器状态。图3.16循环缓冲器的逻辑和物理表示图3.17写入3个值后的循环缓冲器的逻辑及物理表示图3.18写入8个值后的循环缓冲器的逻辑及物理表示在TI的DSP中,循环寻址的基本语法:

*ARn++(step)%

*Arn--(step)%与循环寻址相关的概念包括以下几个方面:

(1)辅助寄存器ARn。在循环寻址中,辅助寄存器ARn存放的是数据基址,数据地址的改变是在ARn的基础上通过加上或者减去步长step实现的,因此第一次对循环队列寻址时,辅助寄存器必须指向此循环队列的某一个确定的单元。

(2)步长step。步长step是辅助寄存器加上或减去的值。在循环寻址中,使用的步长必须小于等于块的长度,无论是用立即数还是用索引寄存器作为步长的调整量,步长step都被当作无符号整型数对待。

(3)缓冲器的大小。缓冲区间一般是由块寄存器BK中存储的循环缓冲器长度R来确定的,缓冲空间不大于64K(16bit)。

(4)缓冲器的起始地址。缓冲器的起始地址与缓冲器的长度必须满足公式:2K≥R,其中K为循环缓冲器的起始地址的最低有效位二进制值中“0”的个数,R为循环缓冲器长度。表3.4说明了公式2K≥R的含义。表3.4公式2K>R的含义循环寻址算法如下:若0<ARn+step<BK,则Arn=ARn+step否则,若ARn+step≥BK,则Arn=ARn+step-BK若ARn+step<0,则ARn=ARn+step+BK图3.19说明了如何实现循环缓冲的原理。图3.19循环缓冲的实现例3.29循环寻址。寄存器R1、R2、R3、R4、R5内存放的整型数分别为1、2、3、4、5,设AR0=30000h,循环寻址的空间为6(即块寄存器BK=6),按照下面的程序运行,运行后的结果如表3.5所示,其中第一列为执行的指令,第二列和第三列分别为各指令执行后AR0所指向的地址及该地址中存放的数据。

.dataAddress .word30000;注意该地址的尾部零的个数不能少于由BK确定的值,

;此处BK=6,按照2K>R规则,K必须大于等于3,即;Addres二进制的尾部至少应该有3个0 .textLDP@Address ;装载数据页指针LDI6,BK ;设置循环空间LDI@Address,AR0 ;初始化AR0,确定第一次寻址时指针的位置LDI1,R1LDI2,R2LDI3,R3LDI4,R4LDI5,R5 ;装载寄存器STIR1,*AR0++(4)%STIR2,*AR0--(6)%STIR3,*AR0++(3)%STIR4,*AR0++(5)%STIR5,*AR0++(1)% ;向存储器中装入数据end表3.5循环寻址的例子例3.30用循环寻址实现FIR滤波器。循环寻址对实现FIR滤波器特别有用。图3.20是FIR滤波器一种可能的数据结构,AR0初值指向h(N-1),AR1初值指向x(0)。图3.20FIR滤波器的数据结构

*冲激响应

.sect"Impulse_Resp"H .float1.0

.float0.99

.float0.95

.float0.1;输入缓冲器X .usect"Input_Buf",128

.dataHADDR .wordHXADDR .wordXN .word128

*初始化

LDPHADDR

LDI@N,BK ;装入块大小

LDI@HADDR,AR0;装入冲激响应指针

LDI@XADDR,AR1 ;装入输入样本缓冲器底部指针

TOP: LDF IN,R3;读输入样本STF R3,*AR1++% ;存储其它样本,并使指针指向缓冲器顶部LDF 0,R0 ;初始化R0LDF 0,R2 ;初始化R2;滤波器RPTS N–1 ;重复下条指令MPYF3 *AR0++%,*AR1++%,R0||ADDF3 R0,R2,R2 ;相乘,相加ADDF R0,R2 ;最后乘积累加STF R2,Y ;保存结果BU TOP ;重复end3.2.7位反转寻址

TMS320C3x的位反转寻址方式可用于实现快速傅里叶变换(FFT)。当数据按递增序列的顺序完成FFT变换后,其结果用位反转次序表示。为了按正确次序恢复此数据,必须交换某些存储位置。若使用位反转寻址方式,就不需要交换数据了。数据按位反转次序进入CPU,而不是顺序进入。为了达到正确的位反转入口,其基地址必须定位在一个边界上,这个边界是由FFT表的大小决定的。和循环寻址类似,位反转寻址的基地址必须遵循以下标准:

(1)缓冲器的大小必须小于等于64 KB;

(2)基地址需满足以下公式:2K≥R,其中K为缓冲器起始地址的最低有效位二进制值中“0”的个数,R为缓冲器的长度。以2n点的FFT来说明CPU位反转运算。当实部和虚部存储在单独的数组中时,起始地址的最低有效位中必须有n位为0,并且IR0必须等于2n-1(FFT大小的一半)。当实部和虚部存储在连续的存储区域时(存储顺序为:实部0、虚部0、实部1、虚部1、实部2、虚部2、……),起始地址的n+1位最低有效位必须为0,并且IR0必须等于2n。用一个辅助寄存器指向数据的物理地址,把IR0的内容作为偏移量加到这个辅助寄存器中,并执行高位向低位进位的加法运算,就可实现位反转寻址,其中IR0为无符号整数,且IR0 = 2n-1。例3.31位反转寻址。假定一个8位的辅助寄存器AR2赋值01100000(96)是存储器数据起始地址,若此存储器有16条记录,IR0被赋值00001000(8),下列指令顺序执行后的结果是:

*AR2++(IR0)B;AR2 = 01100000(第0个值)

*AR2++(IR0)B;AR2 = 01101000(第1个值)

*AR2++(IR0)B;AR2 = 01100100(第2个值)

*AR2++(IR0)B;AR2 = 01101100(第3个值)

*AR2++(IR0)B;AR2 = 01100010(第4个值)

*

AR2++(IR0)B;AR2 = 01101010(第5个值)

*AR2++(IR0)B;AR2 = 01100110(第6个值)

*AR2;AR2 = 01101110(第7个值)表3.6说明了利用位反转寻址对FFT数据进行倒序的结果,表中左边两列为倒序前的序列,右边两列为倒序后的序列。表3.6变址步数和位反转寻址3.3寻址方式

3.3.1普通寻址方式普通寻址方式涉及到的指令一般都是通用指令,如LDI、STI、ADDI、MPYI等。普通寻址方式的32位指令机器编码如表3.7所示。其中第31~29位是寻址方式的标识位,这三位为0表示普通寻址方式指令。第28~23位存放的是操作指令的机器代码。第20~16位存放的是目的操作数的机器编码。第22~21位(G)确定了源操作数的寻址类型,当G = 00时,表示源操作数的寻址类型为寄存器寻址,在第7~0位存放寄存器的代码;当G=01时,表示源操作数的寻址类型为直接寻址,在第15~0位存放源操作数的机器编码;当G = 10时,表示源操作数的寻址类型为间接寻址,第15~11位(modn)表示间接寻址的方式,第10~8位存放辅助寄存器ARn(AR0~AR7)的机器代码,第7~0位显示的是偏移量(disp)的机器编码;当G = 11时,表示源操作数的寻址类型为立即数寻址,第15~0位用于存放源操作数。表3.7普通寻址方式的编码3.3.2三操作数寻址方式三操作数寻址方式针对的是三操作数指令,如ADDI3、CMPF3、XOR3等。三操作数寻址方式的机器编码如表3.8所示,其中机器码的位31~29设置为001,表示三操作数寻址方式,位28~23用于存放操作指令的机器代码,位15~8用于存放源操作数1(src1)的机器码,位7~0用于存放源操作数2(src2)的机器码。位22~21(T)确定了源操作数的寻址方式,当T = 00时,src1、src2的寻址方式都为寄存器寻址;当T = 01时,src1的寻址方式为间接寻址,src2的寻址方式为寄存器寻址;当T = 10时,src1的寻址方式为寄存器寻址,src2的寻址方式为间接寻址;当T = 11时,src1、src2的寻址方式都为间接寻址。在三操作数的间接寻址方式中,可以使用索引寄存器IR0或IR1,但偏移值只限0和1。表3.8三操作数寻址方式的编码3.3.3并行寻址方式使用并行寻址方式可以利用并行指令最大程度地节省指令的执行时间。在并行寻址方式中,位31~30为10,标识并行寻址方式;位29~26存放操作的指令代码;位25~24确定并行方式,对操作数的使用进行解释;位23~22确定目的操作数(dst)的寄存器形式,位21~19用于存放源操作数1(src1),位18~16用于存放源操作数2(src2),位15~8用于决定源操作数3(src3),位7~0用于决定源操作数4(src4)。并行寻址中操作数的具体要求如下:

src1:R0~R7

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论