1、第三章 DSP指令系统与特点,第一节 数据寻址方式,第二节 程序存储器地址的生成方式,第三节 流水线,第四节 指令系统概述,Smem:16位单寻址操作数。Xmem:16位双寻址操作数,从DB数据总线上读出。Ymem:16位双寻址操作数,从CB数据总线上读出。dmad:16位立即数,数据存储器地址。pmad:16位立即数,程序存储器地址。PA: 16位立即数,I/O口地址。src: 源累加器(A或B)。dst: 目的累加器(A或B)。lk: 16位长立即数。,第一节 TMS320C54x的数据寻址方式,1立即数寻址2绝对地址寻址3累加器寻址4直接寻址5间接寻址6存储器映象寄存器寻址7堆栈寻址,寻
2、址分类,1立即数寻址,在操作数前面需要加字号来说明该操作数为立即数。否则会把该操作数误认为是一个地址,从而把立即数寻址变成绝对地址寻址。,特点,指令中包含有执行指令所需要的操作数。立即数分为3、5、8或9位的短立即数和16位的长立即数两种。短立即数可包含在单字或双字指令中,长立即数在双字指令中。,注意,LD #93h,A LD 93h,A,举例,2绝对地址寻址,特点,在指令中包含有所要寻址的存储单元的16位地址。这个16位的地址可以用其所在单元的地址标号或者16位符号常数来表示。,(1)数据存储器地址(damd)寻址,用一个符号或一个数来确定数据空间的一个地址。,方法,MVKD SAMPLE,
3、*AR3,举例,用一个符号或一个具体的数来确定程序存储器中的一个地址,2绝对地址寻址,(2)程序存储器地址(pmad)寻址,方法,MVPD TABLE,*AR4,举例,用一个符号或一个常数来确定外部I/O口地址,2绝对地址寻址,(3)PA寻址 端口(PA),方法,PORTR FIFO,*AR5,举例,用一个符号或一个常数来确定数据存储器中的一个地址,2绝对地址寻址,(4)*(lk)寻址,方法,LD *(BUFFER),A,举例,特点,允许所有使用Smem寻址的指令去访问数据空间的任意单元而不改变数据页指针(DP)的值,也不用对ARx进行初始化,用累加器中的数值作为地址来读写程序存储器。,方法,
4、READA Smem WRITA Smem,举例,特点,可用来完成程序存储器单元的数据与数据存储器单元的数据进行交换,3累加器寻址,可以在不改变DP或SP的情况下,随机地寻址128个存储单元中的任何一个单元。,用一个符号或一个常数来确定7位偏移值,与DP或SP共同形成16位的数据存储器实际地址。,4直接寻址,方法,LD #x,DPLD u,A ADD v,A =SSBX CPL LD X1,A ADD Y2,A,举例,特点,CPL=0 7位dma域与9bit的DP相结合形成16位的数据存储器地址。CPL=1 7位dma域加上(正偏移)SP的值形成16位的数据存储器地址。,DP值是从0511(2
5、9-1),以DP为基准的直接寻址把存储器分成512页,7位的dma范围从0127,每页有128个可访问的单元。,5间接寻址,方法,特点,(AR0AR7)ARAU0/ARAU1 16位无符号算术运算寻址范围为64K,能在一个指令中访问两个数据存储器单元,两个独立的存储器单元读数据读一个、写另一个存储器单元读写两个连续的存储器单元,5间接寻址,(1)单操作数寻址,LD *AR1,B,单操作数间接寻址的硬件框图,单数据存储器操作数间接寻址类型,1) 循环寻址 循环缓冲区的长度值存放在循环缓冲区长度寄存器BK中,BK中的数值由指令设定。长度为R的循环缓冲器必须从一个N位地址的边界开始,即循环缓冲器基地
6、址的最低N位必须为0。N是满足2NR的最小整数。R的值必须装入BK。例如,含有31个字的循环缓冲器必须从最低5位为0的地址开始,即xxxx xxxx xxx0 00002,N=5,2N=25R=31,且31必须装入BK。如:STM #1k,BK如果R=32,则最小的N值为6,循环缓冲区的起始地址必须有6个最低有效位为0,即 00 00002。,2) 位倒序寻址 在这种寻址方式中,用AR0存放FFT点数的一半整数N,用另一辅助寄存器指向一数据存放的物理单元。当使用位倒序寻址把AR0加到辅助寄存器中时,地址以位倒序的方式产生,即进位是从左向右,而不是从右向左进位。 例如: 0110 1000 +
7、0000 1000 0110 0100,以8位辅助寄存器为例,AR1表示了在存储器中数据的基地址(0110 0000)2,AR0的值为(0000 1000)2。利用以下两条语句可以向外设口(口地址为PA)输出整序后的FFT变换结果:RPT #15 重复执行下条指令15+1次PORTW *AR1+0B,PA 向外设口PA输出整结果,位倒序对FFT变换结果的序号调整,0页寻址。不影响当前DP或SP值 。用于直接寻址和间接寻址,用来修改存储器映象寄存器,6存储器映象寄存器寻址,功能,LDM PRD,A,举例,特点,方法,高9位数据存储器地址被置0,利用指令中的低位地址访问MMR。,7堆栈寻址,从高地
8、址向低地址方向生长,SP)来管理堆栈,SP始终指向堆栈中所存放的最后一个数据,即SP指针始终指向栈顶。在压入操作时,先减小SP的值,再将数据压入堆栈;在弹出操作时,先从堆栈弹出数据,再增加SP的值。,用来在中断和子程序调用时自动保存程序计数器(PC)中的数值,也能用来保护现场或传送参数,功能,特点,PSHD *AR2 POPD *AR3,第二节 程序存储器地址的生成,程序地址生成器(PAGEN)构成,程序计数器(PC)重复计数器(RC)块重复计数器(BRC)块重复起始地址寄存器(RSA)块重复结束地址寄存器(REA),核心,16位程序计数器(PC)内中保存某个内部或外部程序存储器的地址。,地址
9、内容为:即将取指的某条指令;某个16位立即操作数;系数表。在程序存储器中的地址,将程序存储器地址加载到程序计数器的途径,1分支转移操作,通过分支转移指令改写PC,可以改变程序的流向。而子程序调用指令则通过将一个返回地址压入堆栈,执行返回时恢复原地址。,可执行:分支转移循环控制子程序操作,功能,方法,条件分支转移无条件分支转移,BD用指令中所给出的地址加载PCBACCD用所指定的累加器的低16位作为地址加载PC。,带延迟不带延迟操作,转移种类,BCD如果指令中所规定的条件得到满足,就用指令中所给出的地址加载PC;BANZD如果当前辅助寄存器不等于0,就用指令中所规定的地址加载PC。,BC new
10、,AOV BANZ loop,*AR2-,B nextBACC A,2调用和返回,转移前,原程序的下条指令的地址被压入堆栈,而在返回时则将这个地址弹出至PC,使被中断了的原程序能继续执行。,当采用调用指令进行子程序或函数调用时,DSP中断当前运行的程序,转移到程序存储器的其它地址继续运行。,功能,方法,无条件调用与返回有条件调用与返回,带延迟不带延迟,CALLd lopRET main,3条件指令中的条件判断,多重条件判断,BC pmad,cond,cond,cond,相与关系,相或关系,BC pmad,condBC pmad,cond,第1组,例如,可以从A类中选一个条件,同时可以从B类中选
11、择一个条件。但是不能从同一类中选择两个条件。另外,两种条件测试的累加器必须是同一个。,可以同时测试AGT和AOV,但不能同时测试AGT和BGT。,第2组,例如,可以在A、B、C三类中各选择一个条件,但不能从同一类中选择两个条件,可以在A、B、C三类中各选择一个条件,但不能从同一类中选择两个条件,特例,如果条件分支转移出去的地方只有12字的程序段,则可以用一条单周期条件执行指令(XC)来代替分支转移指令:XC n,cond,cond,cond当n=1,且条件得到满足,就执行紧随此条件指令后的个字指令。当n=2,且条件得到满足,就执行紧随此指令后的1个双字指令或者2条单字指令。当条件不满足,就依n
12、的值执行1条或2条NOP指令。,特点2,特点1,4单条指令的重复操作,重复执行(RC)+1次。RC内容不能编程设置,只能由重复指令(RPT和RPTZ)中的操作数加载。操作数n的最大值为65 535,最大重复执行次数为65 535+1。,一旦重复指令被取指、译码,直到重复循环完成以前,对所有的中断(包括 ,但不包括 )均不响应。,功能,重复执行下一条指令,重复过程,当RPT指令执行时:首先把循环的次数装入循环计数器(RC),其循环次数n由一个16位单数据存储器操作数 Smem或一个8位或16位常数k或lk给定。这样, 紧接着的下一条指令会循环执行n+1次。循环,RC在执行减1操作时不能被访问。注
13、意:该循环内不能套用循环。 当RPTZ指令执行时:对目的累加器dst清0, 循环执行下一条指令n+1次。,特点,5块重复操作,利用C54x内部的块重复计数器(BRC,加载值可为065 535)、块重复起始地址寄存器(RSA)、块重复结束地址寄存器(REA)与程序块重复指令RPTB,可对紧随RPTB、由若干条指令构成的程序块进行重复操作。,功能,将重复操作的范围扩大到任意长度的循环回路,注意,1.RPT指令一旦执行,不会停止操作,即使有中断请求也不响应;2.RPTB指令可以响应中断;,例3-6 对数据组x5中的每个元素加1。.bss x,5 ;为数组x分配5个存储单元begin: LD #1,1
14、6,B ;将1左移16位放入B的 ;高端字的最低位STM #4,BRC ; 4BRC,(PC)+2 RSA STM #x,AR4;将x的首地址赋给AR4 RPTB next-1;将NEXT-1 REA ADD *AR4,16,B,A ;x地址的内容左移16位加 ; B的高端字,结果放ASTH A,*AR4+ ;将A的高端字存入x单元, ;完成加1操作next: LD #0,B ;对B清零 ;必需next-1作为结束地址,对寄存器的占用,6循环的嵌套,执行RPT指令时占用RPTC寄存器(重复计数器);执行RPTB指令时要用到BRC、RSA和RSE寄存器。只有一套块重复寄存器,故块重复操作不能嵌套
15、。 由于RPT与RPTB两者用了不同的寄存器,因此RPT指令可以嵌套在RPTB指令中,实现循环的嵌套。执行BANZ指令只占用辅助寄存器ARx。不会与RPT RPTB指令相冲突。,嵌套原则,参与嵌套循环的寄存器不能重复使用,图3-3 一个三重循环嵌套结构,第三节 流水线,流水线操作,在执行多条指令时,将每条指令的预取指、取指、译码、寻址、读取操作数、执行等阶段,相差一个阶段地重叠地执行。,流水线操作的优点,一条k段流水能在k+(n-1)个周期内处理n条指令。其前k个周期用于完成第一条指令,其余n-1条指令的执行需要n-1个周期。而非流水处理器上执行n条指令则需要nk 个周期。当指令条数n较大时,
16、可认为每个周期内执行的最大指令个数为k。,预取指P取指F译码D寻址A读取操作数R执行X,流水线操作,在第一个机器周期用PC中的内容加载PAB,在第二个机器周期用读取到的指令字加载PB。,第三个周期用PB的内容加载指令寄存器IR,对IR内的指令进行译码,产生执行指令所需要的一系列控制信号。,预取指P取指F译码D寻址A读取操作数R执行X,流水线操作,用数据1读地址加载DAB,或用数据读地址加载CAB,修正辅助寄存器和堆栈指针。,读数据1加载DB,或读数据2加载CB;用数据3写地址加载到EAB,以便在流水线的最后一级将数据送到数据存储空间。,执行指令,或用写数据加载EB。,空转浪费周期,1延迟分支转
17、移的流水线图,无延迟流水线分支转移的问题,地址 指令a1,a2 B b1 这是一个四周期、二字分支指令a3 i3 这是任意的一周期、一字指令a4 i4 这是任意的一周期、一字指令. .b1 j1,例3-7,分支转移指令流水线图,用分支转移指令的地址a1加载PAB。,取得双字分支转移指令,取得双字分支转移指令,分支转移指令流水线图,i3和i4指令取指。由于这两条指令处在分支转移指令的后面,虽然已经取指,但不能进入译码级,且最终被丢弃。,分支转移指令进入译码级,用新的值b1加载PAB,分支转移指令流水线图,j1指令取指,双字分支转移指令进入流水线的执行级,执行j1指令,双字分支转移指令进入流水线的
18、执行级,由于i3和i4指令是不允许执行的,所以这两个周期均花在分支转移指令的执行上。,允许跟在延迟分支转移指令之后的两条单字或一条双字指令可以被执行,延迟分支转移,注意,1.延迟操作指令后面只有两个字的空 隙,因此不能在此空隙中安排任何 一类分支转移指令或重复指令;2.在CALLD或RETD的空隙中还不能安 排PUSH和POP指令。3.延迟操作指令比它们的非延迟型 指令要快,在调试延迟型指令时, 直观性稍差一些,因此希望在大多 数情况下还是采用非延迟型指令。,例3-8 在完成R=(x+y)*z操作后转至next。可以分别编出如下两段程序:利用普通分支转移指令B 利用延迟分支转移指令BDLD x
19、,A LD x,AADD y,A ADD y,ASTL A, s STL A, sLD s,T LD s,TMPY z,A BD next STL A, r MPY z,A B next STL A, r(共8个字,10个T) (共8个字,8个T),在空闲的随后两周期中执行下两条指令,XC n,cnd,cnd,cnd如果条件满足,则执行下面n(n=1或2)条指令,否则下面n条指令改为执行n条NOP指令。,2条件执行指令的流水线图,条件执行指令XC,有下列程序:地址 指令a1 i1a2 i2a3 i3a4 XC 2, conda5 i5a6 i6,条件执行指令流水线图,XC指令的地址a4加载到P
20、AB,取XC指令的操作码,求解XC指令所规定的条件。如果条件满足,则后面指令i5和i6进入译码级并执行;否则不对i5和i6指令译码。,1. XC是一条单字单周期指令,与条件跳 转指令相比,具有快速选择其后1或2 条指令是否执行的优点 ;2. XC指令在执行前2个周期就已经求出 条件,如果在这之后到执行前改变条 件(如发生中断),将会造成无期望 的结果 。3. 要尽力避免在XC指令执行前2个周期 改变所规定的条件 。 4. 并没有规定XC指令后的一条或两条指 令必须是单周期指令。,注意,CPU在单个周期内两次访问双寻址存储器,3双寻址存储器的流水线冲突,流水线冲突原因,不会产生流水线冲突的情况,
21、(1)在单周期内允许同时访问DARAM的不同块。(2)当流水线中的一条指令访问某一存储器块时, 允许流水线中处于同一级的另一条指令访问 另一个存储器块。(3)允许处于流水线不同级上的两条指令同时访 问同一个存储器块。,是利用一次访问中对前、后半个周期分时进行访问的缘故。,CPU能够在单周期内对DARAM进行两次访问而不冲突,对PAB/PB取指 利用前半周期对DAB/DB读取第一个数据 利用前半周期对CAB/CB读取第二个数据 利用后半周期对EAB/EB将数据写存储器 利用后半周期,(1) 同时从同一存储器块中取指和取操作数(都在前半个周期);2.同时对同一存储器块进行写操作和读(第二个数)操作
22、(都在后半周期)。,解决冲突办法,人为合理安排指令,错开访问时序,CPU通过写操作延迟一个周期,或者通过插入一个空周期的办法,自动地解决,CPU同时访问DARAM的同一存储器块就会发生时序上的冲突。,从DARAM块中同时取指和取操作数,冲突,延迟一个周期,4解决流水线冲突的方法,(1)可能发生流水线冲突的情况,1) 辅助寄存器(AR0AR7)。2) 重复块长度寄存器(BK)。3) 堆栈指针。4) 暂存器(T)。5) 处理器工作方式状态寄存器(PMST)。6) 状态寄存器(ST0和ST1)。7)块重复计数器(BRC)。8)存储器映象累加器(AG、AH、AL、BG、BH、BL)。,流水线冲突情况分
23、析,发生流水线冲突的例子,在流水线的执行阶段进行写操作,在流水线的寻址阶段生成地址,冲突,无等待周期问题,解决,数据未准备好,发生流水线冲突的例子,在流水线的执行阶段进行写操作,读数阶段将常数10写到AR1,冲突,同时利用E总线,CPU自动地将STM的写操作延迟一个周期,在流水线的寻址阶段生成地址,新冲突,数据未准备好,解决,发生流水线冲突的例子,STLM指令后面插入一条NOP指令,在流水线的执行阶段进行写操作,读数阶段将常数10写到AR1,在流水线的寻址阶段生成地址,E总线错开,解决,数据准备好,解决,4解决流水线冲突的方法,(2)用等待周期表解决流水线冲突,等待周期表给出了对存储器映象寄存
24、器以及ST0、ST1、PMST的控制字段进行写操作的各种指令所需插入的等待周期。对双字或三字指令,都会提供隐含的保护周期。利用这些指令提供的隐含的保护周期,有时可以不插NOP指令。,等待周期表1,例3-11 利用表3-8等待周期表1选择插入的NOP数。SSBX SXMNOPLD x,B 由于LD x,B是一条单字指令,不提供隐含的保护周期。根据表3-8的等待周期表1,应当在SSBX SXM 指令后插入一条NOP指令。而SSBX SXMLD *(x),B由于LD *(x),B是一条双字的绝对寻址指令,它隐含一个等待周期,故SSBX指令就不要再插NOP指令了。,ST1第8位SXM0禁止符号位扩展S
25、XM1允许符号位扩展,例3-12 利用隐含等待周期解决流水线冲突。LD GAIN ,TSTM #input,AR1MPY *AR1+,A例3-13利用表3-8等待周期表3插入NOP周期解决流水线冲突。STLM B,AR2NOPSTM #input,AR3MPY AR2+,*AR3+,A,LD 中写T和STM中写AR1要用到E总线,由于STM是一条双字指令,隐含一个等待周期,故对于AR1来说,等待周期为0。,STM中写AR3要用到E总线,会与STLM中写AR2用E总线相冲突,查表3-8等待周期表3的控制字段为AR3,STLM指令后应插入2个NOP,但由于下条指令STM隐含1个等待周期,故只需要插
26、入一条NOP指令。,第四节 指令系统概述,TMS320C54x是TMS320系列中的一种定点数字信号处理器,它的指令系统分助记符形式和代数式形式两种。共有指令129条,由于操作数的寻址方式不同,派生至205条。,1.可同时读入2或3个操作数;2.支持双精度运算的32位长操作数指令;3.可进行单条指令重复和块指令重复操作;4.有块存储器传送指令和并行操作(如并行存储和加载、并行存储和加/减法、并行存储和乘法、并行加载和乘法)指令;5.设有条件存储指令及延迟操作指令、有从中断快速返回指令;6.有为特殊用途设计的指令(如支持FIR滤波、最小均方算法LSM、多项式计算以及浮点运算);7.有为省电安排的
27、空转指令。,TMS320C54x指令系统的主要特点,TMS320C54x的指令集有近两百条指令,按功能分为如下几类: 算术运算指令逻辑运算指令程序控制指令装入和存储指令,一、算术运算指令,算术运算指令可分为如下几类: 加法指令 减法指令 乘法指令 乘加指令 乘减指令 双数/双精度指令 特殊操作指令,1、加法指令,定点DSP中数据表示方法,当它表示一个整数时,其最低位(D0)表示1,D1位表示2的1次方,次高位(D14)表示2的14方。如果表示一个有符号数时,最高位(D15)为符号位,0表示正数,1表示负数。例如,07FFFH表示最大的正数32767(十进制),而0FFFFH表示最大的负数-1(
28、负数用2的补码方式显示)。当需要表示小数时,小数点的位置始终在最高为后,而最高位(D15)表示符号位。这样次高位(D14)表示0.5,然后是0.25,最低位(D0)表示。所以4000H表示小数0.5,2000H表示小数0.25,而0001H表示16位定点DSP表示的最小的小数(有符号)0.000030517578125。,实现16位定点加法,C54X中提供了多条用于加法的指令,如ADD,ADDC,ADDM和ADDS。其中ADDS用于无符号数的加法运算,ADDC用于带进位的加法运算(如32位扩展精度加法),而ADDM专用于立即数的加法。,使用ADD完成加法,ld temp1,a;将变量temp1
29、装入寄存器A add temp2,a;将变量temp2与寄存器A相加 ;结果放入A中 stla,temp3;将结果(低16位)存入变量 ;temp3中。 注意,这里完成计算temp3=temp1+temp2,我们没有特意考虑temp1和temp2是整数还是小数,在加法和下面的减法中整数运算和定点的小数运算都是一样的。,ADD中寻址方式,ADD Smem ,SHIFT,src ,dst 例如: ADD *AR0,1,A,A ADD 60H,-1,A,A ADD *AR5,1,A,B ADD Xmem, SHFT, src 例如: ADD *AR5,1,AADD Xmem,Ymem, dst 例如
30、: ADD *AR2,*AR3,A,2、减法指令,实现16位定点减法,C54X中提供了多条用于减法的指令,如SUB,SUBB,SUBC和SUBS。其中SUBS用于无符号数的减法运算,SUBB用于带进位的减法运算(如32位扩展精度的减法),而SUBC为移位减,DSP中的除法就是用该指令来实现的。,减法指令使用举例,stm temp1,ar3;将变量temp1的地址装入ar3寄存器 stm temp3,ar2;将变量temp3的地址装入ar2寄存器 sub*ar2+, *ar3,b;相减,结果放入寄存器B(高16位)中, ; 同时ar2加1。 sthb,63h;将相减的结果(高16位)存入变量63
31、h,利用SUBC实现除法,在C54X中没有提供专门的除法指令,一般有两种方法来完成除法。一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于除以常数特别适用。另一种方法是使用SUBC指令,重复16次减法完成除法运算。,利用SUBC完成除法运算,ldtemp1,B;将被除数temp1装入B寄存 ;器的低16位rpt#15 ;重复SUBC指令16次subctemp2,b;使用SUBC指令完成除法stlB,temp3;将商(B寄存器的低16位) ;存入变量temp3sthB,temp4;将余数(B寄存器的高16位) ;存入变量temp4 注: 实际上是完成整数除法
32、,实现小数除法,在C54X中实现16位的小数除法与前面的整数除法基本一致,也是使用SUBC指令来完成。但有两点需要注意:第一,小数除法的结果一定是小数(小于1),所以被除数一定小于除数。在执行SUBC指令前,应将被除数装入A或B寄存器的高16位,而不是低16位。其结果的格式与整数除法一样。第二,应考虑符号位对结果小数点的影响。所以应对商右移一位,得到正确的有符号数。,3、乘法指令,实现16定点整数乘法,在C54X中提供了大量的乘法运算指令,其结果都是32位,放在A或B寄存器中。乘数在C54X的乘法指令很灵活,可以是T寄存器、立即数、存贮单元和A或B寄存器的高16位。如果是无符号数乘时,请使用M
33、PYU指令。这是一条专用于无符号数乘法运算的指令,而其它指令都是有符号数的乘法。,整数乘法举例,rsbxFRCT;清FRCT标志,准备整数乘ldtemp1,T;将变量temp1装入T寄存器mpytemp2,a;完成temp2*temp1,结果放 ;入A寄存器(32位),实现小数乘法,在C54X中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。C54X中提供了一个状态位FRCT,将其设置为1时,系统自动将乘积结果左移移位。两个小数(16位)相乘后结果为32位,如果精度允许的话,可以只存高16位,将低16位丢弃,
34、这样仍可得到16位的结果。,小数乘法举例,ssbx FRCT ;FRCT=1,准备小数乘法 ld temp1,16,a ;将变量temp1装入寄存器A的高16位 mpya temp2 ;完成temp2乘寄存器A的高16位,结 ;果在B中,同时将temp2装入T寄存器 sth b,temp3 ;将乘积结果的高16位存入变量temp3如:0.1(0x0ccd) x 0.7(0x599a) = 0.06997680664063(0x08f5)注:可以使用MPYR完成四舍五入。 比较如下结果 mpyr temp1,b ; T * temp1 - b,4、乘加和乘减指令,5、双精度/双数操作指令,6、特
35、殊指令,二、逻辑运算指令,逻辑指令包括与、或、异或、移位和测试指令1、与指令(AND),2、或、异或指令,3、移位和测试指令,三、程序控制指令,程序控制指令包括:分支指令调用指令中断指令返回指令重复指令堆栈操作指令混合程序控制指令,1、分支指令,2、调用与中断指令,3、返回指令,4、重复指令和堆栈操作指令,5、混合程序控制指令,四、装入和存储指令,装入和存储指令包括:一般的装入和存储指令条件存储指令并行装入和存储指令并行装入和乘法指令并行存储和加件乘指令混合装入和存储指令,1、一般的装入指令,2、存贮指令,3 并行装入和存储指令,4、条件存储指令,5、并行存储和加、减、乘法指令,6、并行装入和
36、乘法指令,7、混合装入和存储指令,注意:同一条指令在不同存储器中可能有不同执行时间,操作数在双寻址空间、单寻址空间和外部程序代码在双寻址、单寻址和外部空间操作数和代码在相同存储器块中数据空间插入了等待周期程序空间插入了等待周期,FIRS指令使用方法:FIRS *AR2+, *AR3+, COEF,特殊指令使用说明,FIRS指令 FIRS指令用于线性相位滤波器的处理。一个如下图的8阶线性相位滤波器的输出表达式:,FIR滤波的两指令MAC、FIRS,RPTZ A,#(N-1) ;重复MAC指令N次,先将A清零MAC *FIR_DATA_P+0%,*FIR_COFF_P+0%,A ; 完成滤波计算。
37、注意FIR滤波 ;系数存放在数据存储区,RPTZ B, #(N/2-1) ; 重复FIRS指令N/2次,先将B清零 FIRS *ar2+0%, *ar3+0%,filter_coff+N/2 ;完成滤波计算。注意FIR滤波系数 ;存放在程序存贮filter_coff为 ;系数起始地址,Viterbi译码指令DADST、DSADT、CMPS,在信道均衡和解码中经常会使用到Viterbi算法,C54x为此提供了专门的硬件和指令。根据输入信号确定分支似然概率增加量D1/D2,放在T寄存器中,TRN存储可能信号译码输出。,相关指令应用,最小均方运算LMS,在进行自适应滤波等操作中经常会使用LMS算法,
38、C54x提供的LMS指令方便了编程。如下图所示的自适应滤波器设计中,滤波器系数修正公式为:,其中,e(i) = d(i) - y(i)。滤波器输出:,基于LMS的自适应滤波编程,数据归一化相关指令EXP、NORM,归一化一个数是先求其指数,然后把它调整到最大精度格式。实现方法如下:,数据块移动MVDD、MVDP、MVPD,在C54x系列DSP,数据与数据存储器、数据与程序存储器之间可以方便的进行数据传输,结合单指令循环可实现数据块移动。如16个系数的移动:,指令效率的提高,C54x中有一些指令功能差不多,但编写出的程序效率不同,应灵活使用,如:MPYR Smem, dst;T*(Smen)dstMACR Smem, dst;(Smen)*T+src( MPYR +ADD); srcMACD Smen,pmen,src;pmend PAR (MAC+DELY+LD);(Smem)*(pmed); +(src) src;(Smem)T;(Smem) Smem+1,