第三章ADSP的指令系统_第1页
第三章ADSP的指令系统_第2页
第三章ADSP的指令系统_第3页
第三章ADSP的指令系统_第4页
第三章ADSP的指令系统_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

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

文档简介

ADSP技术与应用

——浮点SHARC系列

第3章SHARC系列的指令系统

3.1寻址方式3.2SHARC系列的指令系统3.3计算类操作3.4SHARC系列汇编语言编程举例3.1寻址方式

SHARC系列指令的特点和寻址方式

指令特点SHARC系列具有完备的、高效的、灵活的、高效的指令系统,它采用48位超长指令字(VLIW),所有的指令都是单周期的,并且可以在一条指令里并行完成多种操作。寻址方式立即寻址直接寻址间接寻址方式循环寻址位反转寻址立即寻址方式

立即寻址方式的操作数源操作数为立即数目的操作数只能是寄存器R0~R15(F0~F15)。立即数可以是2、10进制或者16进制数例如:R0=123;//将10进制整数123赋给R0R1=0X2FF;//将16进制整数2FF赋给R1F2=125.8;//将10进制数125.8赋给R0R2=B#0100;//将二进制数0100赋给R2直接寻址方式

使用绝对地址:R0=DM(0X30000);//DM区地址0X30000的数据赋给R0R1=DM(varname);//将DM区的变量值Ifnejumplabel1;//跳转到地址标号label1•采用PC相对地址:DO(PC,length)UNTILLCE;//其中length是个变量,循环执行PC+length程序段间接寻址方式-预调整方式

指令形式:DM(Mx,Ix)PM(Mx,Ix)方式1:使用M寄存器存储单元地址=I+M,不更新I寄存器例:R1=PM(m10,i15);R8=DM(m13,i11);方式2:使用立即数存储单元地址=I+立即数,不更新I寄存器例:R1=PM(0x11,i15);R8=DM(127,i11);

存储单元的地址等于M寄存器与I寄存器内容之和,但是指令执行后I寄存器内容保持不变。间接寻址方式-后修改方式

指令形式:DM(Ix,Mx)PM(Ix,Mx)方式1:使用M寄存器存储单元地址=I,用I+M更新I寄存器例:F5=PM(i9,m12);DM(i0,m3)=R3;方式2:使用立即数存储单元地址=I用I+立即数更新I寄存器例:F15=DM(i0,6);R1=PM(i15,0x11);

存储单元的地址等于I寄存器的当前值,指令执行后I寄存器被更新为M寄存器与I寄存器内容之和。间接寻址方式-修改地址

指令形式:MODIFY(Ix,Mx)方式1:使用M寄存器仅用I+M更新I寄存器例:MODIFY(i15,m10);MODIFY(i5,m6);方式2:使用立即数仅用I+立即数更新I寄存器例:MODIFY(i4,304);MODIFY(i15,0x56);仅更新Ix间接寻址方式说明

Mx寄存器和Ix寄存器分成两组DAG1和DAG2DAG1使用M0~M7和I0~I7,寻址空间在DM区DAG2使用M8~M15和I8~I15,寻址空间在PM区两组Mx和Ix寄存器不能交叉使用DM区使用DAG1组的M0~M7和I0~I7寄存器PM区使用DAG2组的M8~M15和I8~I15寄存器否则认为非法指令。间接寻址方式中可以是一个立即数如DM(I0,4)=R1是合法指令。循环寻址方式

寄存器Lx:缓冲区长度;寄存器Bx和Ix:缓冲区起始地址;缓冲区的边界判断和地址的计算方法如下:如果Mx>0时,且Ix+Mx<Bx+Lx,则Ix=Ix+Mx;如果Mx>0时,且Ix+Mx≥Bx+Lx,则Ix=Ix+Mx–Lx;如果Mx<0时,且Ix+Mx≥Bx,则Ix=Ix+Mx;如果Mx<0时,且Ix+Mx<Bx,则Ix=Ix+Mx-Lx。循环寻址方式说明

循环寻址方式注意事项

预调整地址方式不支持循环寻址方式。在向Bx寄存器写入起始地址的同时,对应的Ix寄存器 也会自动赋予相同的值。Bx、Lx、Ix三个寄存器的序号必须一致,而Mx寄存器 可以在同一个DAG组中任意选取。两个DAG中都可以设置循环缓存区Mx寄存器可以正也可以负对Lx和Bx寄存器清零,对应的Ix寄存器自动恢复线性 寻址方式。位反转寻址

SHARC系列的位反转寻址方式,通过两种方法实现:位反转模式•DAG1的I0提供的32位地址经过位反转送到DM总线•I0的值不变•使MODE1寄存器的位BR0=1•DAG2的I8提供的24位地址经过位反转送到PM总线•MODE1寄存器的位BR8=1位反转指令BITREVBITREV得到I0~I15的位反转地址,但不送到总线位反转的来历-FFT

FFT计算过程:输入-蝶形运算-整序(位反转)-输出位反转寻址的概念

位反转寻址主要针对FFT算法设计,FFT计算过程中输入数据的排列次序被按照一定规律打乱,称为逆序排列。用m=log2N位二进制数可以表示N个输入数据的下标,将二进制下标的高低位交换,就得到逆序序列。如N=8时,A3的下标是011,逆序后变成110,即A6,数组A0,A1,A2,A3,A4,A5,A6,A7逆序后变成A0,A4,A2,A6,A1,A5,A3,A7。位反转寻址可以自动的按照逆序的规律计算地址,节省了逆序操作的软件开销。SHARC系列提供了位反转寻址方式,单MODE1寄存器的BR0位置为1时,I0寄存器就按照位反转方式寻址。在位反转方式,I0的32位地址经过位反转处理后才送到DM地址总线上。可以利用位反转指令BITREV计算I0的起始地址和步长。从BUF1位反转传送到BUF2的例子

BITSETMODE1BR0;//设置位反转模式I1=BUF2;//I1指向目的缓冲区首址I0=BUF1;//I0指向源缓冲区首址BITREV(I0,0);//利用位反转指令得到I0的初值I2=LENGTH/2;BITREV(I2,0);M0=I2;//利用位反转指令设置步长LCNTR=LENGTH,DOLABLEUNTILLCER0=DM(I0,M0);//从BUF1中逆序取数LABLE:DM(I1,1)=R0;//顺序放到BUF2中3.2SHARC系列的指令系统

SHARC系列指令的概述

SHARC系列提供了完备的指令集,包括4类指令:计算指令类指令流程控制类指令数据传送类指令其它指令类指令大部分指令都是并行指令,一条指令中同时可以完成多种操作:条件判断数学计算数据传送地址修改(1)计算和数据传送

指令形式如指令:IFEQR0=R1+R2,DM(I1,M0)=R1;

完成相等判断,根据判断结果决定是否执行后面的相加和数据传送操作,并且按规定修改I1寄存器。(2)程序流控制

指令形式如指令:IFNEJUMPLABEL(DB),R0=R1+R5;

完成相等判断,根据判断结果决定是否执行后面的跳转和数据传送操作。指令中的伪指令后缀,表示为延迟跳转方式。(3)数据传送

数据在寄存器和存储器间传传送,或直接对寄存器、存储器置常数(称为立即数)。指令形式:如指令DM(0X12345)=R0;完成将寄存器内容传送到指定存储单元。(4)其它类

位修改/位测试/地址修改堆栈操作/等待中断等。指令形式:如指令:BITSETMODE1BR0;//设置位反转寻址模式MODIFY(I0,0X1234);//修改I0寄存器NOP;//空操作SHARC指令集简介

下面将每组各类指令列在表3-1中,条件(condition)列在表3-2中,计算(compute)作为一大类操作,将在后文介绍。表3-1中竖线中给出了指令的可选项列表,实际指令是从每对竖线中的多个参数选一个,指令中大写符号表示了实际指令的助记符,而小写标识符代表一类对象,其意义见表3-2。表中的斜体字表示指令中的可选操作项。表3-1指令集——计算和数据传送(1)

表3-1指令集——计算和数据传送(2)

表3-1指令集——程序流控制(1)

表3-1指令集——程序流控制(2)

表3-1指令集——数据传送

表3-1指令集——其它指令

指令中的循环终止码

指令中的条件和循环终止码列于表3-3中,它们来自于:

状态寄存器ASTAT以及MODE1、Flag输入、循环计数器的标志位。表3-3指令中的条件和循环终止码3.3计算类操作

计算类操作概述

计算类操作大致分为ALU的加/减运算移位器操作乘法器运算多运算操作,即双加/减并行ALU/乘法器运算等计算类运算的操作数SHARC系列的所有运算都必须在寄存器R0~R15及MR中进行操作数只能是R0~R15寄存器或立即数,而不能是存储器中的数值浮点运算和定点运算都用同样的寄存器R0~R15,但在浮点表达式中写为F0~F15。计算类操作和数据传送操作的表达式都采用代数符号

表示形式,直观易记,简洁紧凑。3.3.1ALU的运算指令

SHARC系列DSP的运算控制单元包括:•ALU•寄存器堆:

R0~R15(定点)或F0~F15(浮点)•移位器•乘法器•乘积寄存器:

MR=MR2:MR1:MR0ALU—算术逻辑单元

ALU的所有运算都必须在寄存器堆中进行定点运算时R0~R15为32位,浮点运算时为40位ALU的运算指令包括:32/40位浮点数加、减、加/减、平均;32位定点数加、减、加/减、平均;定点带进位加法、带借位减法;浮点和定点数转换;逻辑操作:AND、OR、XOR、NOT;倒数和平方根倒数;绝对值、最大值、最小值、比较;位段截取和放置。3.3.2移位器运算

移位器的操作数必须是定点数,对32位定点数可以进行以下操作:算术和逻辑移位循环移位位操作(置位、清位、位反转、位测试)字段操作,如位段提取和分解等移位操作会影响寄存器ASTAT中的3个状态标志位SV、SZ、SS。用户可以读取这几个标志位得到它们的状态。位操作与逻辑或组合

表3-6说明 在表3-6中,Rn、Rx、Ry可以是R0~15寄存器中的任何一个,Fn、Fx、Fy可以是F0~15寄存器中的任何一个。在FDEP、FEXT指令中的Ry的低12位(不算40位寄存器的最低8位)被当作<bit6>:<len6>。 定点寄存器始终被当成仅高32位存在,低8位既不参与也不考虑到FDEP、FEXT指令的位标记中,40位寄存器的位8被当成位0。 逻辑移位(LShift),Rn的低8bit不参与,右移时高位填0,低位送进位位,左移时,高位送进位位,低位写0; 算术移位(AShift),Rn的低8bit不参与,右移时高位符号扩展,低位送进位位,左移时,高位送进位位,低位写0; 移位量为正代表左移,为负代表右移;shf8指寄存器的bit15~8位段3.3.3乘法器操作

乘法器可以完成定点、浮点乘法,定点乘/累加等操作,它的操作与乘法器和乘积寄存器有关。乘积寄存器 乘积寄存器MR用来存放定点数的积,其长度是80位。80位的定点乘积寄存器从高到低分成3个寄存器:MR2(高16bit)MR1(中32bit)MR0(低32bit)乘法器特征

32或者40-bit浮点乘法器40-bit结果,可以截断为32bit乘法器与ALU联合实现单周期指令MAC32-bit定点乘法器 输入数据可以为整数或者小数64-bit乘积80-bit累加支持单指周期令MAC定点数乘积的存放(1)

定点数乘积的存放(2)

整数:如果乘法器输入为整型定点数,结果放在MR0(MR寄存器的低32bit)中。小数:两个输入操作数都是小数型定点有符号数,乘法器自动将结果左移1位以去掉多余的符号位,相乘结果放在MR1(MR寄存器的中间32位)中。传送到寄存器:当从MR2读取32bit数据时,高16bit符号扩展。当从MR2、MR1、MR0向40bit寄存器送数时,低8bit填0。传送到MR:40bit寄存器的高32bit被写入。如果是写入到MR1,MR2作符号扩展,但写入到MR0时,不进行符号扩展。定点数乘积的取舍处理

定点数取舍是针对小数类型;取舍方法有两种:加指令后缀SSF或者SSFR使用取舍指令RND可以按照最接近方式取舍;可以按照接近0方式取舍;定点数乘积的饱和处理

设置饱和指令(SAT)后,当溢出(MV=1)时,乘积MR取最大值;定点数的饱和值可以返回到MR或者Rx寄存器;取舍和饱和处理指令

浮点数的乘、乘累加

浮点乘的乘数、被乘数、积是32位或者40位,在MODE1寄存器的RND32位指定;浮点数的积可以按照以下方式处理:最接近的值(IEEE)接近0或者截断(MODE1/TRUNC)浮点乘的结果总是在Fx寄存器中,如:

F12=F3*F7;浮点MAC采用算术流水方式实现,如:F12=F3*F7;F12=F3*F7,F8=F8+F12;(先读后写)

F8=F8+F12;3.3.4并行和多运算指令

SHARC系列的指令具有同时进行乘法、加法、减法等多个运算的功能,其中乘/加/减三运算并行使ADSP2106X完成FFT运算的速度大大提高。

多运算操作的基础:乘法器和ALU单元并行工作,其中ALU单元可以同时求出两个数的和、差。定点乘法器也具有乘法、累加并行工作的能力。并行指令的基本形式

条件判断和数据传送Ifcondition数据传送如:Ifeqdm(i0,m1)=astat,r7=pm(i8,m8);条件判断和计算加数据传送IfconditionCOMPUTER,数据传送如:Ifeqr6=r3-r11,dm(i0,m1)=astat;条件判断和分支Ifcondition分支如:Ifeqjumpaddr1;双加减(同时计算和、差)•Ra=Rx+Ry,Rs=Rx-Ry•Fa=Fx+Fy,Fs=Fx-Fy定点乘/累加及加/减/求平均MRF=MRF+R3~0*R7~4(SSF),Ra=R11~8+R15~12Rm=MRF+R3~0*R7~4(SSFR),Ra=R11~8-R15~12MRF=MRF-R3~0*R7~4(SSF),Ra=(R11~8+R15~12)/2Rm=MRF-R3~0*R7~4(SSF)浮点乘和ALU运算Fm=F3~0*F7~4,Fa=F11~8+F15~12Fm=F3~0*F7~4,Fa=F11~8-F15~12Fm=F3~0*F7~4,Fa=FLOATR11~8byR15~12Fm=F3~0*F7~4,Ra=FIXF11~8byR15~12Fm=F3~0*F7~4,Fa=(F11~8+F15~12)/2Fm=F3~0*F7~4,Fa=ABSF11~8Fm=F3~0*F7~4,Fa=MAX(F11~8,F15~12)Fm=F3~0*F7~4,Ra=MIN(F11~8,F15~12)乘和双加减Rm=R3~0*R7~4(SSFR),Ra=R11~8+R15~12,Rs=R11~8-R15~12Fm=F3~0*R7~4,Fa=F11~8+F15~12,Fs=F11~8-F15~12多运算指令的输入寄存器

指令的并行操作准则

大量的DSP指令是并行形式,指令的并行操作 遵循先读后写准则:如果并行指令中某个寄存器既是源操作数,又是目的操作数,DSP执行时总是将寄存器的旧值作源操作数。在指令执行后,寄存器才作为目的操作数,其内容才更新。当满足并行条件时,这种指令仍可以在单周期内完成。如果某个存储器单元既是源操作数,又是目的操作数,此指令不能在单周期内完成。DSP执行时总是先将存储器的旧值读人寄存器,然后才将新值写入此存储器。在一条并行指令内的几个操作的书写顺序是DSP的汇编语法规定的,并不是这几个操作的执行顺序。3.3.5其它类指令

这类指令不像前3组指令那样规则,包括:位操作指令修改DAG寄存器堆栈操作其它操作•空操作•待机•其它位操作指令

指令形式:BITSETsreg<data32>对系统寄存器sreg置位BITCLRsreg<data32>对系统寄存器sreg清0BITTGLsreg<data32>对系统寄存器sreg取反BITTSTsreg<data32>对系统寄存器sreg测试BITXORsreg<data32>对系统寄存器sreg异或按照<data32>中置位的位(非0位)对系统寄存器sreg进行相应位的置位、清0、取反、测试、异或。同时还有如下效果:当<data32>中非0位所对应的sreg中各位均置为1时,寄存器ASTAT中的BTF=l;当<data32>中非0位与sreg对应位置的各个位相同时,寄存器ASTAT中的BTF=1.修改DAG寄存器

指令形式:MODIFY(la,<data32>)修改DAG1的I0~I7寄存器MODIFY(Ic,<data24>)修改DAG2的I8~I15寄存器BITREV(I0,<data32>)完成位反序方式的地址寄存器修改BITREV(I8,<data24>)完成位反序方式的地址寄存器修改堆栈操作

指令形式:PUSHLOOP,PUSHSTS,PUSHPCSTK,FLUSHCACHE;POPLOOP,POPSTS,POPPCSTK,FLUSHCACHE;对下述对象作压栈或出栈操作:循环地址和循环计数器(LOOP);状态寄存器(STS);PC堆栈(PCSTK);以及刷新(清除)指令Cache这4个操作可以在一个周期完成其它指令

NOP

空操作,仅程序地址增1。IDLE DSP进入低功耗等候状态,程序地址不变,直到某个中断出现才执行中断服务程序和后续指令。IDLE16

仅适用于ADSP21061,类似IDLE指令,但DSP的时钟频率等于输入时钟的1/16,其功耗更低。CJUMP函数名(DB)CJUMP(PC,<reladdr24>)(DB) 仅由C编译器产生,相当于跳转指令操作和帧指针I6、堆栈指针I7的保存操作。RFRAME

仅由C编译器产生,相当于I6、I7的恢复操作。3.4SHARC系列汇编语言编程举例

SHARC系列DSP汇编程序的基本特点

DSP指令编程与C语言类似;它不区分指令的大小写,例如寄存器R0,也可写成r0,条件GT也可写成gt;R0~R15与F0~F15实际上是一种寄存器当寄存器写成R0~R15时,DSP将其当成32位定点寄存器, 执行定点数据格式的运算、位操作、移位操作。当寄存器写成F0~F15时,DSP将其当成40位浮点寄存器,执行浮点格式的运算;包括在/**/或{}中的内容是注释;3.4.1并行指令举例

例1.f0=dm(i0,m0),pm(i8,m8)=f0;如果i0指向DM,i8指向PM,则这条指令可以在一个周期内完成。f0的值先写入i8指向的PM存储器单元,然后才将i0所指的DM存储器单元值读入f0。汇编语法规定对DM的操作必须写在对PM的操作之前。例2.f0=f0+f2,f2=f0-f2,f4=dm(i1,m0),f5=pm(i9,m8);如果i1指向DM,i9指向PM,则这条指令可以在一个周期内完成。f0、f2的值先作为源操作数,求出其和、差,再将其和、差放到f0、f2中。并行指令举例(续)

例3.f13=f1*f4,f12=f8+f12,f14=f8-f12,f4=dm(i2,m0),f1=pm(i15,m9);如果i2指向DM,i15指向PM,则这条指令可以在一个周期内完成。f1、f4的值先作为源操作数,求出其乘积,放到f13中,然后f1、f4的值被相应存储器单元的值更新,同时f12的旧值先作为源操作数,求出f8、fl2的和、差,再分别放到f12、f14中。这是DSP并行度最高的指令,在FFT变换中频繁使用,因此FFT变换也是DSP功耗最大的运算。实际上,在FFT变换的同时,DSP内部的多个DMA还可以用最高达40MHz的速度工作,这时候,DSP的功耗更大3.4.2条件执行指令

SHARC系列在进行条件判断的同时,还可以完成其它操作,下面是两个典型的例子。例1.ifFLAG0_INfl3=f1*f4,fl2=f8+fl2,f14=f8-fl2,f4=dm(i2,m0);当FLAG0管脚的输入信号为高电平时,执行这些运算和数据存取。当FLAG0管脚的输入信号为低电平时,不执行这些运算和数据存取。条件执行指令(续)

例2.ifLTf12=f8+fl2,f14=f8-f12,f4=dm(i2,m0);当ALU<0时,执行这些运算和数据存取。当ALU>=0时,不执行这些运算和数据存取。

ADSP2106X的这种条件执行指令省去了其它种类DSP进行相应条件判断时的跳转操作,指令效率高,简明易读,且无论条件是否满足,上述程序的执行时间不变。条件执行指令(续)

ADSP2106X不支持组合条件,当需要多种条件都满足时,就得用跳转指令。此外还有条件调用、条件跳转等指令,条件是否满足,含有条件调用、条件跳转的程序执行时间不同。例3.ifGTcallsubl(DB);…….;

当条件满足时,才调用子程序,由于使用了迟延调用,在调用前,先执行后续两条指令。3.4.3循环指令

SHARC系列提供了功能灵活方便的循环指令,下面是单重循环的例程段。lcntr=16,doloop1untillce;指令1;指令2;.....指令K-3;指令K-2;指令K-l;loop1:指令K;将K条指令构成的循环体执行16次,注意在循环体的最后三条指令不能是调用、跳转指令。循环指令(续)

SHARC支持最多6层循环,循环的次数可以是常数表达式、寄存器。下面是一个三重循环,其中最内层循环用PC相对地址作为循环体最后一条指令的地址,省去了注明循环体结束标号,它将后续三条指令执行

65535次:lcntr=16-4,doloop1untillce;r6=rl-r2;

lcntr=r6,doloop2untillce;

……;

lCntr=65535,do(PC,3)untillce;

……;

loop2:……;……;loop1:……;3.4.4条件循环指令

用条件来执行循环体,循环体内的指令应有可能使指定条件不成立,否则,此循环一旦执行,就成为死循环。下面是一个例子,如果SZ这个条件不满足,就一直执行反复后续4条指令:

do(PC,4),untilSZ; ......;3.4.5循环寻址

通过定义L寄存器和b寄存器,DSP

温馨提示

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

评论

0/150

提交评论