1 / 112

第三章 DSP 指令系统与特点

第三章 DSP 指令系统与特点 . 第一节 数据寻址方式. 第二节 程序存储器地址的生成方式. 第三节 流水线. 第四节 指令系统概述. 第一节 TMS320C54x 的数据寻址方式. Smem : 16 位单寻址操作数。 Xmem : 16 位双寻址操作数,从 DB 数据总线上读出。 Ymem : 16 位双寻址操作数,从 CB 数据总线上读出。 dmad : 16 位立即数,数据存储器地址。 pmad : 16 位立即数,程序存储器地址。 PA : 16 位立即数, I/O 口地址。 src : 源累加器( A 或 B )。

edana
Download Presentation

第三章 DSP 指令系统与特点

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第三章 DSP指令系统与特点 第一节 数据寻址方式 第二节 程序存储器地址的生成方式 第三节 流水线 第四节 指令系统概述

  2. 第一节 TMS320C54x的数据寻址方式 Smem:16位单寻址操作数。 Xmem:16位双寻址操作数,从DB数据总线上读出。 Ymem:16位双寻址操作数,从CB数据总线上读出。 dmad:16位立即数,数据存储器地址。 pmad:16位立即数,程序存储器地址。 PA: 16位立即数,I/O口地址。 src: 源累加器(A或B)。 dst: 目的累加器(A或B)。 lk: 16位长立即数。

  3. 寻址分类 1.立即数寻址 2.绝对地址寻址 3.累加器寻址 4.直接寻址 5.间接寻址 6.存储器映象寄存器寻址 7.堆栈寻址

  4. 1.立即数寻址 指令中包含有执行指令所需要的操作数。 立即数分为3、5、8或9位的短立即数和16位的长立即数两种。 短立即数可包含在单字或双字指令中,长立即数在双字指令中。 特 点  在操作数前面需要加#字号来说明该操作数为立即数。否则会把该操作数误认为是一个地址,从而把立即数寻址变成绝对地址寻址。 注 意 LD #93h,A LD 93h,A 举例

  5. 2.绝对地址寻址 在指令中包含有所要寻址的存储单元的16位地址。这个16位的地址可以用其所在单元的地址标号或者16位符号常数来表示。 特 点 (1)数据存储器地址(damd)寻址 方法 MVKD SAMPLE,*AR3 用一个符号或一个数来确定数据空间的一个地址。 举例

  6. 2.绝对地址寻址 (2)程序存储器地址(pmad)寻址 方法 MVPD TABLE,*AR4 用一个符号或一个具体的数来确定程序存储器中的一个地址 举例

  7. 2.绝对地址寻址 (3)PA寻址 端口(PA) 方法 举例 用一个符号或一个常数来确定外部I/O口地址 PORTR FIFO,*AR5

  8. 允许所有使用Smem寻址的指令去访问数据空间的任意单元而不改变数据页指针(DP)的值,也不用对ARx进行初始化允许所有使用Smem寻址的指令去访问数据空间的任意单元而不改变数据页指针(DP)的值,也不用对ARx进行初始化 2.绝对地址寻址 (4)*(lk)寻址 方法 举例 特点 用一个符号或一个常数来确定数据存储器中的一个地址 LD *(BUFFER),A

  9. 3.累加器寻址 方法 特点 举例 用累加器中的数值作为地址来读写程序存储器。 可用来完成程序存储器单元的数据与数据存储器单元的数据进行交换 READA Smem WRITA Smem

  10. 4.直接寻址 方法 特点 举例 用一个符号或一个常数来确定7位偏移值,与DP或SP共同形成16位的数据存储器实际地址。 LD #x,DP LD @u,A ADD @v,A =========== SSBX CPL LD @X1,A ADD @Y2,A 可以在不改变DP或SP的情况下,随机地寻址128个存储单元中的任何一个单元。

  11. CPL=0 7位dma域与9bit的DP相结合     形成16位的数据存储器地址。 CPL=1 7位dma域加上(正偏移)SP     的值形成16位的数据存储器地址。 DP值是从0~511(29-1),以DP为基准的直接寻址把存储器分成512页,7位的dma范围从0~127,每页有128个可访问的单元。

  12. 5.间接寻址 方法 特点 能在一个指令中访问两个数据存储器单元 (AR0~AR7)→ ARAU0/ARAU1 → 16位无符号算术运算→ 寻址范围为64K 两个独立的存储器单元读数据 读一个、写另一个存储器单元 读写两个连续的存储器单元

  13. 5.间接寻址 (1)单操作数寻址 LD *AR1,B 单操作数间接寻址的硬件框图

  14. MOD域 操作码语法 功 能 说 明 单数据存储器操作数间接寻址类型 0000 *ARx addr=ARx ARx包含了数据存储器地址 0001 *ARx- addr=ARx ARx=ARx-1 访问后,ARx中的地址减1② 0010 *ARx+ addr=ARx ARx=ARx+1 访问后,ARx中的地址加1① 0011 *+ARx addr=ARx+1 ARx=ARx+1 在寻址前,ARx中的地址加1,然后再寻址①②③ 0100 *ARx-0B addr=ARx ARx=B(ARx-AR0) 访问后,从ARx中以位倒序进位的方式减去AR0 0101 *ARx-0 addr=ARx ARx=ARx-AR0 访问后,从ARx中减去AR0 0110 *ARx+0 addr=ARx ARx=ARx+AR0 访问后,把AR0加到ARx中去 0111 *ARx+0B addr=ARx ARx=B(ARx+AR0) 访问后,把AR0以位倒序进位的方式加到ARx中 1000 *ARx-% addr=ARx ARx=circ(ARx-1) 访问后,ARx中的地址以循环寻址的方式减1① 1001 *ARx-0% addr=ARx ARx=circ(ARx-AR0) 访问后,从ARx中以循环寻址的方式减去AR0 1010 *ARx+% addr=ARx ARx=circ(ARx+1) 访问后,ARx中的地址以循环寻址的方式加1① 1011 *ARx+0% addr=ARx ARx=circ(ARx+AR0) 访问后,把AR0以循环寻址的方式加到ARx中 1100 *ARx(lk) addr=ARx+lk ARx=ARx ARx和16位的长偏移(lk)的和用来作为数据存储器地址。ARx本身不被修改 1101 *+ARx(lk) addr=ARx+lk ARx=ARx+lk 在寻址前,把一个带符号的16位的长偏移(lk)加到ARx中,然后用新的ARx的值作为数据存储器的地址③ 1110 *+ARx(lk)% addr=circ(ARx+lk) ARx=circ(ARx+lk) 在寻址前,把一个带符号的16位的长偏移以循环寻址的方式加到ARx中,然后再用新的ARx的值作为数据存储器的地址③ 1111 *(lk) addr=lk 一个无符号的16位的长偏移(lk)用来作为数据存储器的绝对地址。(也属绝对寻址)③

  15. 1) 循环寻址 循环缓冲区的长度值存放在循环缓冲区长度寄存器BK中,BK中的数值由指令设定。长度为R的循环缓冲器必须从一个N位地址的边界开始,即循环缓冲器基地址的最低N位必须为0。N是满足2N>R的最小整数。R的值必须装入BK。 例如,含有31个字的循环缓冲器必须从最低5位为0的地址开始,即xxxx xxxx xxx0 00002,N=5,2N=25>R=31,且31必须装入BK。如: STM #1k,BK 如果R=32,则最小的N值为6,循环缓冲区的起始地址必须有6个最低有效位为0,即×××× ×××× ××00 00002。

  16. 2) 位倒序寻址 在这种寻址方式中,用AR0存放FFT点数的一半整数N,用另一辅助寄存器指向一数据存放的物理单元。当使用位倒序寻址把AR0加到辅助寄存器中时,地址以位倒序的方式产生,即进位是从左向右,而不是从右向左进位。 例如:  0110 1000 + 0000 1000 0110 0100 以8位辅助寄存器为例,AR1表示了在存储器中数据的基地址(0110 0000)2,AR0的值为(0000 1000)2。利用以下两条语句可以向外设口(口地址为PA)输出整序后的FFT变换结果: RPT #15 重复执行下条指令15+1次 PORTW *AR1+0B,PA 向外设口PA输出整结果

  17. AR1修改循环值 存储单 元地址 整序前FFT 变换结果 位倒序 AR1更新的地址值AR0=0000 10002 整序后PA输出的FFT变换结果 0 0000 X(0) 0000 0110 0000 X(0) 1 0001 X(8) 1000 0110 1000 X(1) 2 0010 X(4) 0100 0110 0100 X(2) 3 0011 X(12) 1100 0110 1100 X(3) 4 0100 X(2) 0010 0110 0010 X(4) 5 0101 X(10) 1010 0110 1010 X(5) 6 0110 X(6) 0110 0110 0110 X(6) 7 0111 X(14) 1110 0110 1110 X(7) 8 1000 X(1) 0001 0110 0001 X(8) 9 1001 X(9) 1001 0110 1001 X(9) 10 1010 X(5) 0101 0110 0101 X(10) 11 1011 X(13) 1101 0110 1101 X(11) 12 1100 X(3) 0011 0110 0011 X(12) 13 1101 X(11) 1011 0110 1011 X(13) 14 1110 X(7) 0111 0110 0111 X(14) 15 1111 X(15) 1111 0110 1111 X(15) 位倒序对FFT变换结果的序号调整

  18. 6.存储器映象寄存器寻址 功能 方法 举例 特点 高9位数据存储器地址被置0,利用指令中的低7位地址访问MMR。 用来修改存储器映象寄存器 0页寻址。 不影响当前DP或SP值 。用于直接寻址和间接寻址 LDM PRD,A

  19. 7.堆栈寻址 PSHD *AR2 POPD *AR3 功能 特点 用来在中断和子程序调用时自动保存程序计数器(PC)中的数值,也能用来保护现场或传送参数 从高地址向低地址方向生长,SP)来管理堆栈,SP始终指向堆栈中所存放的最后一个数据,即SP指针始终指向栈顶。在压入操作时,先减小SP的值,再将数据压入堆栈;在弹出操作时,先从堆栈弹出数据,再增加SP的值。

  20. 第二节 程序存储器地址的生成 程序计数器(PC) 重复计数器(RC) 块重复计数器(BRC) 块重复起始地址寄存器(RSA) 块重复结束地址寄存器(REA) 程序地址生成器(PAGEN)构成 核心 地址内容为: 即将取指的某条指令; 某个16位立即操作数; 系数表。 在程序存储器中的地址 16位程序计数器(PC)内中保存某个内部或外部程序存储器的地址。

  21. 操作 加载到PC的地址 将程序存储器地址加载到程序计数器的途径 复位 PC=FF80h。 顺序执行指令 PC=PC+1。 分支转移 用紧跟在分支转移指令后面的16位立即数加载PC。 由累加器分支转移 用累加器A或B的低16位立即数加载PC。 块重复循环 假如ST1中的块重复有效位BRAF=1,当PC+1等于块重复结束地址(REA)+1,将块重复起始地址(RSA)加载PC。 子程序调用 将PC+2压入堆栈,并用紧跟在调用指令后面的16位立即数加载PC。返回指令将栈顶弹出至PC,回到原先的程序处继续执行。 从累加器调用子程序 将PC+1压入椎栈,用累加器A或B的低16位加载PC。返回指令将栈顶弹出至PC,回到原先的程序处继续执行。 硬件中断或软件中断 将PC压入堆栈,用适当的中断向量地址加载PC。中断返回时,将栈顶弹出至PC,继续执行被中断了的子程序。

  22. 1.分支转移操作 功能 方法 通过分支转移指令改写PC,可以改变程序的流向。而子程序调用指令则通过将一个返回地址压入堆栈,执行返回时恢复原地址。 可执行: 分支转移 循环控制 子程序操作

  23. 转移种类 BC[D]如果指令中所规定的条件得到满足,就用指令中所给出的地址加载PC; BANZ[D]如果当前辅助寄存器不等于0,就用指令中所规定的地址加载PC。 B[D]用指令中所给出的地址加载PC BACC[D]用所指定的累加器的低16位作为地址加载PC。 条件分支转移 无条件分支转移 带延迟 不带延迟操作 B next BACC A BC new,AOV BANZ loop,*AR2-

  24. 2.调用和返回 CALL[d] lop RET main 无条件调用与返回 有条件调用与返回 带延迟 不带延迟 功能 方法 当采用调用指令进行子程序或函数调用时,DSP中断当前运行的程序,转移到程序存储器的其它地址继续运行。 转移前,原程序的下条指令的地址被压入堆栈,而在返回时则将这个地址弹出至PC,使被中断了的原程序能继续执行。

  25. 3.条件指令中的条件判断

  26. 第1组 第2组 A 类 B 类 A 类 B 类 C 类 EQ OV TC C BIO NEQ NOV NTC NC NBIO LT LEQ GT GEQ 多重条件判断 相与关系 BC pmad,cond[,cond[,cond]] BC pmad,cond BC pmad,cond 相或关系

  27. 可以从A类中选一个条件,同时可以从B类中选择一个条件。但是不能从同一类中选择两个条件。可以从A类中选一个条件,同时可以从B类中选择一个条件。但是不能从同一类中选择两个条件。 另外,两种条件测试的累加器必须是同一个。 第1组 可以同时测试AGT和AOV,但不能同时测试AGT和BGT。 例如

  28. 可以在A、B、C三类中各选择一个条件,但不能从同一类中选择两个条件 第2组 可以在A、B、C三类中各选择一个条件,但不能从同一类中选择两个条件 例如

  29. 如果条件分支转移出去的地方只有1~2字的程序段,则可以用一条单周期条件执行指令(XC)来代替分支转移指令:如果条件分支转移出去的地方只有1~2字的程序段,则可以用一条单周期条件执行指令(XC)来代替分支转移指令: XC n,cond[,cond[,cond]] 当n=1,且条件得到满足,就执行紧随此     条件指令后的1个字指令。 当n=2,且条件得到满足,就执行紧随此     指令后的1个双字指令或者2条单     字指令。     当条件不满足,就依n的值执行1     条或2条NOP指令。 特 例

  30. 4.单条指令的重复操作 功能 重复执行下一条指令 特点1 特点2 一旦重复指令被取指、译码,直到重复循环完成以前,对所有的中断(包括 ,但不包括 )均不响应。 重复执行(RC)+1次。RC内容不能编程设置,只能由重复指令(RPT和RPTZ)中的操作数加载。操作数n的最大值为65 535,最大重复执行次数为65 535+1。

  31. 重复过程 当RPT指令执行时: ①首先把循环的次数装入循环计数器(RC), ②其循环次数n由一个16位单数据存储器操作数 Smem或一个8位或16位常数k或lk给定。这样, 紧接着的下一条指令会循环执行n+1次。 ③循环,RC在执行减1操作时不能被访问。 注意:该循环内不能套用循环。 当RPTZ指令执行时:对目的累加器dst清0, 循环执行下一条指令n+1次。

  32. 5.块重复操作 将重复操作的范围扩大到任意长度的循环回路 功能 利用C54x内部的块重复计数器(BRC,加载值可为0~65 535)、块重复起始地址寄存器(RSA)、块重复结束地址寄存器(REA)与程序块重复指令RPTB,可对紧随RPTB、由若干条指令构成的程序块进行重复操作。 特点 1.RPT指令一旦执行,不会停止操作,即使有中断请求也不响应; 2.RPTB指令可以响应中断; 注意

  33. 例3-6 对数据组x[5]中的每个元素加1。 .bss x,5   ;为数组x分配5个存储单元 begin: LD #1,16,B ;将1左移16位放入B的           ;高端字的最低位 STM #4,BRC ; 4→BRC,(PC)+2 →RSA STM #x,AR4 ;将x的首地址赋给AR4 RPTB next-1 ;将NEXT-1 →REA ADD *AR4,16,B,A ;x地址的内容左移16位加 ; B的高端字,结果放A STH A,*AR4+ ;将A的高端字存入x单元, ;完成加1操作 next: LD #0,B ;对B清零 …      ;必需next-1作为结束地址

  34. 6.循环的嵌套 嵌套原则 参与嵌套循环的寄存器不能重复使用 对寄存器的占用 执行RPT指令时占用RPTC寄存器(重复计数器); 执行RPTB指令时要用到BRC、RSA和RSE寄存器。只有一套块重复寄存器,故块重复操作不能嵌套。 由于RPT与RPTB两者用了不同的寄存器,因此RPT指令可以嵌套在RPTB指令中,实现循环的嵌套。 执行BANZ指令只占用辅助寄存器ARx。不会与RPT RPTB指令相冲突。

  35. 图3-3 一个三重循环嵌套结构

  36. 第三节 流水线 在执行多条指令时,将每条指令的预取指、取指、译码、寻址、读取操作数、执行等阶段,相差一个阶段地重叠地执行。 流水线 操作 流水线操作的优点 一条k段流水能在k+(n-1)个周期内处理n条指令。其前k个周期用于完成第一条指令,其余n-1条指令的执行需要n-1个周期。而非流水处理器上执行n条指令则需要nk个周期。当指令条数n较大时,可认为每个周期内执行的最大指令个数为k。

  37. 流水线操作 在第一个机器周期用PC中的内容加载PAB 预取指P 取指F 译码D 寻址A 读取操作数R 执行X 在第二个机器周期用读取到的指令字加载PB。 第三个周期用PB的内容加载指令寄存器IR,对IR内的指令进行译码,产生执行指令所需要的一系列控制信号。

  38. 流水线操作 用数据1读地址加载DAB,或用数据2读地址加载CAB,修正辅助寄存器和堆栈指针。 预取指P 取指F 译码D 寻址A 读取操作数R 执行X 读数据1加载DB,或读数据2加载CB;用数据3写地址加载到EAB,以便在流水线的最后一级将数据送到数据存储空间。 执行指令,或用写数据加载EB。

  39. 1.延迟分支转移的流水线图 无延迟流水线分支转移的问题 空转浪费周期 例3-7 地址 指令 a1,a2 B b1 这是一个四周期、二字分支指令 a3 i3 这是任意的一周期、一字指令 a4 i4 这是任意的一周期、一字指令 ... ... b1 j1

  40. 分支转移指令流水线图 用分支转移指令的地址a1加载PAB。 取得双字分支转移指令 取得双字分支转移指令

  41. 分支转移指令流水线图 分支转移指令进入译码级 i3和i4指令取指。由于这两条指令处在分支转移指令的后面,虽然已经取指,但不能进入译码级,且最终被丢弃。 用新的值b1加载PAB

  42. 分支转移指令流水线图 双字分支转移指令进入流水线的执行级 双字分支转移指令进入流水线的执行级 由于i3和i4指令是不允许执行的,所以这两个周期均花在分支转移指令的执行上。 执行j1指令 j1指令取指

  43. 允许跟在延迟分支转移指令之后的两条单字或一条双字指令可以被执行允许跟在延迟分支转移指令之后的两条单字或一条双字指令可以被执行 延迟分支转移 1.延迟操作指令后面只有两个字的空 隙,因此不能在此空隙中安排任何 一类分支转移指令或重复指令; 2.在CALLD或RETD的空隙中还不能安 排PUSH和POP指令。 3.延迟操作指令比它们的非延迟型 指令要快,在调试延迟型指令时, 直观性稍差一些,因此希望在大多 数情况下还是采用非延迟型指令。 注意

  44. 例3-8 在完成R=(x+y)*z操作后转至next。   可以分别编出如下两段程序: 利用普通分支转移指令B  利用延迟分支转移指令BD LD @x,A LD @x,A ADD @y,A ADD @y,A STL A, @s STL A, @s LD @s,T LD @s,T MPY @z,A BD next STL A, @r MPY @z,A B next STL A, @r (共8个字,10个T) (共8个字,8个T) 在空闲的随后两周期中执行下两条指令

  45. 2.条件执行指令的流水线图 条件执行指令XC XC n,cnd[,cnd[,cnd] 如果条件满足,则执行下面n(n=1或2)条指令,否则下面n条指令改为执行n条NOP指令。 有下列程序: 地址 指令 a1 i1 a2 i2 a3 i3 a4 XC 2, cond a5 i5 a6 i6

  46. 条件执行指令流水线图 XC指令的地址a4加载到PAB 取XC指令的操作码 求解XC指令所规定的条件。如果条件满足,则后面指令i5和i6进入译码级并执行;否则不对i5和i6指令译码。

  47. 1. XC是一条单字单周期指令,与条件跳 转指令相比,具有快速选择其后1或2 条指令是否执行的优点 ; 2. XC指令在执行前2个周期就已经求出 条件,如果在这之后到执行前改变条 件(如发生中断),将会造成无期望 的结果 。 3. 要尽力避免在XC指令执行前2个周期 改变所规定的条件 。 4. 并没有规定XC指令后的一条或两条指 令必须是单周期指令。 注 意

  48. 3.双寻址存储器的流水线冲突 CPU在单个周期内两次访问双寻址存储器 流水线冲突原因 不会产生流水线冲突的情况 (1)在单周期内允许同时访问DARAM的不同块。 (2)当流水线中的一条指令访问某一存储器块时, 允许流水线中处于同一级的另一条指令访问 另一个存储器块。 (3)允许处于流水线不同级上的两条指令同时访 问同一个存储器块。

  49. CPU能够在单周期内对DARAM进行两次访问而不冲突CPU能够在单周期内对DARAM进行两次访问而不冲突 是利用一次访问中对前、后半个周期分时进行访问的缘故。 对PAB/PB取指 利用前半周期 对DAB/DB读取第一个数据 利用前半周期 对CAB/CB读取第二个数据 利用后半周期 对EAB/EB将数据写存储器 利用后半周期

  50. CPU同时访问DARAM的同一存储器块就会发生时序上的冲突。CPU同时访问DARAM的同一存储器块就会发生时序上的冲突。 (1) 同时从同一存储器块中取指和取操作数(都在前半个周期);2.同时对同一存储器块进行写操作和读(第二个数)操作(都在后半周期)。 人为合理安排指令,错开访问时序 解决 冲突 办法 CPU通过写操作延迟一个周期,或者通过插入一个空周期的办法,自动地解决

More Related