信息工程学通信工程系

Post on 05-Jan-2016

60 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

DSP 技术 及应用. D igital S ignal P rocessor 数字信号处理器. 陈金鹰 教授. 信息工程学通信工程系. 第三章 DSP 指令系统与特点. 第一节 寻址方式 第二节 程序地址的生成 第三节 流水线操作技术 第四节 指令系统概述. 第一节 TMS320C54x 的寻址方式. Smem : 16 位单寻址操作数。 Xmem : 16 位双寻址操作数,从 DB 数据总线上读出。 Ymem : 16 位双寻址操作数,从 CB 数据总线上读出。 dmad : 16 位立即数,数据存储器地址。 - PowerPoint PPT Presentation

TRANSCRIPT

1

信息工程学通信工程系

DSP 技术及应用DDigital SSignal PProcessor

数字信号处理器

陈金鹰 教授

2

第三章 DSP 指令系统与特点

第一节 寻址方式第一节 寻址方式第二节 程序地址的生成第二节 程序地址的生成第三节 流水线操作技术第三节 流水线操作技术第四节 指令系统概述第四节 指令系统概述

3

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的寻址方式

缩写

4

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

寻址分类

5

1 .立即数寻址

 在操作数前面需要加#字号来说明该操作数为立即数。否则会把该操作数误认为是一个地址,从而把立即数寻址变成绝对地址寻址。

特点

指令中包含有执行指令所需要的操作数。立即数分为 3、 5、 8或 9位的短立即数

和 16位的长立即数两种。短立即数可包含在单字或双字指令中,长立

即数在双字指令中。

注意

LD #93h , A LD 93h ,A

举例

6

2 .绝对地址寻址

特点

在指令中包含有所要寻址的存储单元的 16位地址。这个 16位的地址可以用其所在单元的地址标号或者 16位符号常数来表示。

( 1)数据存储器地址( damd)寻址

用一个符号或一个数来确定数据空间的一个地址。

方法 MVKD SAMPLE , *AR3LD 93h , A

举例

7

用一个符号或一个具体的数来确定程序存储器中

的一个地址

( 2)程序存储器地址( pmad) 寻址

方法 MVPD TABLE, *AR4MVPD 90h, *AR4

举例

8

用一个符号或一个常数来确定外部 I/O 口地址

( 3) PA 寻址 端口( PA )

方法

PORTR FIFO, *AR5PORTR 90h, *AR5

举例

9

用一个符号或一个常数来确定数据存储器中的一个地址

( 4) *( lk) 寻址

方法

LD *( BUFFER), A

举例 特点

允许所有使用 Smem寻址的指令去访问数据空间的任意单元而不改变数据页指针( DP)的值,也不用对 ARx进行初始化

10

用累加器中的数值作为地址来读写程序存储器

方法

READA Smem

WRITA Smem

举例

特点

可用来完成程序存储器单元的数据与数据存储器单元的数据进行交换

3 .累加器寻址

11

可以在不改变 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

举例特点

12

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 个可访问的单元。

13

5 .间接寻址

方法 特点

( AR0~AR7 )→ARAU0/ARAU1 →16位无符号算术运算→寻址范围为 64K

能在一个指令中访问两个数据存储器单元

两个独立的存储器单元读数据读一个、写另一个存储器单元

读写两个连续的存储器单元

14

( 1 )单操作数寻址

定义间接寻址的类型

定义寻址所使用 的辅助寄存器ST1ST1

CMPT=0 标准方式 ARF确定辅助寄存器, ST0中 ARP= 000 CMPT=1 兼容方式 如 ARF=000 ,用 ARP(ST0) 选择辅助寄存器,否则,用 ARF 来确定辅助寄存器。 ARF 的值装入 ARP 。

LD *AR1,B

15单操作数间接寻址的硬件框图

16

MOD 域 操作码语法 功 能 说 明0000 *ARx addr=ARx ARx 包含了数据存储器地址0001 *ARx- addr=ARx

ARx=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 )用来作为数据存储器的绝对地址。(也属绝对寻址)③

单数据存储器操作数间接寻址类型

17

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 #31 , BK如果 R=32 ,则最小的 N 值为 6 ,循环缓冲区的起始地址必须有 6 个最低有效位为 0 ,即×××× ×××× ××00 00002 。

18

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输出结果

19

序号 存储单元地址

整序前 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 变换结果的序号调整

20

( 2 )双操作数寻址方式

确定包含 Xmem地址的辅助寄存器

确定包含Yme

m地址的辅助寄存器

定义用于访问 Ymem操作数的间接寻址方式的

类型

定义用于访问 Xmem操作数的间接寻址方式

的类型

MPY *AR2,*AR3,A

21

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 中

双数据存储器操作数寻址的类型双数据存储器操作数寻址的类型

22

0 页寻址。不影响当前DP 或 SP

值 。用于直接寻址和间

接寻址

用来修改存储器映象寄存器

6 .存储器映象寄存器寻址

功能

LDM PRD,A

举例 特点方法

高 9 位数据存储器地址被置 0 ,利用指令中的低7位地址访问 MMR。

23

7 .堆栈寻址

从高地址向低地址方向生长,SP 用来管理堆栈, SP始终指向堆栈中所存放的最后一个数据,即 SP 指针始终指向栈顶。在压入操作时,先减小 SP的值,再将数据压入堆栈;在弹出操作时,先从堆栈弹出数据,再增加 SP 的值。

用来在中断和子程序调用时自动保存程序计数器( PC)中的数值,也能用来保护现场或传送

参数

功能 特点PSHD *AR2 POPD *AR3

24

第二节 程序地址的生成程序地址生成器( PAGEN)构

程序计数器( PC)重复计数器( RC)块重复计数器( BRC)块重复起始地址寄存器( RSA)块重复结束地址寄存器( REA)

核心

16位程序计数器( PC)内中保存某个内部或外部程序存储器的地址。

地址内容为: 即将取指的某条指令; 某个 16位立即操作数; 系数表。在程序存储器中的地址

25

操作 加载到 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 ,继续执行被中断了的子程序。

将程序存储器地址加载到程序计数器的途径

26

PC

程序存储器

地址IPTR(PMST) 中断向量号+

PC +1

分支转移指令

累加器累加器 AA 、、BB

低字累加器分支转移累加器分支转移

块重复起始地址 RSA

压入堆栈

+1=

块重复结束地址 REA

+1

块重复循环

子程序调用

调用返回

PC +1累加器调用累加器调用

PC

硬件中断或软件中断

顺序执行复位

分支转移

27

1 .分支转移操作

通过分支转移指令改写 PC ,可以改变程序的流向。而子程序调用指令则通过将一个返回地址压入堆栈,执行返回时恢复原地址。

可执行 :分支转移循环控制子程序操

功能 方法

28

条件分支转移无条件分支转移

B[D]用指令中所给出的地址加载 PCBACC[D] 用所指定的累加器的低 16位作为地址加载 PC。

带延迟不带延迟操作

转移种类BC[D] 如 果 指令中所规定的条件得到满足,就用指令中所给出的地址加载 PC;BANZ[D] 如 果当前辅助寄存器不等于 0 ,就用指令中所规定的地址加载 PC

。BC new, AOV BANZ loop,*AR2-

B nextBACC A

29

2 .调用和返回

转移前,原程序的下条指令的地址被压入堆栈,而在返回时则将这个地址弹出至 PC,使被中断了的原程序能继续执行。

当采用调用指令进行子程序或函数调用时, DSP中断当前运行的程序,转移到程序存储器的其它地址继续运行。

功能 方法

无条件调用与返回有条件调用与返回

带延迟不带延迟

CALL[d] lopRET main

30

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

ST0

31

多重条件判断

BC pmad , cond[, cond[, cond]]

相与关系

相或关系 BC pmad , condBC pmad , cond

第 1组 第 2组A 类 B 类 A 类 B 类 C 类

EQ OV TC C BIONEQ NOV NTC NC NBIOLT

       

LEQ       

GT       

GEQ       

32

第 1组

例如

可以从 A类中选一个条件,同时可以从 B类中选择一个条件。但是不能从同一类中选择两个条件。另外,两种条件测试的累加器必须是同一个。

可以同时测试 AGT和 AOV,但不能同时测试 AGT和 BGT 。BC pmad , AGT , AOV

BC pmad , AGT , BOV

33

第 2组

例如

可以在 A 、 B 、 C 三类中各选择一个条件,但不能从同一类中选择两个条

可以在 A、 B、 C三类中各选择一个条件,但不能

从同一类中选择两个条件

BC pmad , TC , C , BIOBC pmad , NTC , TC , NBIO

34

特例

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

35

例 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

36

特点 2特点 1

4 .单条指令的重复操作

重复执行( RC) +1次。 RC内容不能编程设置,只能由重复指令( RPT 和 RPTZ )中的操作数加载。操作数 n 的最大值为 65 535,最大重复执行次数为 65 535+1。

功能 重复执行下一条指令

一旦重复指令被取指、译码,直到重复循环完成以前,对所有的中断(包括 NMI,但不包括 RS)均不响应

37

重复过程

当 RPT指令执行时:①首先把循环的次数装入循环计数器( RC),②其循环次数 n由一个 16位单数据存储器操

作数 Smem或一个 8位或 16位常数 k或 lk给定

。这样, 紧接着的下一条指令会循环执行 n+1次。③循环, RC在执行减 1操作时不能被访问。注意:该循环内不能套用循环。 当 RPTZ指令执行时:对目的累加器 dst清 0, 循环执行下一条指令 n+1次。

38

例 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+

39

特点

5 .块重复操作

利用 C54x 内部的块重复计数器( BRC ,加载值可为 0~ 65 535 )、块重复起始地址寄存器( RSA )、块重复结束地址寄存器( REA )与程序块重复指令 RPTB ,可对紧随 RPTB 、由若干条指令构成的程序块进行重复操作。

功能 将重复操作的范围扩大到 64K长度的循环回 路

注意1.RPT指令一旦执行,不会停止操作,即使有中断请求也不响应;2.RPTB指令可以响应中断;

40

例 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作为结束地址

41

对寄存器的占用

6 .循环的嵌套

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

嵌套原则 参与嵌套循环的寄存器不能重复使用

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

43

第三节 流水线操作技术

流水线操作

在执行多条指令时,将每条指令的预取指、取指、译码、寻址、读取操作数、执行等阶段,相差一个阶段地重叠地执行。

流水线操作的优点

一条 k段流水能在 k+( n-1)个周期内处理 n条指令。其前 k个周期用于完成第一条指令,其余 n-1条指令的执行需要 n-1个周期。而非流水处理器上执行 n条指令则需要 nk 个周期。当指令条数 n较大时,可认为每个周期内执行的最大指令个数为 k 。

44

预取指 P

取指 F

译码 D

寻址 A

读取操作数R

执行 X

流水线操作 在第一个机器周期用 PC 中的内容加载 PAB 在第二个机器周期用读取到的指令字加载 PB。

第三个周期用 PB的内容加载指令寄存器 IR,对 IR内的指令进行译码,产生执行指令所需要的一系列控制信

号。

45

预取指 P

取指 F

译码 D

寻址 A

读取操作数R

执行 X

流水线操作

用数据 1 读地址加载DAB ,或用数据2读地址加载 CAB ,修正辅助寄存器和堆栈指针。

读数据 1 加载 DB ,或读数据 2 加载 CB ;用数据 3写地址加载到 EAB ,以便在流水线的最后一级将数据送到数据存储空间。

执行指令,或用写数据加载 EB

46

空转浪费周期

1 .延迟分支转移的流水线图

无延迟流水线分支转移的问题

地址 指令a1 , a2   B b1 这是一个四周期、二字分支指令a3   i3 这是任意的一周期、一字指令a4   i4 这是任意的一周期、一字指令b1 j1

例 3-7

47

分支转移指令流水线图 用分支转移指令的地址a1 加载 PAB。

取得双字分支转移指令取得双字分支转移指令

48

分支转移指令流水线图 分支转移指令进入译码级

用新的值 b1 加载 PAB

i3 和 i4 指令取指。由于这两条指令处在分支转移指令的后面,虽然已经取指,但不能进入译码级,且最终被丢

弃。

i3和 i4指令取指。由于这两条指令处在分支转移指令的后面,虽然已经取指,但不能进入译码级,且最终被丢弃

49

分支转移指令流水线图

j1 指令取指

双字分支转移指令进入流水线的执行级

执行 j1指令

双字分支转移指令进入流水线的执行级

由于 i3 和 i4 指令是不允许执行的,所以这两个周期均花在分支转移指令的执行上。

由于 i3 和 i4指 令 是 不允许执 行 的 , 所 以这两个周期均花在 分支转移指 令 的 执 行 上。

50

允许跟在延迟分支转移指令之后的两条单字或一条双字指令可以被执行

延迟分支转移

注意

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

51

例 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 )在空闲的随后两周期

中执行下两条指令

52

XC n, cnd[, cnd[, cnd]  如果条件满足,则执行下面 n( n=1或 2)条指令,否则下面 n条指令改为执行 n条 NOP指令。

2 .条件执行指令的流水线图

条件执行指令 XC

有下列程序:地址 指令a1 i1a2 i2a3 i3a4 XC 2 , conda5 i5a6 i6

53

条件执行指令流水线图

XC 指令的地址 a4加载到PAB 取 XC 指令的操作

求解 XC 指令所规定的条件。如果条件满足,则后面指令 i5 和 i6 进入译码级并执行;否则不对 i5 和 i6 指令译码。

54

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

期 改变所规定的条件。

注意

55

共用总线、存储器、数据未准备好

3 .流水线冲突

流水线冲突原因

不会产生流水线冲突的情况

( 1 )在单周期内允许同时访问 DARAM 的不同块。( 2 )当流水线中的一条指令访问某一存储器块时,允许流水线中处于同一级的另一条指令访问另一个存储器块。

56

是利用一次访问中对前、后半个周期分时进行访问的缘故。

CPU能够在单周期内对 DARAM进行两次访问而不冲突

对 PAB/PB取指 利用前半周期对 DAB/DB 读取第一个数据 利用前半周期对 CAB/CB 读取第二个数据 利用后半周期对 EAB/EB将数据写存储器 利用后半周期

57

解决冲突办法

人为合理安排指令,错开访问时序

CPU通过写操作延迟一个周期,或者通过插入一个空周期的办法,自动地解

CPU同时访问 DARAM的同一存储器块就会发生时序上的冲突的情况:同时从同一存储器块中取指和取操作数(都在

前半个周期);同时对同一存储器块进行写操作和读(第二个

数)操作(都在后半周期)。

58

从 DARAM块中同时取指和取操作数

冲突 延迟一个周期

59

4 .解决流水线冲突的方法

( 1)可能发生流水线冲突的情况

1) 辅助寄存器( AR0~ AR7 )。2) 重复块长度寄存器( BK )。3) 堆栈指针。4) 暂存器( T )。5) 处理器工作方式状态寄存器( PMST )。6) 状态寄存器( ST0 和 ST1 )。7 )块重复计数器( BRC )。8 )存储器映象累加器( AG、 AH、 AL 、 BG、 BH、 BL )。

存储器冲突

60

流水线冲突情况分析

61

发生流水线冲突的例子

在流水线的执行 阶段进行写操作

在流水线的寻址阶段生成地址

无等待周期问题

解决

冲突数据未准备好

数据未准备好冲突

62

发生流水线冲突的例子 在流水线的执行阶段进

行写操作

读数阶段将常数 10写到 AR1

冲突同时利用 E总线

CPU 自动地将 STM的写操作延迟一个周期

在流水线的寻址阶段生成地址

新冲突数据未准备好

解决

总线冲突

63

发生流水线冲突的例子 STLM 指 令后面插入一条 NOP 指令

在流水线的执行阶段进行写操作

读数阶段将常数 10写到 AR1

在流水线的寻址阶段生成地址

E总线错开解决

数据准备好解决

64

( 2)用等待周期表解决流水线冲突

等待周期表给出了对存储器映象寄存器以及 ST0、 ST1、 PMST的控制字段进行写操作的各种指令所需插入的等待周期。

对双字或三字指令,都会提供隐含的保护周期。利用这些指令提供的隐含的保护周期,有时可以不插 NOP 指令。

65

控制字段 不插入 插入 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

 所有存储指令包括 SSXM 和 RSXM

 

A 或 B  修改累加器然后读

MMR 

在 RPTB[D]前读 BRC

STM # lk , BRCST # lk , BRCMVDK Smem , BRCMVMD MMR , BRC

所有其它存储指令 SRCCD(在循环中) 见说明 4

等待周期表 1

66

例 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允许符号位扩展

67

例 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 个等待周期,故只需要插入一条 NOP 指令。

68

第四节 指令系统概述

TMS320C54x 是 TMS320 系列中的一种定点数字信号处理器,它的指令系统分助记符形式和代数式形式两种。共有指令 129条,由于操作数的寻址方

式不同,派生至 205条。

69

可同时读入 2 或 3 个操作数;支持双精度运算的 32 位长操作数指令;可进行单条指令重复和块指令重复操作;有块存储器传送指令和并行操作(如并行存储和加载、并行存储和加 / 减法、并行存储和乘法、并行加载和乘法)指令;设有条件存储指令及延迟操作指令、有从中断快速返回指令;有为特殊用途设计的指令(如支持 FIR滤波、最小均方算法 LSM 、多项式计算以及浮点运算);有为省电安排的空转指令。

TMS320C54x 指令系统的主要特点

70

top related