slide1
Download
Skip this Video
Download Presentation
第三章 DSP 指令系统与特点

Loading in 2 Seconds...

play fullscreen
1 / 112

第三章 DSP 指令系统与特点 - PowerPoint PPT Presentation


  • 148 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about '第三章 DSP 指令系统与特点' - edana


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1
第三章 DSP指令系统与特点

第一节 数据寻址方式

第二节 程序存储器地址的生成方式

第三节 流水线

第四节 指令系统概述

slide2
第一节 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位长立即数。

slide3
寻址分类

1.立即数寻址

2.绝对地址寻址

3.累加器寻址

4.直接寻址

5.间接寻址

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

7.堆栈寻址

slide4
1.立即数寻址

指令中包含有执行指令所需要的操作数。

立即数分为3、5、8或9位的短立即数和16位的长立即数两种。

短立即数可包含在单字或双字指令中,长立即数在双字指令中。

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

LD #93h,A

LD 93h,A

举例

slide5
2.绝对地址寻址

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

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

方法

MVKD SAMPLE,*AR3

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

举例

slide6
2.绝对地址寻址

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

方法

MVPD TABLE,*AR4

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

举例

slide7
2.绝对地址寻址

(3)PA寻址 端口(PA)

方法

举例

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

PORTR FIFO,*AR5

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

2.绝对地址寻址

(4)*(lk)寻址

方法

举例

特点

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

LD *(BUFFER),A

slide9
3.累加器寻址

方法

特点

举例

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

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

READA Smem

WRITA Smem

slide10
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个存储单元中的任何一个单元。

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

slide12
5.间接寻址

方法

特点

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

(AR0~AR7)→

ARAU0/ARAU1 →

16位无符号算术运算→

寻址范围为64K

两个独立的存储器单元读数据

读一个、写另一个存储器单元

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

slide13
5.间接寻址

(1)单操作数寻址

LD *AR1,B

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

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

slide15
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。

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

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

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

功能

方法

举例

特点

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

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

0页寻址。

不影响当前DP或SP值 。用于直接寻址和间接寻址

LDM PRD,A

slide19
7.堆栈寻址

PSHD *AR2

POPD *AR3

功能

特点

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

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

slide20
第二节 程序存储器地址的生成

程序计数器(PC)

重复计数器(RC)

块重复计数器(BRC)

块重复起始地址寄存器(RSA)

块重复结束地址寄存器(REA)

程序地址生成器(PAGEN)构成

核心

地址内容为:

即将取指的某条指令;

某个16位立即操作数;

系数表。

在程序存储器中的地址

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

slide21
操作

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

slide22
1.分支转移操作

功能

方法

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

可执行:

分支转移

循环控制

子程序操作

slide23
转移种类

BC[D]如果指令中所规定的条件得到满足,就用指令中所给出的地址加载PC;

BANZ[D]如果当前辅助寄存器不等于0,就用指令中所规定的地址加载PC。

B[D]用指令中所给出的地址加载PC

BACC[D]用所指定的累加器的低16位作为地址加载PC。

条件分支转移

无条件分支转移

带延迟

不带延迟操作

B next

BACC A

BC new,AOV

BANZ loop,*AR2-

slide24
2.调用和返回

CALL[d] lop

RET main

无条件调用与返回

有条件调用与返回

带延迟

不带延迟

功能

方法

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

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

slide26
第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

相或关系

slide27
可以从A类中选一个条件,同时可以从B类中选择一个条件。但是不能从同一类中选择两个条件。

另外,两种条件测试的累加器必须是同一个。

第1组

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

例如

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

第2组

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

例如

slide29
如果条件分支转移出去的地方只有1~2字的程序段,则可以用一条单周期条件执行指令(XC)来代替分支转移指令:

XC n,cond[,cond[,cond]]

当n=1,且条件得到满足,就执行紧随此     条件指令后的1个字指令。

当n=2,且条件得到满足,就执行紧随此     指令后的1个双字指令或者2条单     字指令。

    当条件不满足,就依n的值执行1     条或2条NOP指令。

slide30
4.单条指令的重复操作

功能

重复执行下一条指令

特点1

特点2

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

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

slide31
重复过程

当RPT指令执行时:

①首先把循环的次数装入循环计数器(RC),

②其循环次数n由一个16位单数据存储器操作数

Smem或一个8位或16位常数k或lk给定。这样,

紧接着的下一条指令会循环执行n+1次。

③循环,RC在执行减1操作时不能被访问。

注意:该循环内不能套用循环。

当RPTZ指令执行时:对目的累加器dst清0,

循环执行下一条指令n+1次。

slide32
5.块重复操作

将重复操作的范围扩大到任意长度的循环回路

功能

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

特点

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

2.RPTB指令可以响应中断;

注意

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

slide34
6.循环的嵌套

嵌套原则

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

对寄存器的占用

执行RPT指令时占用RPTC寄存器(重复计数器);

执行RPTB指令时要用到BRC、RSA和RSE寄存器。只有一套块重复寄存器,故块重复操作不能嵌套。

由于RPT与RPTB两者用了不同的寄存器,因此RPT指令可以嵌套在RPTB指令中,实现循环的嵌套。

执行BANZ指令只占用辅助寄存器ARx。不会与RPT RPTB指令相冲突。

slide36
第三节 流水线

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

流水线

操作

流水线操作的优点

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

slide37
流水线操作

在第一个机器周期用PC中的内容加载PAB

预取指P

取指F

译码D

寻址A

读取操作数R

执行X

在第二个机器周期用读取到的指令字加载PB。

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

slide38
流水线操作

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

预取指P

取指F

译码D

寻址A

读取操作数R

执行X

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

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

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

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

空转浪费周期

例3-7

地址 指令

a1,a2 B b1 这是一个四周期、二字分支指令

a3 i3 这是任意的一周期、一字指令

a4 i4 这是任意的一周期、一字指令

... ...

b1 j1

slide40
分支转移指令流水线图

用分支转移指令的地址a1加载PAB。

取得双字分支转移指令

取得双字分支转移指令

slide41
分支转移指令流水线图

分支转移指令进入译码级

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

用新的值b1加载PAB

slide42
分支转移指令流水线图

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

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

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

执行j1指令

j1指令取指

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

延迟分支转移

1.延迟操作指令后面只有两个字的空

隙,因此不能在此空隙中安排任何

一类分支转移指令或重复指令;

2.在CALLD或RETD的空隙中还不能安

排PUSH和POP指令。

3.延迟操作指令比它们的非延迟型

指令要快,在调试延迟型指令时,

直观性稍差一些,因此希望在大多

数情况下还是采用非延迟型指令。

注意

slide44
例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)

在空闲的随后两周期中执行下两条指令

slide45
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

slide46
条件执行指令流水线图

XC指令的地址a4加载到PAB

取XC指令的操作码

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

slide47
1. XC是一条单字单周期指令,与条件跳

转指令相比,具有快速选择其后1或2

条指令是否执行的优点 ;

2. XC指令在执行前2个周期就已经求出

条件,如果在这之后到执行前改变条

件(如发生中断),将会造成无期望

的结果 。

3. 要尽力避免在XC指令执行前2个周期

改变所规定的条件 。

4. 并没有规定XC指令后的一条或两条指

令必须是单周期指令。

slide48
3.双寻址存储器的流水线冲突

CPU在单个周期内两次访问双寻址存储器

流水线冲突原因

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

(1)在单周期内允许同时访问DARAM的不同块。

(2)当流水线中的一条指令访问某一存储器块时,

允许流水线中处于同一级的另一条指令访问

另一个存储器块。

(3)允许处于流水线不同级上的两条指令同时访

问同一个存储器块。

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

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

对PAB/PB取指 利用前半周期

对DAB/DB读取第一个数据 利用前半周期

对CAB/CB读取第二个数据 利用后半周期

对EAB/EB将数据写存储器 利用后半周期

slide50
CPU同时访问DARAM的同一存储器块就会发生时序上的冲突。

(1) 同时从同一存储器块中取指和取操作数(都在前半个周期);2.同时对同一存储器块进行写操作和读(第二个数)操作(都在后半周期)。

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

解决

冲突

办法

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

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

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

1) 辅助寄存器(AR0~AR7)。

2) 重复块长度寄存器(BK)。

3) 堆栈指针。

4) 暂存器(T)。

5) 处理器工作方式状态寄存器(PMST)。

6) 状态寄存器(ST0和ST1)。

7)块重复计数器(BRC)。

8)存储器映象累加器(AG、AH、AL、BG、BH、BL)。

slide54
发生流水线冲突的例子

冲突

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

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

数据未准备好

解决

无等待周期问题

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

发生流水线冲突的例子

解决

冲突

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

新冲突

同时利用E总线

数据未准备好

读数阶段将常数10写到AR1

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

slide56
STLM指令后面插入一条NOP指令

发生流水线冲突的例子

E总线错开

解决

读数阶段将常数10写到AR1

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

数据准备好

解决

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

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

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

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

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

slide58
控制字段

不插入

插入1个

插入2个

T

STM #1k, T

MVDK Smem,T

LD Smem,T

LD Smem,T‖ST

所有其它存储指令

包括EXP

ASM

LD #k5, ASM

LD Smem,ASM

所有其它存储指令

DP

CPL=0

LD #k9, DP

LD Smem,DP

STM # lk,ST0

ST # lk,ST0

所有其它存储指令插入3个

SXM C16

FRCT OVM

所有存储指令

包括SSXM和RSXM

A 或B

修改累加器然后读MMR

在RPTB[D]前读BRC

STM # lk,BRC

ST # lk,BRC

MVDK Smem,BRC

MVMD MMR,BRC

所有其它存储指令

SRCCD

(在循环中)

见说明4

等待周期表1

slide59
例3-11 利用表3-8等待周期表1选择插入的NOP数。

SSBX SXM

NOP

LD @x,B

由于LD @ x,B是一条单字指令,不提供隐含的保护周期。根据表3-8的等待周期表1,应当在SSBX SXM 指令后插入一条NOP指令。而

SSBX SXM

LD *(x),B

由于LD *(x),B是一条双字的绝对寻址指令,它隐含一个等待周期,故SSBX指令就不要再插NOP指令了。

ST1第8位

SXM=0禁止符号位扩展

SXM=1允许符号位扩展

slide60
例3-12 利用隐含等待周期解决流水线冲突。

LD @GAIN ,T

STM #input,AR1

MPY *AR1+,A

例3-13 利用表3-8等待周期表3插入NOP周期解决流水线冲突。

STLM B,AR2

NOP

STM #input,AR3

MPY 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指令。

slide61
第四节 指令系统概述

TMS320C54x是TMS320系列中的一种定点数字信号处理器,它的指令系统分助记符形式和代数式形式两种。

共有指令129条,由于操作数的寻址方式不同,派生至205条。

slide62
TMS320C54x指令系统的主要特点

1.可同时读入2或3个操作数;

2.支持双精度运算的32位长操作数指令;

3.可进行单条指令重复和块指令重复操作;

4.有块存储器传送指令和并行操作(如并行存储和加载、并行存储和加/减法、并行存储和乘法、并行加载和乘法)指令;

5.设有条件存储指令及延迟操作指令、有从中断快速返回指令;

6.有为特殊用途设计的指令(如支持FIR滤波、最小均方算法LSM、多项式计算以及浮点运算);

7.有为省电安排的空转指令。

slide63
TMS320C54x的指令集有近两百条指令,按功能分为如下几类:

算术运算指令

逻辑运算指令

程序控制指令

装入和存储指令

slide64
一、算术运算指令

算术运算指令可分为如下几类:

 加法指令

 减法指令

 乘法指令

 乘加指令

 乘减指令

 双数/双精度指令

 特殊操作指令

slide66
定点DSP中数据表示方法
  • 当它表示一个整数时,其最低位(D0)表示1,D1位表示2的1次方,次高位(D14)表示2的14方。
  • 如果表示一个有符号数时,最高位(D15)为符号位,0表示正数,1表示负数。例如,07FFFH表示最大的正数32767(十进制),而0FFFFH表示最大的负数-1(负数用2的补码方式显示)。
  • 当需要表示小数时,小数点的位置始终在最高为后,而最高位(D15)表示符号位。这样次高位(D14)表示0.5,然后是0.25,最低位(D0)表示。所以4000H表示小数0.5,2000H表示小数0.25,而0001H表示16位定点DSP表示的最小的小数(有符号)0.000030517578125。
slide67
实现16位定点加法
  • ‘C54X中提供了多条用于加法的指令,如ADD,ADDC,ADDM和ADDS。其中ADDS用于无符号数的加法运算,ADDC用于带进位的加法运算(如32位扩展精度加法),而ADDM专用于立即数的加法。
slide68
使用ADD完成加法

ld temp1,a ;将变量temp1装入寄存器A

add temp2,a ;将变量temp2与寄存器A相加

;结果放入A中

stl a,temp3 ;将结果(低16位)存入变量

;temp3中。

注意,这里完成计算temp3=temp1+temp2,我们没有特意考虑temp1和temp2是整数还是小数,在加法和下面的减法中整数运算和定点的小数运算都是一样的。

slide69
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,A
  • ADD Xmem,Ymem, dst 例如:
  • ADD *AR2,*AR3,A
slide71
实现16位定点减法
  • ‘C54X中提供了多条用于减法的指令,如SUB,SUBB,SUBC和SUBS。其中SUBS用于无符号数的减法运算,SUBB用于带进位的减法运算(如32位扩展精度的减法),而SUBC为移位减,DSP中的除法就是用该指令来实现的。
slide72
减法指令使用举例

stm temp1,ar3 ;将变量temp1的地址装入ar3寄存器

stm temp3,ar2 ;将变量temp3的地址装入ar2寄存器

sub *ar2+, *ar3,b ;相减,结果放入寄存器B(高16位)中,

; 同时ar2加1。

sth b,63h ;将相减的结果(高16位)存入变量63h

slide73
利用SUBC实现除法
  • 在‘C54X中没有提供专门的除法指令,一般有两种方法来完成除法。一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于除以常数特别适用。另一种方法是使用SUBC指令,重复16次减法完成除法运算。
slide74
利用SUBC完成除法运算

ld temp1,B ;将被除数temp1装入B寄存

;器的低16位

rpt #15 ;重复SUBC指令16次

subc temp2,b ;使用SUBC指令完成除法

stl B,temp3 ;将商(B寄存器的低16位)

;存入变量temp3

sth B,temp4 ;将余数(B寄存器的高16位)

;存入变量temp4

注: 实际上是完成整数除法

slide75
实现小数除法
  • 在‘C54X中实现16位的小数除法与前面的整数除法基本一致,也是使用SUBC指令来完成。但有两点需要注意:第一,小数除法的结果一定是小数(小于1),所以被除数一定小于除数。在执行SUBC指令前,应将被除数装入A或B寄存器的高16位,而不是低16位。其结果的格式与整数除法一样。第二,应考虑符号位对结果小数点的影响。所以应对商右移一位,得到正确的有符号数。
slide77
实现16定点整数乘法
  • 在‘C54X中提供了大量的乘法运算指令,其结果都是32位,放在A或B寄存器中。乘数在‘C54X的乘法指令很灵活,可以是T寄存器、立即数、存贮单元和A或B寄存器的高16位。如果是无符号数乘时,请使用MPYU指令。这是一条专用于无符号数乘法运算的指令,而其它指令都是有符号数的乘法。
slide79
整数乘法举例
  • rsbx FRCT ;清FRCT标志,准备整数乘
  • ld temp1,T ;将变量temp1装入T寄存器
  • mpy temp2,a ;完成temp2*temp1,结果放
  • ;入A寄存器(32位)
slide80
实现小数乘法
  • 在‘C54X中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。‘C54X中提供了一个状态位FRCT,将其设置为1时,系统自动将乘积结果左移移位。两个小数(16位)相乘后结果为32位,如果精度允许的话,可以只存高16位,将低16位丢弃,这样仍可得到16位的结果。
slide81
小数乘法举例

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

slide86
二、逻辑运算指令

逻辑指令包括与、或、异或、移位和测试指令

1、与指令(AND)

slide89
三、程序控制指令

程序控制指令包括:

分支指令

调用指令

中断指令

返回指令

重复指令

堆栈操作指令

混合程序控制指令

slide95
四、装入和存储指令

装入和存储指令包括:

一般的装入和存储指令

条件存储指令

并行装入和存储指令

并行装入和乘法指令

并行存储和加件乘指令

混合装入和存储指令

slide99
3 并行装入和存储指令

4、条件存储指令

slide103
注意:同一条指令在不同存储器中可能有不同执行时间
  • 操作数在双寻址空间、单寻址空间和外部
  • 程序代码在双寻址、单寻址和外部空间
  • 操作数和代码在相同存储器块中
  • 数据空间插入了等待周期
  • 程序空间插入了等待周期
slide104
特殊指令使用说明

FIRS指令

FIRS指令用于线性相位滤波器的处理。一个如下图的8阶线性相位滤波器的输出表达式:

FIRS指令使用方法:

FIRS *AR2+, *AR3+, COEF

fir mac firs
FIR滤波的两指令MAC、FIRS

RPTZ A,#(N-1) ;重复MAC指令N次,先将A清零

MAC *FIR_DATA_P+0%,*FIR_COFF_P+0%,A

; 完成滤波计算。注意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译码指令DADST、DSADT、CMPS

在信道均衡和解码中经常会使用到Viterbi算法,C54x为此提供了专门的硬件和指令。根据输入信号确定分支似然概率增加量D1/D2,放在T寄存器中,TRN存储可能信号译码输出。

slide108
最小均方运算LMS

在进行自适应滤波等操作中经常会使用LMS算法,C54x提供的LMS指令方便了编程。如下图所示的自适应滤波器设计中,滤波器系数修正公式为:

其中,e(i) = d(i) - y(i)。

滤波器输出:

exp norm
数据归一化相关指令EXP、NORM

归一化一个数是先求其指数,然后把它调整到最大精度格式。实现方法如下:

mvdd mvdp mvpd
数据块移动MVDD、MVDP、MVPD

在C54x系列DSP,数据与数据存储器、数据与程序存储器之间可以方便的进行数据传输,结合单指令循环可实现数据块移动。如16个系数的移动:

slide112
指令效率的提高

C54x中有一些指令功能差不多,但编写出的程序效率不同,应灵活使用,如:

MPY[R] Smem, dst ;T*(Smen)dst

MAC[R] Smem, dst ;(Smen)*T+src

( MPY[R] +ADD) ; src

MACD Smen,pmen,src ;pmend PAR

(MAC+DELY+LD) ;(Smem)*(pmed)

; +(src) src

;(Smem)T

;(Smem) Smem+1

ad