dsp 技术 及应用
DESCRIPTION
DSP 技术 及应用. D igital S ignal P rocessor 数字信号处理器. 第三章 DSP 指令系统与特点. 第一节 寻址方式. 第二节 程序地址的生成. 第三节 流水线操作技术. 第四节 指令系统概述. ’C54x 的助记符指令是由操作码和操作数两部分组成。在进行汇编以前,操作码和操作数都是用助记符表示。. 例如: LD #0FFh , A ; 将立即数 0FF 传送至 A. 目的操作数. 操作码. 源操作数. 注 释. 第一节 TMS320C54x 的寻址方式. - PowerPoint PPT PresentationTRANSCRIPT
1
DSP技术及应用DDigital SSignal PProcessor
数字信号处理器
2
第三章 DSP 指令系统与特点
第一节 寻址方式
第二节 程序地址的生成
第三节 流水线操作技术
第四节 指令系统概述
3
’’C54xC54x 的助记符指令是由操作码和操作数两的助记符指令是由操作码和操作数两部分组成。在进行汇编以前,操作码和操作数都是部分组成。在进行汇编以前,操作码和操作数都是用助记符表示。 用助记符表示。 例如:例如: LD #0FFhLD #0FFh , , AA ; ; 将立即数将立即数 0FF0FF 传送至传送至 AA
操作码 源操作数 目的操作数 注注释
4
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 的寻址方式
5
1 .立即数寻址2 .绝对地址寻址3 .累加器寻址4 .直接寻址5 .间接寻址6 .存储器映象寄存器寻址7 .堆栈寻址
寻址分类
6
’’C54x有 7 种基本的数据寻址方式:
立即寻址 绝对寻址 累加器寻址 直接寻址 间接寻址 存储器映像 寄存器寻址 堆栈寻址
::由指令提供一个操作数:由指令提供一个操作数地址 :以累加器的内容为地址访问程序空间某单元:寻址地址为 DP或 SP 的值加上指令提供的偏移量:利用辅助寄存器访问存储器
:用来改变映像寄存器,但不影响 DP或 SP
的值
:用来管理系统堆栈中的操作
7
寻址方式 用 途 举 例 指令含义
立即寻址 主要用于初始化 LD #10, A 立即数 10 A
绝对寻址 利用 16 位地址寻址存储单元 STL A , *( y )
将 AL 内容存入 y 所在的存储单元
累加器寻址 将累加器中的内容作为地址 READA x将 A 的内容作为地址读程序存储器,并存入x 存储单元
直接寻址 利用数据页指针和堆栈指针寻址 LD @x, A
(DP+x 的低 7 位地址 ) A
间接寻址 利用辅助寄存器作为地址指针 LD *AR1, A ((AR1)) A
存储器映像寄存器寻址 快速寻址存储器映象寄存器 LDM ST1, B (ST1) B
堆栈寻址 压入 / 弹出数据存储器和存储器映像寄存器 MMR
PSHM AG(SP)-1 SP,(AG) (SP)
8
C54x寻址存储器有两种基本的数据形式: 16位和 32位数。
大多数指令能够寻址 16位数,只有双精度和长字指令才能寻址 32位数。
在 32位数寻址时,先处理高有效字,再处理低有效字。
如果寻址的第一个字处于偶地址,那么第二个字就处于下一个(较高的)地址;如果第一个字处在奇地址,那么第二个字就处在前一个(较低的)地址。
9
10
1 .立即数寻址
在操作数前面需要加#字号来说明该操作数为立即数。否则会把该操作数误认为是一个地址,从而把立即数寻址变成绝对地址寻址。
特点
指令中包含有执行指令所需要的操作数。立即数分为 3 、 5 、 8 或 9 位的短立即数
和 16 位的长立即数两种。短立即数可包含在单字或双字指令中,长立
即数在双字指令中。
注意
LD #93h,A LD 93h, A
举例
11
• LD #93h, A ;• 把立即数 93h 送入累加器 A
• LD 93h, A• 把地址为 93h 单元中的数装到累加器 A ,
而不是把 93h 送入累加器 A
12
2 .绝对地址寻址
特点
在指令中包含有所要寻址的存储单元的 16位地址。这个 16 位的地址可以用其所在单元的地址标号或者 16 位符号常数来表示。
( 1 )数据存储器地址( dmad )寻址
用一个符号或一个数来确定数据空间的一个地址。
方法
MVKD SAMPLE ,*AR3
举例 : 把 SAMPLE 标注的数据空间的地址里的数复制到由 AR3 所指定的数据存储单元中去;
13
用一个符号或一个具体的数来确定程序存储器中
的一个地址
2 .绝对地址寻址
( 2 )程序存储器地址( pmad )寻址 方法
MVPD TABLE , *AR4
举例 :把 TABLE 标注的程序存储器单元地址中的一个字复制到由 AR4 所指定的数据存储单元中去;
14
用一个符号或一个常数来确定外部I/O 口地
址
2 .绝对地址寻址
( 3 ) PA 寻址 端口( PA )
方法
PORTR FIFO , *AR5
举例:把一个数从端口地址为 FIFO的 I/O 口中的一个字复制到 AR5 指定的数据存储器单元;
15
允许所有使用 Smem 寻址的指令去访问数据空间的任意单元而不改变数据页指针( DP )的值,也不用对 ARx 进行初始化
用一个符号或一个常数来确定数据存储器中的一个地址
2 .绝对地址寻址( 4 ) *( lk )寻址 方法
LD *( BUFFER ),A
举例:把地址为BUFFER 的数据单元中的数装到累加器 A
特点
16
用累加器中的数值作为地址来读写程序存储器。
方法
READA Smem WRITA Smem
举例
特点
可用来完成程序存储器单元的数据与数据存储器单元的数据进行交换
3 .累加器寻址
17
• READA Smem• 把累加器 A 中的数作为地址,从程序存
储器单元中读入一个字的数据,并传送到由单数据存储器 (Smem) 操作数所指定的数据存储器单元中。
• WRITA Smem• 把单数据存储器 (Smem) 操作数所指定
的数据存储器单元中的一个字,传送到累加器 A 指定的程序存储器中。
• ( 这两条指令在重复方式下执行,能够对累加器自动增量 )
18
可以在不改变DP或SP 的情况下,随机地寻址128 个存储单元中的任何一个单元。
用一个符号或一个常数来确定 7 位偏移
值,与 DP或SP 共同形成16 位的数据存储器实际地
址。
4 .直接寻址
方法
LD #x,DP
LD @u, A ADD
@v, A =======
====SSBX CPL
LD @X1, A ADD @Y2,
A
举例特点
19
所要寻址的数据存储器所要寻址的数据存储器 1616 位地址是由基地址和位地址是由基地址和偏移地址构成。偏移地址构成。
基地址:基地址: ①① 数据页指针数据页指针 DP(9DP(9位位 )) ;; ② ② 堆栈指针堆栈指针 SPSP 。。
20
地址形成过程:地址形成过程:当 CPL=0 时 ,
直接寻址指 令
15~8 7 6~0
操作码 I=0 dmad
页指针 DP( 位于 ST0中 )
9 位数据页指针 DP
99 位数据页指针位数据页指针 DPDP
高 9 位
dmaddmad
低 7 位
1616 位数据位数据存储器地址存储器地址
21
地址形成过程:地址形成过程:当 CPL=1 时 ,
直接寻址指 令
15~8 7 6~0
操作码 I=0 dmad
高 9 位
dmaddmad
低 7 位
1616 位数据位数据存储器地址存储器地址
1616 位堆栈指针位堆栈指针 SPSP堆栈指针堆栈指针 SPSP
SP+dmadSP+dmad
1616位位 SP+dmadSP+dmad
22
• LD #x, DP ;把立即数 x 送入状态寄存器 ST0的DP 位
• LD @u, A ;把 x页 u 存储器单元中的内容装入到累加器 A 中去
• ADD @v, A ;把 x页 v 存储器单元中的内容与累加器 A 中的内容相加
• ===========• SSBX CPL ;对状态寄存器 ST1的 CPL 置位 ,CPL=1
• LD @X1, A ; SP 指针加 X1 所形成的地址中的内容送累加器 A
• ADD @Y2, A; SP 指针加 Y2 所形成的地址中的内容与累加器 A 的值相加
23
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个可访问的单元。
24
5 .间接寻址
方法 特点
( AR0~AR7 )→ARAU0/ARAU1 →16 位无符号算术运算→寻址范围为 64K
能在一个指令中访问两个数据存储器单元
1. 两个独立的存储器单元读数据2. 读一个、写另一个存储器单元3. 读写两个连续的存储器单元
25
5 .间接寻址
( 1 )单操作数寻址
定义间接寻址的类型
定义寻址所使用的辅助寄存器 ST1
CMPT=0 标准方式 ARF 确定辅助寄存器, ST0中 ARP= 0 CMPT=1 兼容方式 如 ARF=0 ,用 ARP选择辅助寄存器, 否则,用 ARF 来确定辅助寄存器。 ARF 的值装入 ARP 。
LD *AR1,B
26
MOD 域 操作码语法 功 能 说 明
0000 *ARx addr=ARx ARx 包含了数据存储器地址
0001 *ARx- addr=ARxARx=ARx-1 访问后, ARx 中的地址减 1②
0010 *ARx+ addr=ARxARx=ARx+1 访问后, ARx 中的地址加 1①
0011 *+ARx addr=ARx+1ARx=ARx+1 在寻址前, ARx 中的地址加 1 ,然后再寻址①②③
0100 *ARx-0B addr=ARxARx=B( ARx-AR0 ) 访问后,从 ARx 中以位倒序进位的方式减去 AR0
0101 *ARx-0 addr=ARxARx=ARx-AR0 访问后,从 ARx 中减去 AR0
0110 *ARx+0 addr=ARxARx=ARx+AR0 访问后,把 AR0 加到 ARx 中去
0111 *ARx+0B addr=ARxARx=B( ARx+AR0 ) 访问后,把 AR0 以位倒序进位的方式加到 ARx 中
1000 *ARx-% addr=ARxARx=circ( ARx-1 ) 访问后, ARx 中的地址以循环寻址的方式减 1①
1001 *ARx-0% addr=ARxARx=circ( ARx-AR0 ) 访问后,从 ARx 中以循环寻址的方式减去 AR0
1010 *ARx+% addr=ARxARx=circ( ARx+1 ) 访问后, ARx 中的地址以循环寻址的方式加 1①
1011 *ARx+0% addr=ARxARx=circ( ARx+AR0 ) 访问后,把 AR0 以循环寻址的方式加到 ARx 中
1100 *ARx( lk ) addr=ARx+lkARx=ARx
ARx和 16 位的长偏移( lk )的和用来作为数据存储器地址。 ARx 本身不被修改
1101 *+ARx( lk ) addr=ARx+lkARx=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 )用来作为数据存储器的绝对地址。(也属绝对寻址)③
单数据存储器操作数间接寻址类型
27单操作数间接寻址的硬件框图
28
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 #1F, BK如果 R=32 ,则最小的 N 值为 6 ,循环缓冲区的起
始 地 址必须有 6 个最低 有效位 为 0 , 即 ×××× ×××× ××00 00002 。
29
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输
出整结果
30
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 变换结果的序号调整
31
利用位倒序对 FFT 变换结果的序号调整,调整过程中,通过对位倒序的地址计算, AR1 从不连续的地址取得 FFT 变换
结果的值,并在输出口得到连续的顺序排号的信号值。
32
5 .间接寻址
( 2 )双操作数寻址方式
确定包含Xmem 地址的辅助寄存器
确定包含Ymem地址的辅助寄存器
定义用于访问
Ymem 操作数的间接寻址方式的类型
定义用于访问
Xmem操作数的间接寻址方式的类型
MPY *AR2,*AR3,A
33
Xar或 Yar 辅助寄存器 00 AR2 01 AR3 10 AR4 11 AR5
辅助寄存器选择
Xmod或Ymod
操作码语法 功 能 说 明
00 *ARx addr=ARx ARx 是数据存储器地址
01 *ARx-addr=ARx
ARx=ARx-1访问后, ARx 中的地址减 1
10 *ARx+addr=ARx
ARx=ARx+1访问后, ARx 中的地址加 1
11 *ARx+0%addr=ARx
ARx=circ( ARx+AR0 )
访问后, AR0 以循环寻址的方式加到 ARx 中
双数据存储器操作数寻址的类型双数据存储器操作数寻址的类型
34
0 页寻址。不影响当前DP或SP 值 。用于直接寻址和间
接寻址
用来修改存储器映象寄存器
6 .存储器映象寄存器寻址
功能
LDM PRD,A
举例 特点方法
高 9 位数据存储器地址被置 0 ,利用指令中的低7位地址访问 MMR 。
35
例如:用 AR1 来指向一个存储器映像寄存器。若 AR1 的值为 FF25H ,其低 7 位是 25H 。而地址为 25H 的单元是用作定时器周期计数器PRD ,故 AR1 指向了定时器周期寄存器。使用存储器映像寄存器寻址的指令共有 8 条:LDM MMR, dst ;将 MMR 加载到累加器MVDM damd,MMR ;数据存储器向MMR 传送数据MVMM MMRx,MMRy;MMRx向MMRy 传送数据POPM MMR ;将数据从栈顶弹出至 MMRPSHM MMR ;将 MMR 压入堆栈STLM src,MMR ;累加器低位存到 MMRSTM # lk,MMR ;长立即数存到 MMR
36
7 .堆栈寻址
从高地 址向低 地 址 方向生长, SP )来管理堆栈, SP始终指向堆栈中所存放的最后一个数据,即 SP 指针始终指向栈顶。在压入操作时,先减小 SP 的值,再将数据压入堆栈;在弹出操作时,先从堆栈弹出数据,再增加 SP 的值。
用来在中断和子程序调用时自动保存程序计数
器( PC )中的数值,也能用来保护现场或传送参数
功能 特点
PSHD *AR2 POPD *AR3PSHM MMRPOPM MMR
37
堆栈寻址 堆栈:堆栈:当发生中断或子程序调用时,用来自动保存当发生中断或子程序调用时,用来自动保存
PCPC 内容内容以及保护现场或传送参数。以及保护现场或传送参数。 ’’C54xC54x 的堆栈是向低地址生长,并由的堆栈是向低地址生长,并由 1616 位堆栈指针位堆栈指针 SPSP 管管理。理。 SPSP 总是指向栈顶。总是指向栈顶。
堆栈寻址:利用堆栈寻址:利用 SPSP 指针,按照先进后出的原则进行指针,按照先进后出的原则进行寻址。寻址。 当进栈操作时, SP先减小,然后数据进入堆栈;
当出栈操作时,数据先出栈,然后 SP 增加。
38
采用堆栈寻址的指令: 采用堆栈寻址的指令:
PSHD SmemPSHD Smem ; ;将将 SmemSmem 中的数据压入堆栈中的数据压入堆栈
PSHM MMR ;PSHM MMR ;将将MMRMMR 中的数据压入堆栈中的数据压入堆栈
POPD Smem ;POPD Smem ; 将数据从栈顶弹至将数据从栈顶弹至 SmemSmem 中中
POPM MMR ;POPM MMR ; 将数据从栈顶弹至将数据从栈顶弹至 MMRMMR 中中
39
第二节 程序地址的生成程序地址生
成器( PAGEN )构成
程序计数器( PC )重复计数器( RC )块重复计数器( BRC )块重 复起始 地址 寄存器( RSA )块重 复 结束地 址 寄 存 器 ( REA )
核心
16 位程序计数器( PC )内中保存某个内部或外部程序存储器的地址。
地址内容为: 1. 即将取指的某条指令 2. 某个 16 位立即操作数 3. 系数表在程序存储器中的地址
40
操作 加载到 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 ,继续执行被中断了的子程序。
将程序存储器地址加载到程序计数器的途径
41
1 .分支转移操作
通过分支转移指令改写 PC ,可以改变程序的流向。而子程序调用指令则通过将一个返回地址压入堆栈,执行返回时恢复原地址。
可执行 :1. 分支转移2.循环控制3.子程序操作
功能 方法
42
条件分支转移无条件分支转移
B[D] 用 指令中所给出的地址加载PCBACC[D]用所指定的累加器的低16 位 作 为地 址 加 载PC 。
带延迟不带延迟
操作
转移种类BC[D] 如果指令中所规定的条件得到满足,就用指令中所给出的地址加载 PC ;BANZ[D] 如果当前辅助寄存器 不等于 0 ,就用指令中所规定 的 地 址 加载PC 。
BC new, AOV BANZ loop,*AR2-
B nextBACC A
43
• 由于 DSP采用多级流水线操作,当分支转移指令到达流水线的执行阶段时,其后面的两个指令字已经被取指。
• 对这两个指令 :• 如果是在带延迟的分支转移后面,这一条双字指
令或两条单字指令被执行后再进行分支转移;• 如果是在不带延迟的分支转移后面,就将已被读
入的一条双字指令或两条单字指令从流水线中清除,不予执行,立即进行分支转移。
44
2 .调用和返回
转移前,原程序的下条指令的地址被压入堆栈,而在返回时则将 这 个 地 址 弹 出 至PC ,使被中断了的原程序能继续执行。
当采用调用指令进行子程序或函数调用时, DSP 中断当前运行的程序,转移到程序存储器的其它地址继续运行。
功能方法
无条件调用与返回有条件调用与返回
带延迟不带延迟
CALL[d] lopCALA[d] lop
RET mainRETE mainRETF main
45
无条件调用与返回指令:CALL[d] lop :将返回地址压入堆栈,用指令所规定的地址加载 PC ;CALA[d] A :将返回地址压入堆栈,用指定累加器的低16 位地址加载 PC ;RET main :用栈顶的返回地址加载 PC ;RETE main :用栈顶的返回地址加载 PC ,并开放中断;RETF main :用快速返回寄存器 RTN 中的返回地址加载PC ,并开放中断;条件调用与返回指令:CC[D] :如果指令中所规定的条件得到满足,则先将返回地址压入堆栈,然后用所指定的地址加载 PC ;RC[D] :如果指令中所规定的条件得到满足,则将堆栈顶部的返回地址加载 PC ;
46
3 .条件指令中的条件判断
47
多重条件判断
BC pmad, cond[, cond[, cond]]
相与关系
相或关系 BC pmad, condBC pmad, cond第 1 组 第 2 组
A 类 B 类 A 类 B 类 C 类EQ OV TC C BIO
NEQ NOV NTC NC NBIO
LT
LEQ
GT
GEQ
48
第 1组
例如
可以从 A 类中选一个条件,同时可以从 B 类中选择一个条件。但是不能从同一类中选择两个条件。另外,两种条件测试的累加器必须是同一个。
可以同时测试 AGT和 AOV ,但不能同时测试 AGT和BGT 。
49
第 2组
例如
可以在 A 、 B 、 C 三类中各选择一个条件,但不能从同一类中选择两个条件
可以同时测试 TC、 C 和BIO ,但不能同时测试NTC、 C 和NC
50
特例
如果条件分支转移出去的地方只有 1 ~ 2字的程序段,则可以用一条单周期条件执行指令( XC )来代替分支转移指令:XC n, cond[, cond[, cond]]当 n=1 ,且条件得到满足,就执行紧随此 条件指令后的1个字指令。当 n=2 ,且条件得到满足,就执行紧随此 指令后的 1 个双字指令或者 2条单 字指令。 当条件不满足,就依n 的值执行 1 条或 2 条NOP 指令。
51
例 3-3 编写计算 的主要程序部分。 .bss x,4 ;为 X 建立 4 个单元, ;放置 X1、 X2、 X3、 X4 .bss y,1 ;为 Y 建立 1 个单元,放置 Y STM #x, AR1 ;将 X1 的地址传给 AR1 STM #3 , AR2 ;将循环次数 3 传给AR2 LD #0, A ;对 A 清零loop:ADD *AR1+ , A ;对 X1 、 X2 、 X3 、X4循环累 ;加,结果放 A 中 BANZ loop,*AR2- ;检查循环是否应结束 STL A, y ;将累加结果存入 Y 中
4
1iixy
52
特点 2特点 1
4 .单条指令的重复操作
重 复 执 行 ( RC ) +1次。 RC 内容不能编程设置,只能由重复指令( RPT 和 RPTZ ) 中的操作数加载。操作数n 的最大值为 65 535 ,最大重复执行次数为 65 535+1 。
一旦重复指令被取指、译码,直到重复循环完成以前,对所有的中断(包括 ,但不包括 )均不响应。
功能 重复执行下一条指令
NMI
RS
53
重复过程
当 RPT 指令执行时:①首先把循环的次数装入循环计数器( RC );② 其循环次数 n 由一个 16 位单数据存储器操作数 Smem 或一个 8 位或 16 位常数 k或 lk给定。这样, 紧接着的下一条指令会循环执行 n+1次。③循环, RC 在执行减 1 操作时不能被访问。注意:该循环内不能套用循环。
当 RPTZ 指令执行时:对目的累加器 dst清 0 ,循环执行下一条指令 n+1次。
54
例 3-5 利用单条指令的重复操作对数组 x[5]={0,0 , 0 , 0 , 0} 进行初始化。
.bss x,5 ;为数组 x 分配 5 个存储单元STM #x,AR1 ;将 x 的首地址赋给 AR1LD #0,A ;对 A 清零RPT #4 ;设置重复执行下条指令 5 次STL A,*AR1+ ;对 x[5]各单元清零或者.bss x,5STM #x,AR1RPTZ A,#4 ;对 A 清零并设置重复执行下条指令 5 次
STL A,*AR1+
55
特点
5 .块重复操作
利用 C54x 内部的块重复计数器( BRC ,加载值可为 0 ~ 65 535 )、块重复起始地址寄存器( RSA )、块重复结束地址寄 存 器 ( REA ) 与 程 序块重 复 指 令RPTB ,可对紧随 RPTB 、由若干条指令构成的程序块进行重复操作。
功能 将重复操作的范围扩大到任意长度的循环回路
注意 1.RPT 指令一旦执行,不会停止操作,即使有中断请求也不响应( /RS除外);2.RPTB 指令可以响应中断;
56
例 3-5 编写对程序块进行 100次操作的语句。 STM #99,BRC ; 99→BRC RPTB next-1 ;对下条指令至标号为NEXT 前的程序块执行 100次重复操作 next: … ;重复程序块以外的指令 执行上述程序时,先将 99 加载到 BRC 中,即对程序块重复执行 99+1=100次。 执行 RPTB 指令时将 (PC)+2 加载到 RSA ,将NEXT-1 加载到 REA ,同时将状态寄存器 ST1 中的块重复操作标志位 BRAF置 1 ,表示正在进行块重复操作。每执行一次程序块重复操作, BRC减 1 ,直到 BRC减到 0 ,将 BRAP置 0 ,块重复操作全部完成。
57
例 3-6 对数据组 x[5] 中的每个元素加 1 。 .bss x,5 ;为数组 x 分配 5 个存储单元begin: LD #1,16,B ;将 1 左移 16 位放入 B 的 ;高端字的最低位 STM #4,BRC ; 4→BRC STM #x,AR4 ;将 x 的首地址赋给 AR4 RPTB next-1 ;将 NEXT-1 →REA ( PC)+2 →RSA ADD *AR4,16,B,A ; x 地址的内容左移 16位加 ; B 的高端字,结果放 A STH A,*AR4+ ;将 A 的高端字存入 x 单元, ;完成加 1 操作next: LD #0,B ;对 B 清零 … ;必需 next-1 作为结束地址
58
• 本例中,用 next-1 作为结束地址是必要的。如果用循环回路中最后一条指令 (STH 指令 ) 的标号作为结束地址,若最后一条指令是单字指令则可,但若是双字指令就不对了。
• 由于只有一套块重复寄存器,因此块重复操作是不能嵌套的。要使重复操作嵌套,最简单的方法是只能在最里层的循环中采用块重复指令,而外层的那些循环则利用 BANZ 。
59
对寄存器的占用
6 .循环的嵌套
执行 RPT 指令时占用 RC 寄存器(重复计数器);执行 RPTB 指令时要用到 BRC、 RSA和 RSE寄存器。只只有一套块重复寄存器,故块重复操作不能嵌套。 由于 RPT与 RPTB 两者用了不同的寄存器,因此 RPT 指令可以嵌套在 RPTB 指令中,实现循环的嵌套。执行 BANZ 指令只占用辅助寄存器 ARx 。不会与 RPT RPTB 指令相冲突。
嵌套原则 参与嵌套循环的寄存器不能重复使用
60图 3-3 一个三重循环嵌套结构
61
第三节 流水线操作技术 流水线
操作在执行多条指令时,将每条指令的预取指、取指、译码、寻址、读取操作数、执行等阶段,相差一个阶段地重叠地执行。
流水线操作的优点
一条 k 段流水能在 k+ ( n-1 )个周期内处理 n 条指令。其前 k个周期用于完成第一条指令,其余 n-1 条指令的执行需要 n-1 个周期。而非流水处理器上执行 n 条指令则需要 nk 个周期。当指令条数 n 较大时,可认为每个周期内执行的最大指令个数为 k。
62
预取指 P
取指 F
译码 D
寻址 A
读取操作数R
执行 X
流水线操作 在第一个机器 周 期 用PC 中 的 内容 加 载PAB
在第二个机器周期用读取到的指令字加载 PB 。
第三个周期用 PB 的内容加载指令寄存器 IR ,对 IR 内的指令进行译码,产生执行指令所需要的一系列控制信号。
63
预取指 P
取指 F
译码 D
寻址 A
读取操作数R
执行 X
流水线操作
用数据 1 读地址加载DAB ,或用数据2读地 址 加载 CAB ,修正辅助寄存器和堆栈指针。
读数据 1 加载 DB ,或读数据 2 加载 CB ;用数 据 3 写 地 址 加载到EAB ,以便在流水线的最后一级将数据送到数据存储空间。
执行指令,或用写数据加载 EB 。
64
空转浪费周期
1 .延迟分支转移的流水线图
无延迟流水线分支转移的问题
地址 指令a1, a2 B b1 这是一个四周期、二字分支指令a3 i3 这是任意的一周期、一字指令a4 i4 这是任意的一周期、一字指令... ...b1 j1
例 3-7
65
分支转移指令流水线图
用分支转移指令的地址a1 加 载PAB 。
取得双字分支转移指令取得双字分支转移指令
66
分支转移指令流水线图
i3 和 i4 指 令取指 。 由 于 这两 条 指 令 处 在分支转移 指 令的后面 ,虽然已经取指 , 但不 能 进 入译码级,且最终被丢弃。
分支转移指令进入译码级
用新的 值 b1 加载PAB
67
分支转移指令流水线图
j1 指令取指
双字分支转移指令进入流水线的执行级
执行 j1 指令
双字分支转移指令进入流水线的执行级
由 于 i3 和 i4指 令 是 不 允 许执 行 的 , 所 以这 两 个周期均花在 分支转移指令的执行上。
68
允许跟在延迟分支转移指令之后的两条单字或一条双字指令可以被执行
延迟分支转移
注意
1.延迟操作指令后面只有两个字的空 隙,因此不能在此空隙中安排任何 一类分支转移指令或重复指令;2.在 CALLD或 RETD 的空隙中还不能安排 PUSH和 POP 指令。3.延迟操作指令比它们的非延迟型 指令要快,在调试延迟型指令时, 直观性稍差一些,因此希望在大多 数情况下还是采用非延迟型指令。
69
例 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)在空闲的随后两周期中执行下两条指令
70
XC n, cnd[, cnd[,cnd] 如果条件满足,则执行下面 n ( n=1或 2 )条指令,否则下面 n 条指令改为执行 n 条NOP 指令。
2 .条件执行指令的流水线图
条件执行指令 XC
有下列程序:地址 指令a1 i1a2 i2a3 i3a4 XC 2 , conda5 i5a6 i6
71
条件执行指令流水线图
XC 指令的地址 a4 加载到PAB
取 XC 指令 的 操 作码
求解 XC 指令所规定的条件。如果条件满足,则后面指令 i5和 i6 进入译码级并执行;否则不对 i5和 i6 指令译码。
72
1. XC 是一条单字单周期指令,与条件跳 转指令相比,具有快速选择其后 1 或2 条指令是否执行的优点 ;2. XC 指令在执行前 2 个周期就已经求出 条件,如果在这之后到执行前改变条 件(如发生中断),将会造成无期望 的结果 。3. 要尽力避免在 XC 指令执行前 2 个周期 改变所规定的条件 。 4. 并没有规定 XC 指令后的一条或两条指 令必须是单周期指令。
注意
73
CPU 在单个周期内同时访问双寻址存储器
3 .双寻址存储器的流水线冲突
流水线冲突原因
不会产生流水线冲突的情况
( 1 )在单周期内允许同时访问 DARAM 的不同块。( 2 )当流水线中的一条指令访问某一存储器块时, 允许流水线中处于同一级的另一条指令访问 另一个存储器块。( 3 )允许处于流水线不同级上的两条指令同时访 问同一个存储器块。
74
是利用一次访问中对前、后半个周期分时进行访问的缘故。
CPU 能够在单周期内对 DARAM 进行两次访问而不冲突 对 PAB/PB取指 利用前半周期对DAB/DB 读取第一个数据 利用前半周期对 CAB/CB 读取第二个数据 利用后半周期对 EAB/EB 将数据写存储器 利用后半周期
75
(1) 同时从同一存储器块中取指和取操作数(都在前半个周期); 2. 同时对同一存储器块进行写操作和读(第二个数)操作(都在后半周期)。
解决冲突办法
人为合理安排指令,错开访问时序
CPU通过写操作延迟一个周期,或者通过插入一个空周期的办法,自动地解决
CPU 同时访问 DARAM 的同一存储器块就会发生时序上的冲突。
76
从DARAM块中同时取指和取操作数
冲突 延迟一个周期
77
4 .解决流水线冲突的方法
( 1 )可能发生流水线冲突的情况
流水线冲突情况分析
78
1) 辅助寄存器( AR0~ AR7 )。2) 重复块长度寄存器( BK )。3) 堆栈指针。4) 暂存器( T)。5) 处理器工作方式状态寄存器( PMST )。6) 状态寄存器( ST0和 ST1 )。7 )块重复计数器( BRC )。8 ) 存 储 器 映 象 累 加 器( AG、 AH、 AL、 BG、 BH、 BL )。
如果在流水线中同时对下列MMR寻址,就有可能发生冲突
79
发生流水线冲突的例子
在流水线的执行阶段进行写操作
在流水线的寻址阶段生成地址
冲突
无等待周期问题
解决
数据未准备好
80
发生流水线冲突的例子 在 流 水 线 的执 行阶段进行写操作
读 数阶段将常数 10写到 AR1
冲突同时利用 E 总线
CPU 自动地将 STM的 写 操 作延迟一 个周期
在流水线的寻址阶段生成地址
新冲突数据未准备好
解决
81
发生流水线冲突的例子 STLM 指 令后面插入 一条 NOP 指令
在流水线的执行阶段进行写操作
读 数阶段将常数 10写到 AR1
在流水线的寻址阶段生成地址
E 总线错开解决
数据准备好解决
82
4 .解决流水线冲突的方法
( 2 )用等待周期表解决流水线冲突
等待周期表给出了对 存 储 器 映 象 寄 存 器 以及ST0、 ST1、 PMST 的控制字段进行写操作的各种指令所需插入的等待周期。对双字或三字指令,都会提供隐含的保护周期。利用这些指令提供的隐含的保护周期,有时可以不插NOP指令。
83
控制字段 不插入 插入 1 个 插入 2 个
T
STM #1k , TMVDK Smem, TLD Smem, TLD Smem, T‖ST
所有其它存储指令包括 EXP
ASMLD #k5 , ASMLD Smem, ASM
所有其它存储指令
DPCPL=0
LD #k9 , DPLD Smem,DP
STM # lk, ST0ST # lk, ST0所有其它存储指令插入3 个
SXM C16FRCT OVM
所有存储指令包 括 SSBX 和RSXM
A 或 B 修改累加器然后读
MMR
在RPTB[D]前读 BRC
STM # lk, BRCST # lk, BRCMVDK Smem, BRCMVMD MMR, BRC
所有其它存储指令 SRCCD(在循环中) 见说明 4
等待周期表 1
84
例 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 位SXM= 0 禁止符号位扩展SXM= 1 允许符号位扩展
85
例 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 的控制字段为AR2 , STLM 指令后应插入 2 个 NOP ,但由于下条指令 STM 隐含 1 个等待周期,故只需 要插入 一 条NOP 指令。
86
第四节 指令系统概述
TMS320C54x 是 TMS320 系列中的一种定点数字信号处理器,它的指令系统分助记符形式和代数式形式两种。
共有指令 129 条,由于操作数的寻址方式不同,派生至 205 条。
• 按指令的功能, C54x 指令系统可以分为 4 类:
1. 算术运算指令2. 逻辑运算指令3. 程序控制指令4. 加载和存储指令
88
1. 可同时读入 2 或 3 个操作数;2.支持双精度运算的 32 位长操作数指令;3. 可进行单条指令重复和块指令重复操作;4. 有块存储器传送指令和并行操作(如并行存储和加载、并行存储和加 / 减法、并行存储和乘法、并行加载和乘法)指令;5.设有条件存储指令及延迟操作指令、有从中断快速返回指令;6. 有为特殊用途设计的指令(如支持 FIR滤波、最小均方算法 LSM、多项式计算以及浮点运算);7. 有为省电安排的空转指令。
TMS320C54x 指令系统的主要特点