3986.net
小网站 大容量 大智慧
相关标签
当前位置:首页 >> 计算机硬件及网络 >>

DSP中C54x指令系统


第3章 C54x的指令系统
3.1 3.2 3.3 3.4 3.5 数据寻址方式 程序存储器地址生成的方式 流水线 指令的表示方法 指令系统

一、立即寻址(续)
16 位长值常数 需要2 字,2周期 需要2 字,2 ARi初始化例子 ARi初始化例子

3.1

数据的寻址方式

Example: STM #1234h, AR2 AR2赋值1234h.

短值 3, 5, 8, 9 位短值常数 需要1 字,1周期 需要1 字,1 为用于初始化短寄存器 或位域,如: 或位域,如: DP, ASM …
ESIEE, Slide 4

Example: LD #6, DP DP赋值6.

ESIEE, Slide 1

3.1
? ? ? ? ? ? ?

数据寻址方式

一、立即寻址(续)
可带有立即数寻址的指令有:

3.1

数据的寻址方式

一、立即寻址Immediate addressing 二、绝对寻址Absolute addressing Absolute 三、累加器寻址Accumulator Addressing 四、直接寻址Direct Addressing 五、间接寻址Indirect Addressing 六、存储器映射寄存器寻址Memory-Mapped Register Addressing 七、堆栈寻址Stack Addressing

ESIEE, Slide 2

ESIEE, Slide 5

一、立即寻址

3.1

数据的寻址方式

二、绝对寻址模式 *( x )

3.1

数据的寻址方式

立即寻址是指令中包含执行指令的操作数,在该操 作数前加#,表示立即数。 例子: ADD #4,A;4与A中内容加放在A中 一般初始化设置使用。
start: LD LD LD LD #100, A ;64H (AL) #10h, 4, A ;10H<<4是100H (AL) AL在内存地址是0008H #32768, B ; 32768是 8000H (BL) BL在内存地址是000BH #0A000h, 16, B ;A000H<<16是A0000000H (B) ; B在内存的地址是: 000BH和000CH

容许在指令中包含寻址单元的地址标号。 *(address) 这些地址可以是数据存储器、程序存储器或IO存储 器,也可以是16 位常数地址。 有四种类型:
MVKD DATA,*AR5 ;数据存储器DATA地址单元的数传送 ;到AR5寄存器指向的数据存储单元.。 MVPD TABLE,*AR7- ; 程序存储器TABLE地址单元的数传 ;送到AR7寄存器指向的数据存储单元。 PORTR FIFO, *AR5 ;从FIFO端口读数,将其存放到AR5寄存 ; 器指向的数据存储单元。FIFO是一个端口标号。 LD *(BUFFER),A ;将BUFFER符号所指的数据存储单元 ; 中的数传送到累加器A 需要注意的是: 需要注意的是: 1. 指令长度是2个字,包括要寻单元的地址。 指令长度是2 2.指令有较强的针对性,RAM RAM,ROM RAM和端 .指令有较强的针对性,RAM RAM, RAM和 口 RAM的操作。 RAM的操作。
ESIEE, Slide 6

立即数有两种形式: (1)长立即数(16位) )长立即数(16位) (2)短立即数:有3,5,8,9位。 )短立即数:有
ESIEE, Slide 3

三、累加器寻址

3.1

数据的寻址方式

四、直接寻址 @(续)
数据存储页:
Addresses in Dec Hex Data memory 0 0000 Page 0 128 0080 Page 1 256 0100 Page 2

3.1

数据的寻址方式

累加器寻址是利用累加器的数值作为地址来读写程序存 储器。 READA Smem ; A中数为程序存储器地址,读该的单元 A中数为程序存储器地址,读该的单元 ;中的数传送到 Smem指向的数据存储单元中 Smem指向的数据存储单元中 WRITA Smem ; 将Smem指向数据存储单元的数传送到A Smem指向数据存储单元的数传送到A ;中数为程序地址的单元中 例如:LD #0100H, A ;立即数0100H (A)中, 例如:LD #0100H, ;立即数0100H (A)中, ;0100H可以是程序空间地址,如表格,数据是F020H 0100H可以是程序空间地址,如表格, 数据是F020H STM #0060H,AR1 ;AR1=0060H READA *AR1 ;将程序空间0100H中的数据 ;将程序空间0100H中的数据 F020H存放到0060H. F020H存放到0060H. 如果用RPT重复操作指令,A地址自动加1,当然此时单操 如果用RPT重复操作指令,A 地址自动加1 作数是*AR1+,用于表数据传输 作数是* AR1+,用于表数据传输

128 words 128 words 128 words 512 Pages

Page 511 65535 FFFF
ESIEE, Slide 7 ESIEE, Slide 10

128 words

三、累加器寻址

3.1

数据的寻址方式

四、直接寻址 @(续)

3.1

数据的寻址方式

累加器寻址是利用累加器的数值作为地址来读写程 序存储器。有两种: READA Smem ; A中数为程序存储器地址,读该单元
;中的数传送到 Smem指向的数据存储单元中

WRITA Smem ; 将Smem指向的数据存储单元的数传送
;到A中 例如:LD #0100H, A ;立即数0100H (A)中, ;0100H可以是程序空间地址,如表格,数据是F020H STM #0060H,AR1 ;AR1=0060H READA *AR1 ;将程序空间0100H中的数据 F020H存放到0060H.

使用DP 指针: 16位地址= DP中的9位(MSB) : 7 LSB The 7 LSB 在指令中 The 9 MSB 在 DP寄存器中 使用SP 指针 16位地址= SP中的16 位+ 7位 其中7是操作指令中的偏移量

注意:C548以上的C54x 芯片有23条地址线,它的 程序存储器单元就由累加器的低23位确定。
ESIEE, Slide 8 ESIEE, Slide 11

四、直接寻址 @

3.1

数据的寻址方式

四、直接寻址 @(续)
数据存储器地址生成的框图:

3.1

数据的寻址方式

直接寻址 = 是相对一个基地址的随机访问。
直接寻址是在指令中,包含有数据存储器地址的 低7位(dmad)。该7位作为偏移地址值与基地址值

是数据页指针DP 9位或堆栈指针SP是16位。
数据存储器被分为: 512 pages of 128 words (512×128 = 216)。
数据地址产生器

数据页指针 DP(9位) : dmad(7位)
CPL bit = 0 in ST1

堆栈指针 SP(16位)+dmad(7位)
CPL bit = 1 in ST1

ESIEE, Slide 9

ESIEE, Slide 12

四、直接寻址 @(续) 直接寻址
CPL = 0 指令 DP 寄存器 形成的地址 CPL = 1 SP 寄存器
15 - 8 Opcode 7 I=0

3.1

数据的寻址方式

四、直接寻址 @,DP 相关

3.1

数据的寻址方式

6-0 dmad

9-bit DP 9-bit DP 7-bit dmad

当DP被初始化后,它成为单字单周期指令容易寻 址。 在数据存储器中定义512页(选择DP值),每页 128字,(后7位是指令提供)。 CPL 复位:

RSBX CPL ; CPL = 0 复位

16-bit 堆栈指针


形成的地址
ESIEE, Slide 13

7-bit dmad

16-bit 数据存储器地址

ESIEE, Slide 16

四、直接寻址 @,例子
Addresses in Dec Hex

3.1

数据的寻址方式

四、直接寻址 @,SP 相关
使用C编译器 基于堆栈的操作是有用的 控制 CPL 设置: SSBX CPL

3.1

数据的寻址方式

Data memory Page 0 Page 1 128 words 128 words 128 words

0 128

0000 0080 0100

256

Page 2
127

0 1

DP = 2, 第 2页 2, 在指令中的偏移量 = 1 地址 = 0101 in hexadecimal 7位 DP 000000010 0000001

Page 3 to 510

Page 511 65 535
ESIEE, Slide 14

FFFF

128 words

ESIEE, Slide 17

举例:
执行一个x+y 的运算 已知

3.1

数据的寻址方式

五、间接寻址模式 *ARi

3.1

数据的寻址方式

x: y:

x: y:

地址 0180 … 01FF 0200 …

数据 0001 … 1000h 0500h …

执行如下指令: .text LD #0003, DP ;DP=003,指向RAM第4页,0180~01FF LD @x, A ;指令操作码是107f h, x地址中数据给A LD #0004,DP ;加一句才正确: ADD @y, A ;指令操作码是是0000h,y地址中数据+A, 保存到A

兼容C 指针。 兼容C 指针。 有8 个ARi 辅助寄存器保存操作地址,并作为指 针使用,每个辅助寄存器16位地址,都可以实现 针使用,每个辅助寄存器16位地址,都可以实现 64K寻址. 64K寻址. 有2 个ARAU =赋值寄存器运算单元实现地址储 存在 ARi中操作. ARi中操作. 单操作数(Smem) 间接寻址:从存储器读写一个 操作数(Smem) 16位数 16位数 双 操作数 (Xmem, Ymem) 间接寻址:1条指令访 间接寻址:1 问两个数据存储单元. 问两个数据存储单元. 这些操作对于DSP非常有效率. 这些操作对于DSP非常有效率.

ESIEE, Slide 15

ESIEE, Slide 18

五、间接寻址模式 *ARi

3.1

数据的寻址方式

3.1

数据的寻址方式

范例:
也可以通过 ARAU0,1 产生循环变 化地址

STM #0060h, AR1 ;AR1中的内容是地址 LD *AR1+0, A ;(AR1)中的内容 (A) ;然后(AR1+AR0) (AR1) LD *AR1, B ;(AR1) (B)

产生地址
数据作为地址给ARx

从EB总线保存数据到ARi
ESIEE, Slide 22

ESIEE, Slide 19

(1)单操作数间接寻址

3.1

数据的寻址方式

3.1

数据的寻址方式

(a)循环寻址(MOD=8,9,10,11,14)
在许多算法,比如卷积、相关、和FIR滤器算法中 ,需要在存储器中设置一个循环的缓冲区。在这些 算法中,循环缓冲区是一个活动的窗口,保存一批 最近数据。在循环寻址计算的过程中,当新建数据 进来,缓冲区最老的数据被覆盖。循环的寻址是实 现循环的缓冲区的关键。 循环缓冲区的主要参数: a. BK-长度计数器。循环缓冲区的大小R(R<2N) b. EFB-有效基地址。缓冲区的起始地址。 c. EOB-尾地址。缓冲区的尾部地址。 d. index-缓冲区索引。当前ARx的低N位。 e. Step-一次加到辅助R或从辅助R中减去的值
ESIEE, Slide 23

单操作数寻址是指令中只有一个存储器操作数。格 式如下:
15 操作码 8 7 I=1 6 MOD 3 2 ARF 0

前8位是指令的操作码; I=1:指令使用的寻址方式是间接寻址,以示与直 接寻址的区别。 MOD:4位修改域,定义间接寻址的方法,见表3-3 ARF: 这 3位是辅助寄存器域,定义辅助寄存器使 用的寻址。 表3-3列出了间接寻址方式中对单操作数的寻址类 型:
ESIEE, Slide 20

MOD合 计4比特

(1)单操作数间接寻址(续)
MOD域 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 操作码 *ARx *ARx*ARx+ *+ARx *ARx-0B *ARx-0 *ARx+0 *ARx+0B *ARx-% *ARx-0% *ARx+% *ARx+0% *ARx(lk) *+ARx(lk)

3.1

数据的寻址方式

变址 寻址 索引寻址 翻转寻址 (位倒序) 循环寻址
表3-3 单操作数 间接寻址类型
ESIEE, Slide 21

功能 Addr=ARx Addr=ARx, ARx=ARx-1 Addr=ARx, ARx=ARx+1 Addr=ARx+1, ARx=ARx+1 Addr=ARx, ARx=B(ARx-AR0) Addr=ARx, ARx=ARx-AR0 Addr=ARx, ARx=ARx+AR0 Addr=ARx, ARx=B(ARx+AR0) Addr=ARx, ARx=circ(ARx-1) Addr=ARx, ARx=circ(ARx-AR0) Addr=ARx, ARx=circ(ARx+1) Addr=ARx, ARx=circ(ARx+AR0) Addr=ARx+lk, ARx=ARx Addr=ARx+lk, ARx=ARx+lk *+ARx(lk)% Addr=circ(ARx+lk), ARx=circ(ARx+lk) *(lk) Addr=lk,

(a)循环寻址(MOD=8,9,10,11,14) )循环寻址( MOD= 10, 11, 14)
例1:一个31字的循环缓冲区必须从地址XXXX XXXX XXX0 0000B开始(也就是地址的低5位是0, N=5),并且值 31必须被加载到 BK寄存器。 例2:一个32字的循环缓冲区必须从地址XXXX XXXX XX00 0000B开始(该地址的低6位是0,N=6) ,并且值32必须被加载到 BK寄存器。

3.1

数据的寻址方式

ESIEE, Slide 24

3.1

数据的寻址方式

3.1

数据的寻址方式

(a)循环寻址(MOD=8,9,10,11,14) )循环寻址(MOD= 10, 11, 14)
在循环寻址时,首先要选定一个辅助寄存器 (ARx)指向缓冲区。当应用循环寻址时注意如下三个 ARx) 问题: 问题: 1) 循环缓冲区长度R<2N,N位为0的地址开始。 位为0 循环缓冲区长度R 2) 应用步长少于或等于循环缓冲区的长度 3) 这辅助寄存器必须指向在循环缓冲的队列中的单 元

(a)循环缓冲寻址 C54x例子 C54x例子
开设缓冲区长度:R=30
数据存储器 起始地址 = xxxxxxxxxxx00000 ARi ARi xxxxxxxxxxx00010

N=5
结束地址 = xxxxxxxxxxx11111

BK R=30=1 1 1 1 0

ESIEE, Slide 25

ESIEE, Slide 28

循环缓冲区,Circular Buffer
x1 x 2 x1 x 2 x3 x4 x5 x6 x7 x8 x9 x3 x4 x5 x6 x7 x8 x9

(2)双操作数间接寻址

3.1

数据的寻址方式

双操作数寻址用在完成两个读或一个读且一个写的 指令中。这些指令只有一个字长,只能以间接寻址 的方式工作。格式如下:
15 操作码 8 7 6 5 Xar 4 3 2 1 Ymod Yar 0 Xmod

x2 x9

x3 x4 x2

x5 x6

x7 x8 x9 x7 x8

x3 x4

x5 x6

x9 x10 x3 x4 x5 x6 x7 x8

前8位是指令的操作码; Xmod、Ymod:定义了用于访问Xmem、Ymem操 作数间接寻址方式的类型。 Xar、Yar:确定了包含Xmem、Ymem地址的辅助 寄存器。 表3-5列出了双操作数间接寻址的类型。见P62

ESIEE, Slide 26

ESIEE, Slide 29

3.1

数据的寻址方式

x8

x9 x1
x10

六、MMR 存储器映射寄存器寻址模式
主要用于0页128字的寻址. 主要用于0 128字的寻址. 当采用直接寻址方式时,高9位数据存储器地址被 当采用直接寻址方式时,高9 置成0,(不管当前的DP或SP是何值),利用指 置成0 ,(不管当前的DP或SP是何值),利用指 令的低7位访问MMR。 令的低7位访问MMR。 当采用间接寻址方式时,高9位数据存储器地址被 当采用间接寻址方式时,高9 置成0,按当前辅助寄存器的低7位访问MMR。注 置成0 ,按当前辅助寄存器的低7 位访问MMR。注 意,此种方式访问MMR,寻址操作完成后,辅助 意,此种方式访问MMR,寻址操作完成后,辅助 寄存器的高9位强迫置0。 寄存器的高9位强迫置0
0000h MMRs 0060h Scratch 007Fh
ESIEE, Slide 30

x7

x2

x6

x3
x5 x4

ESIEE, Slide 27

3.1

数据的寻址方式

存储器映射寄存器寻址共有8条指令:
将MMR数据加载到累加器 LDM MMR,dst AL MMR STLM src,MMR 数据存储器向MMR传送数据 MVDM dmad,MMR MMR向数据存储器传送数据MVMD MMR,dmad MMRx向MMRy传送数据 MVMM MMRx, MMRy 弹出数据到MMR POPM MMR 将MMR数据入栈 PSHM MMR 长立即数 MMR STM #lk,MMR MMR寻址方式是寻址速度快,由于使用低7位,故 只能访问数据存储器的0页资源(0000H~007FH)
ESIEE, Slide 31

C54x寻址模式训练DP=0 Given:
Address/Data (Hex) 60 20 CPL=0 61 120 CMPT=0 62
寻址模式 立即 MMR MMR MMR 直接 间接 直接 间接 立即 直接 间接 间接 立即 间接 间接 直接 程 序 #0, DP #2, AR0 #200h, AR1 #300h, AR2 @61h, A *AR1+, A @60h, A, B *AR1+, B, A #6, DP @1, A *AR2+, A *AR2+, A #30, A *AR1-0, A, B *AR2-0, B, A A, 60h

DP=4 200 100 201 60 202 40
A B DP 0

3.1 数据的寻址方式 DP=6 300 100 301 30 302 60
AR0 2 200 300 AR1 AR2

ESIEE, Slide 34

LD STM STM STM LD ADD SUB ADD LD ADD ADD SUB SUB ADD SUB STL

120 220 200 260 6 290 390 360 340 380 320 60

201

301 302

300

3.1

数据的寻址方式

3.1

数据的寻址方式

范例: MMR (存储器映射寄存器寻址) 和立即寻址 范例: 存储器映射寄存器寻址)
tbl x y .sect ”init" .int 1, 2, 3 .usect "vars", 3 .usect "result", 1 .sect “code” start: STM #tbl, AR1 STM #x, AR2
0000 MMRs 0060 007F

7、堆栈寻址
堆栈寻址是利用堆栈指针来寻址。堆栈指针SP始 堆栈寻址是利用堆栈指针来寻址。堆栈指针SP始 终指向堆栈中存放的最后一个数据。C54x的堆栈 终指向堆栈中存放的最后一个数据。C54x的堆栈 是从高地址向低地址方向生长。 是从高地址向低地址方向生长。 有4条指令用于堆栈寻址: PSHD 将数据存储器中的数据压入堆栈 PSHM MMR 将MMR数据入栈 MMR数据入栈 POPM MMR 弹出数据到MMR 弹出数据到MMR POPM 堆栈中弹出数据到数据存储器 入栈时,SP-1,数据入栈;出栈时弹出数据,SP 入栈时,SP- ,数据入栈;出栈时弹出数据,SP +1(字)

STM (STore to Memory-mapped register) 保存立即数到 MMR

这 是将tbl 表16-bit地址的第1 个单元的地址给AR1

MMR = 存储器映射寄存器 随机存储器

Scratch

ESIEE, Slide 32

ESIEE, Slide 35

MMR存储器映射寄存器 MMR存储器映射寄存器
名称

3.1
name AR0 AR1 AR2 AR3 AR4 AR5 AR6 AR7 SP BK BRC RSA REA add (Hex) 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C

数据的寻址方式
description

IMR IFR ----ST0 ST1 AL AH AG BL BH BG T TRN

地址 (Hex) 0000 0001 2-5 0006 0007 0008 0009 000A 000B 000C 000D

说明

Interrupt Mask Register Interrupt Flag Register Reserved Status 0 Register Status 1 Register A accumulator low A accumulator high A accumulator guard B accumulator low B accumulator high B accumulator guard Temporary Register Transition Register

000E 000F

PMST 001D ------- 01E-01F

Address Register 0 Address Register 1 Address Register 2 Address Register 3 Address Register 4 Address Register 5 Address Register 6 Address Register 7 Stack Pointer Register Circular Size Register Block Repeat Counter Block Repeat Start Address Block Repeat End Address PMST Register Reserved

分配段 Allocating Sections

Note: XPC and Peripheral MMR locations are device dependent
ESIEE, Slide 33 ESIEE, Slide 36

范 例
算法 y = x1 + x0 + x2 过程

系统图
DROM init[3] EPROM (code) RAM x[3] C5000 CPU RAM y

对于这段名的定义
程序员需要使用专门标识说明段名
初始化段 Code 代码 系统提供
使用默认段 名字

分配段 (代码, 常数, 变量) 建立寻址方式 加运算 (x1 + x0 + x2) 存储结果 (y) 如何适当的分配段?单片机在汇编程序中定位, 如ORG
ESIEE, Slide 37

Code or Variables Constants 变量 代码和常数

未初始化段
为数据段保留 空间

.text

.data

.bss

由用户提供 命名的段名

.sect

.usect

ESIEE, Slide 40

DSP汇编是如何定位? DSP汇编是如何定位?
程序员在汇编程序中没有给出准确的地址: 程序员在汇编程序中没有给出准确的地址:
在程序存储器中什么地方去读代码 在数据存储器中什么地方去读数据

C54系列内部总线,字宽
在 C54x DSP中,数据和程序存储都是按 16-bit 字。数据总线是16-bit宽。 数据和指令一般是 N=16 bits。 一些指令可能需要用几个 16-bit 字。 一些数据操作可能双精度和2个字。 内部总线:2 个数据读,1 个数据写。

DSP汇编程序采用可变的地址 DSP汇编程序采用可变的地址 DSP汇编和连接使用COFF文件: DSP汇编和连接使用COFF文件:
COFF = Common Object File Format. 在COFF文件中, 有专门的段用于代码、变量和 COFF文件中, 常数。 程序员在命令文件中需要为连接器详细说明在系 统的存储器中不同的段如何分配

ESIEE, Slide 38

ESIEE, Slide 41

段定义
对于代码,变量和常数需要不同的标识定 义段。 段可以被初始化也可以不初始化。
一个被初始化的段填满程序代码或常数值。 一个没有被初始化的段存放变量。

段可以使用默认的名字或由程序员给出名 字。

DSP的CCS使用汇编需要3个文件是: DSP的 CCS使用汇编需要3个文件是: (1) .ASM是可编辑的源程序, .ASM是可编辑的源程序, (2).CMD内存定位文件也是可编辑的文件,是数 CMD内存定位文件也是可编辑的文件,是数 据程序段的分配。其中的文件名必须与 .ASM的文件 据程序段的分配。其中的文件名必须与 ASM的文件 名一致,当汇编程序名改变时,该文件中要读取和 名一致,当汇编程序名改变时,该文件中要读取和 产生的文件名也需要修改,否则将覆盖原来文件。 (3). VECTERS.asm文件不动,是中断矢量分配。 VECTERS.asm文件不动,是中断矢量分配。 后面会介绍这3个文件的情况。在CCS集成开发环境 后面会介绍这3个文件的情况。在CCS集成开发环境 中需要将这3个文件加入到新建的工程文件中,才可 中需要将这3 以完成模拟仿真调试。

ESIEE, Slide 39

ESIEE, Slide 42

(1) LAB2b.asm文件 LAB2b.asm文件
TMS320C54x COFF Assembler Version 1.10 Mon Sep 18 20:07:52 2000 20:07:52

Copyright (c) 1993-1995 Texas Instruments Incorporated 1993lab2b.asm PAGE 1 1 ;******************************** 2 ; Absolute Addressing 3 ;******************************** 5 .def start ;定义程序开始 6 0060 SAMPLE .set 0060h ;设置符号常数为0060H ;设置符号常数为0060H 7 0000 .bss x,10 ;为变量x开辟空间,在0060H-006AH 为变量x 开辟空间,在0060H8 0000 .data ; 开辟数据存储空间,数据段 9 0000 0001 table: .word 1 ; 空间分配将在.cmd 文件中 空间分配将在. 10 0001 0002 .word 2 ; 保存在数据区0080H 保存在数据区0080H 11 0002 0003 .word 3 12 0003 0004 .word 4 13 0004 0005 .word 5

SECTIONS { .text : >EPROM PAGE 0 .bss : >SPRAM PAGE 1 在1页 .data : >DARAM PAGE 1 STACK : >DARAM PAGE 1 }

;汇编程序在0页 ;变量,数据和堆栈

ESIEE, Slide 43

ESIEE, Slide 46

14 0000 .text ;代码段 15 0000 F020 4AB8 start: LD #4AB8h, A ;立即数4AB8H (AL) 立即数4AB8H start: 16 0002 80F8 0060 STL A, *(SAMPLE) ; (A) (0060H) (A) 0060H) 18 0004 7712 STM #0060h, AR2 ; 0060H AR2 19 0006 EC04 RPT #4 ; 下面语句重复5次(4+1) #4 下面语句重复5 次(4 20 0007 7C92 MVPD table, *AR2+ ; 程序存储空间数据 ; *(AR2+) 22 0009 EC04 RPT #4 ; 下面语句重复5次(4+1) #4 下面语句重复5 次(4 23 000a 7092 MVKD SAMPLE, *AR2+;数据空间数据 *AR2+;数据空间数据 ; (AR2+) 25 000c 11F8 LD *(x), B ; X变量内容 (B)(0060) *(x), X变量内容 (B)( 0060) 26 000e 10F8 LD *(0061h), A ; 0061地址中内容 (A) *(0061h), 0061地址中内容 27 0010 F073 here: B here 0011 0010‘ .end 0010‘

(3) VECTORS.asm文件 VECTORS.asm文件
第3个文件是:vectors.asm ********************** * vectors.asm * * Reset vector * ********************** .title "vectors.asm" .ref start .sect ".vectors" B start ;程序开始地址 .end

ESIEE, Slide 44

ESIEE, Slide 47

(2)LAB2b.cmd内存定位文件 LAB2b.cmd内存定位文件
;以下文件是lab2b.cmd 连接用命令文件 以下文件是lab2b.cmd lab2b.obj ;说明是通过lab2b.asm汇编后产生文件 lab2b.obj ;说明是通过lab2b.asm汇编后产生文件 -o lab2b.out ;说明用于模拟和在线仿真调试的输出文件 lab2b.out ;说明用于模拟和在线仿真调试的输出文件 -m lab2b.map ;汇编后映射文件 lab2b.map -e start MEMORY ;储存区分配说明 ;储存区分配说明 { PAGE 0: ; 0页使用程序空间 0页使用程序空间 EPROM : org=0E000h, len=100h ;用户程序开始地址是E000H, len=100h ;用户程序开始地址是E000H, ; 程序长度256个字 程序长度256个字 PAGE 1: ; 1页使用数据空间 1页使用数据空间 SPRAM : org=0060h, len=20h ; 变量数据区, len=20h 变量数据区, ; 要求: len<=0080H-0060H 要求: len<=0080HDARAM : org=0080h, len=100h ;常数数据区 len=100h ;常数数据区 } ;数据区设置要顺序排,不要重叠 ;数据区设置要顺序排,

3.2

程序存储器地址生成的方式
一、程序存储器地址产生 二、程序计数器(PC) 三、跳转 四、调用和返回 五、条件操作 六、单指令重复操作

ESIEE, Slide 45

ESIEE, Slide 48

一、程序存储器地址产生

3.2

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

一、程序存储器地址产生(续)

3.2

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

程序存储器包含应用代码、系数表和立即数。 C54x DSP可以使用程序地址总线(PAB)寻址64K 字的程序空间。 下表是带有附加程序存储器地址线的器件:
器 件 C548, C549, C5410 C5402 C5420 附加地址线 7 4 2 提供的外部访问空间 128页(64K字/页) 16页(64K字/页) 4页(64K字/页)

在以上这些操作中,将把一个不是顺序的新地址加 载到PC。 C54x通过程序地址总线(PAB)寻址64K字,读取 程序存储器中的应用程序代码,系数表和常数等。 在C54x中有专门的程序地址生成器(PAGEN)生 成地址,PAGEN有5个寄存器,具体是: 程序计数器(PC) 程序计数器(PC) 重复计数器(RC) 重复计数器(RC) 块重复计数器(BRC) 块重复计数器(BRC) 块重复起始地址寄存器(RSA) 块重复起始地址寄存器(RSA) 块重复结束地址寄存器(REA) 块重复结束地址寄存器(REA)
PAGEN PC指针 重复寄存器 RC BRC RSA/REA

程序存储器地址产生逻辑(PAGEN)

ESIEE, Slide 49

ESIEE, Slide 52

一、程序存储器地址产生

3.2

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

3.2

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

程序存储器地址产生逻辑(PAGEN) 产生的地址用来访问指令、系数表、16位立即数或 其他存储在程序存储器里的信息。 PAGEN将它产生的地址送上PAB总线。 PAGEN有5个寄存器: 程序计数器PC 重复计数器RC 块重复计数器BRC
块重复起始地址寄存器RSA 块重复结束地址寄存器REA 程序计数器扩展寄存器XPC

二、程序计数器(PC)
程序计数器(PC)是一个包含内部或外部程序存储 器地址的16位寄存器。 当要取一条指令,或者要对程序存储器中一个16位 的立即数或系数表进行访问时,就要使用PC。 要访问程序存储器时,PC中的地址被送了PAB总线 PC有多种装载的方法。 下表列出了对应于不同的执行代码时PC应装入的值

ESIEE, Slide 50

ESIEE, Slide 53

一、程序存储器地址产生(续)

3.2

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

二、程序计数器(PC)
表 操 作

3.2

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

C54x有程序存储器地址生成方式,还有数据地址生 成逻辑,在前面已经介绍的采用间接寻址的方法, 使用ARU0,ARU1单元,通过AR0,AR1产生地址 操作,可以用于DAB,DCB地址对CB和DB进行读 操作;通过EAB对EB总线进行操作。下面讨论的是 程序存储器地址生成方式。 在正常操作时,地址顺序+1,即PC=PC+1,然 而在有些情况下需要进行如下操作: 分支转移 调用、返回 条件操作 单条指令或指令重复操作 硬件服务 中断

下表列出了对应于不同的执行代码时PC应装入的值 向PC中装载地址的操作
加载到PC的地址 PC=FF80h PC=PC+1 指令后的16位立即数加载PC 用累加器A或B的低16位加载PC 若BRAF=1(块重复有效),当PC+1等于 REA+1时,将RSA加载PC 将PC+2压入堆栈,并用指令后的16位立 即数加载PC。
将PC+1压入堆栈,用A或B的低16位加载PC

复位 顺序执行指令 分支转移 由累加器分支转移 块重复循环 子程序调用 从累加器调用子程序 硬件中断或软件中断

将PC压入堆栈,用适当的中断向量地址加 载PC。

ESIEE, Slide 51

ESIEE, Slide 54

二、程序计数器(PC)

3.2

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

3.2

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

三、分支转移(续)
2. 有条件分支转移
条件分支转移操作与无条件分支转移操作相类似,只是它需 要满足用户规定的一个或多个条件时才能执行。满足时,将 分支转移指令的第二个字(分支转移地址)加载到PC。同样 条件分支转移也存在带延迟和无延迟的问题。下表是条件分 支转移指令。 条件分支转移指令 指令 说 明
周期数 (条件满足/不满足) 不延迟 延迟

XPC是一个7位的寄存器,用来选择程序存储器的扩 展页。下表列出了装载XPC的操作。
表 操 作

向XPC中装载地址的操作

加载到PC的地址 PC=FF80h,XPC=0h PC=PC+1,XPC不会自动增加 指令后立即数的15~0位送PC,23~16位送XPC A或B的15~0送PC,A或B的23~16送XPC PC+2和XPC的值入栈,指令后立即数的15~0 远程子程序调用 位送PC,23~16位送XPC 累加器远程子程 PC+1和XPC的值入栈,A或B的15~0位送PC, 序调用 23~16位送XPC
复位 顺序操作 远程分支转移 累加器远程跳转 远程返回 栈顶值弹出并送XPC,下一个值弹出送PC,然后返 回调用代码段

BC[D] BANZ[D]
ESIEE, Slide 58

指令中的条件满足,用指令中所给 出的地址加载PC 若当前辅助寄存器不等于0,用指令 中给出的地址加载PC

5/3 4/2

3/3 2/2

ESIEE, Slide 55

3.2

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

3.2

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

三、分支转移
C54x的分支转移操作有两种:无条件分支转移和有 条件分支转移;而且都可以进行延迟操作(指令助 记符后带后缀D)和不带延迟操作。 1. 无条件分支转移 当执行无条件分支转移时,PC加载指定分支程 序的地址。但分支转移指令到流水线的执行阶段时, 其后面两个指令已被取指,装入流水线,如何处理 这两个指令字,是取决于分支转移指令是否带延迟。 带延迟分支转移,则紧跟在分支转移指令后面 的双字指令或两个单字指令被执行,且不更改流水 线。然后进行分支转移。 无延迟分支转移,先将读入的双字指令或两个 单字指令从流水线中清除,然后再进行分支转移。
ESIEE, Slide 56

四、调用和返回
与分支转移类似,当调用子程序和函数时,DSP会中断原先 的程序,转移到调用子程序的地址上继续执行,调用时,下 一条指令的地址压入堆栈,执行完子程序返回时,这个地址 将从堆栈弹出到PC,继续执行 C54x调用和返回有两种形式:无条件调用与返回和有条 件调用与返回。这两个也都有延迟操作和不带延迟操作。具 体见下表 无条件调用和返回指令 指令 CALL[D] CALA[D] RET[D] RETE[D] RETF[D]
ESIEE, Slide 59





周期数 (不延迟/延迟)

将返回地址压入堆栈,用指令所规定的地址加载PC
将返回地址压入堆栈,用指定累加器的低16位加载PC

用栈顶的返回地址加载PC 用栈顶的返回地址加载PC,并开放中断
用RTN寄存器中的返回地址加载PC,并开放中断

4/2 6/4 5/3 5/3 3/1

3.2

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

3.2

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

三、分支转移
1. 无条件分支转移(续)
值得注意的是:紧跟在延迟指令后的两个指令字不可以造成 PC不连续(即不能用分支转移、调用、返回和软件中断指令): 例如:1F45 B 2000H ;PC指向1F45后,即跳转到2000H 又如:1F45 BD 2000H 1F47 ANDM #4400H,*AR1+ ; PC指向1F45后,先执行ANDM,然后跳转到2000H,ANDM 是2字指令,与长立即数进行与操作, 下表是无条件分支转移指令 无条件分支转移指令 指 B[D] BACC[D]
ESIEE, Slide 57

四、调用和返回(续)
1. 无条件调用
执行到该指令时就调用子程序。这样将指令的第二个字或累 加器(A或B)的低16位作为地址装入PC。在PC装入新值之 前,返回地址已经压入堆栈。在调用完毕,执行返回指令时, 将压入堆栈的地址弹出装入PC,程序从调用指令的下一条指 令执行。 同样,在流水线操作中执行无条件调用时,后两个指令字已 装入流水线,这两个指令字如何执行取决于调用是延时还是 非延时的。 (a)非延时:先将读入的双字指令或两个单字指令从流水 线中清除,然后从调用子程序的起始地址开始执行。 (b)延时 :直接执行跟在调用后的一个双字指令或两个 单字指令,然后调用,这样可以节省额外的时钟周期。 故带延迟的调用要比不带延迟的指令时钟周期少,要注意的 是:在一条延迟指令后的两个字指令的执行不可以改变程序 执行的顺序(如跳转,中断,调用和软件中断)。
ESIEE, Slide 60







周期数 (不延迟/延迟) 4/2 6/4

用指令中所给出的地址加载PC 用所指定的累加器的低16位作 为地址加载PC

3.2

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

3.2

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

四、调用和返回(续)
2. 条件调用
必须满足用户设定的条件是采可以调用子程序和函数。这些 条件如后表所示。

四、调用和返回(续)
2. 条件调用(续) (c)条件存储指令 是有条件地将CPU某些寄存器的内容存放到数据存 储单元,这些条件是表的前面的12项.具体指令如下
条件存储指令 说 明

(a)使用多条件
可以使用多个条件作为条件指令的操作数。使用多条件时应 注意:第一只有当所有条件都满足时指令才能执行;第二是 多个条件必须满足特定的条件组合。如表所示,必须从表中 的第一组或第二组中选择。 第一组,可以从A类和B类中各选一个条件组合。但不能从同 一类中选两个条件。 第二组,可以从A,B,C类中各选一个条件组合。但也不能 从同一类中选两个条件 另外,两种条件测试的累加器必须是同一个,例如:可以同 时测试AGT,AOV,即测试累加器A;不能用同一条指令去 测试两个累加器,如不能同时用AGT和BOV作为条件。
ESIEE, Slide 61

SACCD 如果条件满足,(src)<<(ASM-16) Xmem, 否则 (Xmem) Xmem src,Xmem,cond STRCD Xmem,cond SRCCD Xmem,cond
如果条件满足,(T) Xmem, 否则(Xmem) Xmem 如果条件满足,(BRC) Xmem, 否则(Xmem) Xmem

从表见:对于条件存储器操作指令,无论条件如何都会修 改地址和读操作数,如果条件满足则将相应寄存器的内容存储 到数据存储器中;否则操作数写入所读出的位置,而数据存储 器的那些位置保持不变。
ESIEE, Slide 64

表4-4 操作数符号 AEQ BEQ ANEQ BNEQ ALT BLT ALEQ BLEQ AGT BGT AGEQ BGEQ AOV BOV ANOV BNOV C NC
ESIEE, Slide 62

条 件 A=0 B=0 A≠0 B≠0 A<0 B<0 A≤0 B≤0 A>0 B>0 A≥0 B ≥0 AOV=1 BOV=1 AOV=0 BOV=0 C=1 C=0

条件指令中的各种条件 说 明 累加器A等于0 累加器B等于0 累加器A不等于0 累加器B不等于0 累加器A小于0 累加器B小于0 累加器A小于等于0 累加器B小于等于0 累加器A大于0 累加器B大于0 累加器A大于等于0 累加器B大于等于0 累加器A溢出 累加器B溢出 累加器A不溢出 累加器B不溢出 ALU进位置1 ALU进位置0

3.2

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

四、调用和返回(续)
2. 条件调用(续) (d)无条件返回 执行无条件返回时,子程序将立即返回主程序,PC 装入从堆栈弹出的地址,程序从该地址执行。 同样,在流水线中执行无条件返回指令时,下两个 指令已经装入流水线,指令如何执行取决于该调用 是延迟还是非延迟。其中用RETE和RETF指令释放 中断可以确保返回后能响应另一个中断。 (e) 条件返回 条件返回是只有在满足条件后才可以返回。见表RC 指令

ESIEE, Slide 65

3.2

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

四、调用和返回(续)
A类 EQ NEQ LT LEQ GT B类 OV NOV A类 B类 TC C NTC NC C类 BIO NBIO

3.3

流水线pipeline
一、流水线操作 二、双寻址存储器和流水线(冲突)

2. 条件调用(续) (b)条件执行(XC)指令
如果执行代码有条件的执行1个字或2个字,而不满足条件可 以跳过1个字或2个字; XC n, cond n=1,2 。 n=1,当条件满足,执行紧跟此条指令后的一个字指令。 n=2,当条件满足,执行紧跟此条指令后的一个双字指令或2 条单字指令。 如果条件不满足,执行1条或2条NOP指令
ESIEE, Slide 63 ESIEE, Slide 66

一、流水线操作

3.3

流水线

一、流水线操作(续)
预取 取指 译码 访问

3.3

流水线

C54x DSP有一个6段的指令流水线。流水线的6个段 彼此独立,允许指令重叠执行在任意给定的周期内 ,可以有1-6条指令被激活,每一条指令处于不同 的执行阶段。下图是流水线中的各个段:
将PC的内容 送PAB总线 将PB总线的内容装 入IR 对IR中的内容译码 将读取的数据1送DB总线 将读取的数据2送CB总线 如果需要,将数据3的写回 地址送EAB总线

下图是各种存储器访问是在流水线上是如何完成的
读取 执行/写回 装载EAB 写入EB (d)单操作数写回指令(如:STH A, *AR1 ; 一个周期) 预取 取指 预取 译码 取指 访问 译码 读取 执行/写回 装载EAB 写入EB 访问 读取 执行/写回 装载EAB 写入EB

预取

取指
将取出的指令 字送PB总线

译码

访问

读取

执行/写回

(e)双操作数写回指令(如:DST A, *AR1 ; 两个周期) 访问 读取 执行/写回 装载DAB 从DB读 装载EAB 写入EB (f)操作数读和写指令(如:STA *AR2//LD *AR3, B ; 一个周期) 预取 取指 译码

如果需要,将数据1的地址 执行指令并将写 回数据送EB总线 送DAB总线 如果需要,将数据2的地址 送CAB总线 修改辅助寄存器和堆栈指针

ESIEE, Slide 67

ESIEE, Slide 70

一、流水线操作(续)

3.3

流水线

二、双寻址存储器和流水线(冲突)

3.3

流水线

流水线的6个段以及它们的功能是: 程序预取:PAB装载下一条要取的指令地址。 程序读取:从PB读取一个指令字,送入IR。 译码:IR中的内容被译码,确定存储器存取操作的类 型和数据地址产生单元DAGEN及CPU中的控制序列。 访问:DAGEN将被读取的操作数的地址输出到数据 地址总线DAB上。如果需要第二个操作数,那么另 一条数据地址总线CAB也被装载一个合适的地址。 读取:如果有需要读取的操作数,那么操作数通过 数据总线DB和DB读取。同时,两步的操作数写入 开始。如果有写M,那么其地址被送入EAB。 执行:指令在这一段执行。通过EB将数据写回。
ESIEE, Slide 68

C54x DSP片内存储器(即DARAM)的特点之一是 在单周期内两次寻址。 DARAM被分成几个独立的块,可以对不同存储器 块的同时存取,不会发生冲突。 每一块存储器在单周期中支持两次存取,即处于流 水线不同段的两条指令可以同时访问相同的存储器 块。 一般来讲,当一块存储器同时执行两个存取时会发 生冲突, C54x DSP可以自动解决这些冲突。 下表列出一些C54x器件的块的大小和块的数量。

ESIEE, Slide 71

一、流水线操作(续)

3.3

流水线

二、双寻址存储器和流水线(冲突)(续)
每一块DARAM支持单 周期的两次存取,一 次存取是在前半个周 期,另一次存取是在 后半个周期。
表 DARAM块的访问 执行的时间 前半个周期 前半个周期 后半个周期 后半个周期

3.3

流水线

C54x DSP流水线对存储器的每一次访问都分两步:
1. 将存储器地址送到一条地址总线; 2. 相应的数据总线从存储器地址读取数据或向存储器地址写 入数据。

下表列出一些C54x器件的块的大小和块的数量。
表 DARAM块 器 件 块的大小 块的数量 2 C5402 8K字 C5410 4 2K字 C5420 8K字 2 C5416 8K字 8

下图是各种存储器访问是在流水线上是如何完成的
预取 取指 译码 访问 读取 执行/写回 装载PAB 从PB读取 (a)读取指令字(一个周期) 预取 取指 译码 访问 读取 执行/写回 装载DAB 从DB读取 (b)单操作数读取指令(如:LD *AR1, A ; 一个周期) 预取 取指 译码 访问 读取 执行/写回 装载DAB 从DB和 和CAB CB读取 (c)双操作数读取指令(如:MAC *AR2+, *AR3+, A ; 一个周期)
ESIEE, Slide 69

访问类型 通过PAB/PB进行的指令读取 通过DAB/DB进行的第一个操作数读取 通过CAB/CB进行的第二个操作数读取 通过EAB/EB进行的操作数写回
ESIEE, Slide 72

二、双寻址存储器和流水线(冲突)(续)
预取 取指 读PB (a)指令字读取 预取 取指 译码 访问 读取 执行/写回

3.3

流水线

二、双寻址存储器和流水线(冲突)(续)
2. 写操作数和读双操作数之间的冲突

3.3

流水线

下图为不同类型的操作,省略了地址总线的装载。

译码

访问

读取
读DB

执行/写回

若一条单操作数写指令后跟着一条不执行写的指令,且后面 这条指令是一条双操作数读指令,就会发生冲突。 在操作数写EB和第二个数据读CB之间有冲突。 解决的办法:自动将写操作延迟一个周期。 图中,AR3和AR5指向同一块DARAM。
STL A, *AR3+ LD #0, A ADD *AR4+, AR5+, A
STL A, *AR3+ ; (写操 作延迟到下一个周期) LD #0, A ; (前一条指令的写 操作出现在这里) ADD *AR4+, AR5+, A

(b)单操作数读取指令 预取 取指 译码 (c)双操作数读取指令 预取 取指 译码 (d)单操作数写回指令

AR3和AR5指向相同的DARAM 预取 取指 预取 译码 取指 读PB 预取 访问 译码 取指 读取 访问 译码 执行
写DB

访问

读取

执行/写回

读CB 读DB

访问

读取

执行/写回
写EB

读取

执行 写EB 执行

访问 读取 读CB 读DB

ESIEE, Slide 73

ESIEE, Slide 76

二、双寻址存储器和流水线(冲突)(续)
预取 取指 预取 译码 取指 访问 译码 读取 访问 执行/写回
写EB

3.3

流水线

二、双寻址存储器和流水线(冲突)(续)
2. 写操作数和读双操作数之间的冲突

3.3

流水线

下图为不同类型的操作,省略了地址总线的装载。

读取

执行/写回
写EB

若一条单操作数写指令后跟着一条不执行写的指令,且后面 这条指令是一条双操作数读指令,就会发生冲突。 图中,AR3和AR5指向同一块DARAM。
LD *AR2+, A ; i2 AR2指向程序 i3 代码驻留的 i4 DARAM 执行 读取 访问 译码 执行
写DB

(e)双操作数写回指令 预取 取指 译码 访问 读取
读DB

预取 执行/写回
写EB

取指 预取

译码 取指 读PB 预取

访问 译码 取指 读PB 预取

读取 访问 译码 取指 读PB 预取

执行 写DB 读取 访问 译码 取指

LD *AR2+, A ; i2 i3

(f)操作数读和写指令

由于存在两种类型的存取,且在每半个周期内只能 执行一个存取,所以会发生存取冲突。 解决的方法:重新安排存取的顺序,也可以将其中 一个存取延迟一个周期。
ESIEE, Slide 74

哑周期(假设取指令 操作出现在这里) i4
ESIEE, Slide 77

读取

执行 写EB 执行

访问 读取 读CB 读DB

二、双寻址存储器和流水线(冲突)(续)
1. 取指令和读操作数之间的冲突

3.3

流水线

3.4
? ?

指令的表示方法
一、汇编源程序格式 二、指令集符号与意义

当一块DARAM既映射到程序空间又映射到数据时,若对该 存储器同时进行一个取指令操作和一个读数据操作数操作时 ,则这两个操作会发生冲突。 C54x DSP自动将取指令操作延迟一个周期以解决冲突。
预取 LD *AR2+, A ; i2 i3 哑周期(假设取指令 操作出现在这里) i4
ESIEE, Slide 75

取指 预取

译码 取指 读PB 预取

访问 译码 取指 读PB 预取

读取 执行 读DB 访问 译码 取指 读PB 预取 读取 访问 译码 取指 读PB

LD *AR2+, A ; i2 AR2指向程序 i3 代码驻留的 i4 DARAM 执行 读取 访问 译码 执行 读取 访问 执行 读取 执行
ESIEE, Slide 78

3.4

指令的表示方法

一、汇编源程序格式
基本格式是: [标号][:] 指令 [操作数列表] 标号][:] 操作数列表]
其中[ ]是可选项: 其中[ ]是可选项: begin: LD #40H,AR1 #40H, 格式与我们已经 学过的微机和单 [;注释] 片机汇编语言撰 [;注释] 写相近。

3.5

C54x指令系统

1. 标号域 2. 指令域

将立即数传送给寄存器AR1 将立即数传送给寄存器AR1 ,与单片机指令比较如何?

标号一般是供本程序的其他程序调用,第1个必须 是字母 包括(1)指令 LD,STM,ADD等 (2)汇编宏指令 .data 等 (3)宏指令和宏调用
ESIEE, Slide 79

指令分为四个主要类型 : 一、算术运算指令 二、逻辑运算指令 三、程序控制指令 四、存储和装载指令 C54x 是固定长度指令字 指令必须包括在一个16位字内, 为了在 指令必须包括在一个16位字内, 一个周期内执行

ESIEE, Slide 82

3.4

指令的表示方法

3. 操作数域
操作数可以是常量、符号和它们的混合表达式,同 时也可以在它们面前加前缀表达不同的含义 (1)前缀#,表示立即数。 ADD #123,A;立即数给A (1)前缀#,表示立即数。 123, A;立即数给A (2)前缀*,表示间接寻址。 (2)前缀* LD *AR4, A; AR4地址中内容给累加器A AR4地址中内容给累加器A (3)前缀@,表示直接寻址或绝对寻址。 (3)前缀@ ADD #10,@y ;立即数给y地址指向的存储器 10, ;立即数给y

指令和操作数
汇编指令 ADD Smem, src
0 0 0 0 0 0 0 S I

3.5

C54x指令系统

操作码是:

A A A A A A A

4. 注释
;是开始

S:源累加器,S=0是A, S=1,是B I:地址寻址模式,I=0,直接寻址,I=1是间接寻址 A….A:数据存储器地址位(7位) 例如:ADD Xmem, Ymem, dst 在这条指令中ADD 必须要写,而斜体符号Xmem, Ymem, dst表示要输入 相应的值。 如:MAC[R] Xmem,Ymem, src[, dst]在这条指令中,[] 中的内容是可选择的,如:MAC *AR3+, *AR4+, A 是将AR3地址中的内容乘AR4地址中的内容再加A中 的内容 (A) 有关指令中符号查阅P51表3-1
ESIEE, Slide 83

ESIEE, Slide 80

二、指令集符号与意义
详细见P51表3-1,下表是其中的几个:

3.4

指令的表示方法

3.5

C54x指令系统

一、算术运算指令 分为6小类:
1. 加法指令(ADD) 2. 减法指令(SUB) 3. 乘法指令(MPY) 4. 乘加指令(MAC)和乘减指令(MAS) 5. 双数/双精度指令(DADD、DSUB) 6. 特殊操作指令(FIRS、ABDST、SQDST)

符号 Cond dmad Dmem pmad Pmem Smem A,B MMR

意义
条件操作时的条件操作数,0,1 16位立即数表示的数据存储器地址,0~65535 数据存储器操作数 16位立即数表示的程序存储器地址 程序存储器操作数 16位单数据存储器操作数 A,B累加器 存储器映射寄存器

如果对指令中出现不清楚的字符可以查阅表3-1
ESIEE, Slide 81 ESIEE, Slide 84

1. 加法指令(ADD)(13条)

3.5

C54x指令系统

2. 减法指令(SUB)(13条)

3.5

C54x指令系统

ESIEE, Slide 85

ESIEE, Slide 88

1. 加法指令(ADD)(13条) 其中:

3.5

C54x指令系统

2. 减法指令(SUB)(13条) 其中:

3.5

C54x指令系统

ADD--不带进位加法 ADDC--带进位的加法(如32位扩展精度加法) ADDS--无符号数的加法 ADDM--专用于立即数的加法 前10条指令说明,将一个16位数加到选定的累加器, 这16位数可以是: (1)单寻址Smem (2)双寻址Xmem、Ymem (3)立即数#lk (4)累加器src移位后的值。

SUBS--无符号数的减法运算 SUBB--带借位的减法(如32位扩展精度减法) SUBC--条件减法符号数的减法。src减云Smem左 移15位后的值,若结果大于0,则结果左移1位再加1 ,最终结果存放到src中;否则src左移1位并存入src 中。

ESIEE, Slide 86

ESIEE, Slide 89

1. 加法指令(ADD)(13条)

3.5

C54x指令系统

例1: ADD *AR3+, 14, A ; A←A+(AR3)<<14

2. 减法指令(续) 例1: A ← A-(AR1)<<14

3.5

C54x指令系统

0001 0101 0000 0000 0001 0101 0000 0000 0000 0000 0000 00 5
ESIEE, Slide 87

000001200h 005400000h F FAC 0 1 2 0 0 h
ESIEE, Slide 90

4

0

0

0

0

0

3. 乘法指令(10条)

3.5

C54x指令系统

4. 乘加和乘减指令(15条)

3.5

C54x指令系统

ESIEE, Slide 91

ESIEE, Slide 94

3. 乘法指令(10条)(续)

3.5

C54x指令系统

乘法运算的结果都是32位,在A或B中 乘数的来源: (1)T寄存器 (2)立即数 (3)存储单元 (4)A或B的高16位

4. 乘加 和乘减 指令 (15条)

3.5

C54x指令系统

ESIEE, Slide 92

ESIEE, Slide 95

3. 乘法指令(10条)

3.5

C54x指令系统

4. 乘加和乘减指令(续)

3.5

C54x指令系统

例:MPY 13, A; A ← T*Smem,Smem所在的单 数据存储器地址为13(即0Dh)

说明: [R]为可选项,表中指令如果使用了R后缀,则对 乘累加值凑整。 指令受FRCT和SXM状态标志位的影响,执行结 果影响OVdst

DP : 7位地址 0000 0100 0 : 000 1101 = 040Dh
ESIEE, Slide 93 ESIEE, Slide 96

4. 乘加和乘减指令(续)

3.5

C54x指令系统

5. 长操作数指令(续)
例1:设C16=0,双精度算术运算方式

3.5

C54x指令系统

例:MAC *AR5+, A ; A←A+T*(AR5)

A ← A + T * (AR5) 00 0048 E000h ← 00 0000 1000h + 0400h * 1234h

高16位 低16位 注意:由于指令为长操作数指令,因此AR3执行后加2

ESIEE, Slide 97

ESIEE, Slide 100

5. 长操作 数指令 (6条)

3.5

C54x指令系统

5. 长操作数指令(续)

3.5

C54x指令系统

例2:设C16=1, 双16位算术运算方式

高16位 低16位 注意:由于指令为长操作数指令,因此AR3执行后减2

ESIEE, Slide 98

ESIEE, Slide 101

5. 长操作数指令(续)

3.5

C54x指令系统

Lmem为32位长操作数,32位操作数由两个连续 地址的16位字构成,低地址必须为偶数,内容为 32位操作数的高16位,高地址的内容则是32位操 作数的低16位。 ST1中的C16位决定了指令的方式: 例: DADD Lmem, src [, dst] 若C16=0,ALU工作在双精度算术运算方式, 则dst=Lmem+src 若C16=1,ALU工作在双16位算术运算方式 则dst(39~16)=Lmem(31~16)+src(31~16) dst(15~0) =Lmem( 15~0 )+src( 15~0 )

5. 长操作数指令(续) 例3:设C16=0,双精度算术运算方式

3.5

C54x指令系统

低16位 高16位 注意:由于指令为长操作数指令,因此AR3执行后减2

ESIEE, Slide 99

ESIEE, Slide 102

6. 特殊 应用 指令 (15条)

3.5

C54x指令系统



例 1-2

3.5

C54x指令系统

例1: z=x+y-w,注意要满足在一个数据页 z=x+yLD @x, A ADD @y, A SUB @w, A ;(A)=(A)-@w ;(A )=(A )-@w STL A, @z 例2:y=mx+b y=mx+b LD @m,T @m, MPY @x,A ;实现(T)×(x) (A) @x, ;实现(T ADD @b,A @b, ;A(0~15) @y STL A,@y

ESIEE, Slide 103

ESIEE, Slide 106

6. 特殊应用指令(续)

3.5

C54x指令系统


例3:y=x1×a1+x2×a2 y=x1× a1+x2× LD LD @x1,T @x1, MPY @a1,B @a1, @x2,T @x2, MAC @a2,B @a2, STL B,@y STH B,@y+1

例 3

3.5

C54x指令系统

FIRS指令实现一个对称的FIR滤波器。 步骤: (1)Xmem和Ymem相加后的结果左移16位放入A中 (2)A的高端(32-16位)和由pmad寻址得到的 Pmem相乘,乘法结果与B相加并存放在B中。 在下一个循环中,pmad加1。 一旦循环流水线启动,指令成为单周期指令。 指令受OVM,FRCT和SXM状态标志位的影响,执 行结果影响C、OVC和OVB。

;实现x1×a1 (B) 实现x1× ;实现x2×a2+(B) (B) ;实现x2× ;低16位 (y) ;低16位 ;高16位 (y+1) ;高16位

ESIEE, Slide 104

ESIEE, Slide 107

6. 特殊应用指令(续)
例:FIRS *AR3+, *AR4+, COEFFS

3.5

C54x指令系统

3.5

C54x指令系统

例4:从y的乘积项中找到最大值,并存放到A中。 :从y 的乘积项中找到最大值,并存放到A 4 STM #a, AR1 y = ai xi STM #x, AR2 i =1 STM #2, AR3 ;初始化指针变量 LD *AR1+, T MPY *AR2+, A ;第一个乘积给(A) 第一个乘积给(A Loop: LD *AR1+, T MPY *AR2+, B ;其他乘积给(B) ;其他乘积给(B MAX A ;比较(A)>(B),是, 0 c;否,(B) (A), C=1 比较(A)>(B),是, ;否,(B) BANZ loop, *AR3- ; 循环3次,从中得到大数存放到A *AR3- 循环3次,从中得到大数存放到A 注意:以上乘积的结果存放在A(31-0)32位中。 注意:以上乘积的结果存放在A 31- 32位中。



ESIEE, Slide 105

ESIEE, Slide 108

二、逻辑指令
有5小类: 与指令(AND) 或指令(OR) 异或指令(XOR) 移位指令(ROL) 测试指令(BITF)

3.5

C54x指令系统

2、移位指令和测试指令(11条)

3.5

C54x指令系统

ESIEE, Slide 109

ESIEE, Slide 112

1、与、或、异或指令(15条)

3.5

C54x指令系统

2、移位指令和测试指令(11条)
例1

3.5

C54x指令系统

例2

ESIEE, Slide 110

ESIEE, Slide 113

1、与、或、异或指令(续)
例1:

3.5

C54x指令系统

三、程序控制指令
分支指令(B,BD) 调用指令(CALL) 返回指令(RET) 中断指令(INTR,TRAP) 重复指令(RPT)

3.5

C54x指令系统

例2:

堆栈操作指令(FRAME,POP) 其他程序控制指令(IDLE、NOP)

ESIEE, Slide 111

ESIEE, Slide 114

1. 分支指令(6条)

3.5

C54x指令系统

2. 重复指令(5条)

3.5

C54x指令系统

注意:当分支转移指令到达流水线的执行阶段,其 后面两个指令字已经被“取指”了。如何处理? 注意:当分支转移指令到达流水线的执行阶段,其 后面两个指令字已经被“取指”了。如何处理?
ESIEE, Slide 115 ESIEE, Slide 118

1. 分支指令(6条)
例1

3.5

C54x指令系统

2. 重复指令(5条)
例1

3.5

C54x指令系统

例2 例2

ESIEE, Slide 116

ESIEE, Slide 119

实现累加运算:

.bss x, 5 i =1 .bss y, 1 STM #x,AR1 ; //初始化指针 //初始化指针 STM #4,AR2 LD #0,A ; //LD加载操作数到A, 或者可以是RAM数据 A //LD加载操作数到A, 或者可以是RAM数据 Loop: ADD *AR1+, A *AR1+, BANZ loop,*AR2- loop, AR2- STL A,@y 以上程序AR2是循环计数器,初始设置为4,共执行5次, 以上程序AR2是循环计数器,初始设置为4 ,共执行5 执行时是先判别,后减1。 执行时是先判别,后减1 其中,ST,STM,STL,STH是将立即数和累加器的数送 其中,ST,STM, STL, STH是将立即数和累加器的数送 到存储空间和辅助寄存器。LD是加载立即数到累加器。 到存储空间和辅助寄存器。LD是加载立即数到累加器。

y = ∑ xi

5

例1:对一个数组进行初始化,x[5]={0,0,0,0,0} :对一个数组进行初始化,x[5]={0,0,0,0,0} .bss x, 5 STM #x,AR1 #x, LD #0,A #0, RPT #4 STL A,*AR1+ 或者: .bss x,5 STM #x,AR1 RPTZ A,#4 ;将A清零,重复操作以下指令 A,#4 ;将 STL A,*AR1+
应当指出的是:在执行单条重复操作期间,CPU是不响 应当指出的是:在执行单条重复操作期间,CPU是不响 应所有中断(除/RS之外)。也可以响应/HOLD中断,但状态 应所有中断(除/RS之外)。也可以响应/HOLD中断,但状态 寄存器中的HM=1,才可以暂停重复操作。 寄存器中的HM=
ESIEE, Slide 120

ESIEE, Slide 117

例2:对数组x[5]中的每一个元素加1。 :对数组x[5]中的每一个元素加1 .bss x,5 degin:LD #1, 16, B ; 1左移16位 (B),BH=0001H, degin: 1左移16位 STM #4,BRC ;4 BRC,循环4+1 BRC,循环4 STM #x,AR4 RPTB next-1 ;next-1是循环结束地址 next- next- ADD *AR4,16,B,A ; AR4地址中的内容左 AR4地址中的内容左 *AR4, 16, ; 移16位 +(B) (A) 16位 STH A,*AR4+ ;把(AH)中的内容 AR4的地址中 AR4+ (AH)中的内容 AR4的地址中 next: LD #0,B ;且地址+1 next: ;且地址+1 以上例子中,用next-1作为结束地址是正确的。 以上例子中,用next- 如果用循环回路的最后一条指令(STH)的标号作为 如果用循环回路的最后一条指令(STH)的标号作为 结束地址,那就不对了;因为最后一条指令是单字指 令还可以,如是双字指令就要出现错误。
ESIEE, Slide 121

四、存储和装载指令(续)
2. 累加器的数据存储
Inst field1 field2 field3 words STL/STH src, Smem 1 STL/STH src, ASM, Smem 1 STL/STH src, SHIFT1, Xmem 1 STL/STH src, [SHIFT,] Smem 2

1 2 3 4.

STL 存储 src(15-0) 和 STH存储 src(32-16) src(15STH存储 src(32-

ESIEE, Slide 124

四、存储和装载指令

3.5

C54x指令系统

四、存储和装载指令(续)
3. 其他寄存器加载和存储
1 2 3 4 5 6 Inst LD LD LD LD LD LD field1 Smem, Smem, #k9 #k5 Smem, #k3 field2 T DP DP ASM ASM ARP words 1 1 1 1 1 1

存储指令(ST) 装载指令(LD) 条件存储指令(CMPS) 并行装载和存储指令(LD||ST) 并行读取和乘法指令(LD||MAC) 并行存储和乘法指令(ST||MAC) 并行存储和加减指令(ST||ADD,ST||SUB) 其他存储和装载指令(MVDD,PORTW,READA)

容许初始化T, DP or ASM 来自于存储器和立即 容许初始化T 数的值 #k3, #k5 和 #k9 各自代表 3, 5 和 9 比特的立即 k3, #k5 数值. 数值.
ESIEE, Slide 122 ESIEE, Slide 125

四、存储和装载指令(续)
1. 累加器的数据加载
1 2 3 4. 5 6 7 8 9 10 Inst LD LD LD LD LD LD LD LD LD LD field1 field2 Smem, Smem, TS, Smem, 16 Smem, [SHIFT,] Xmem, SHIFT1, #K #lk, [SHIFT1,] #lk, 16, src, [SHIFT] src, ASM field3 dst dst dst dst dst dst dst dst [,dst] [,dst] words 1 1 1 2 1 1 2 2 1 1

四、存储和装载指令(续)
4. 存储器到存储器的直接传输 目的空间
IO IO prog MVDP WRITA prog data data (MMR) PORTR MVPD READA MVDD MVDK MVKD MVMD MVDM MVMM

源空间 源空间

data data(MMR)

PORTW

传输指令
ESIEE, Slide 123 ESIEE, Slide 126

四、存储和装载指令(续)
(1)数据空间 ? IO 空间
Inst 1 PORTR 2 PORTW field1 PA, Smem, field2 Smem PA
field2 Smem Smem pmad

words 2 2
words 2 1 2 1

(2)数据空间 ? 程序空间
1 2 3 4 Inst field1 MVPD pmad, READA MVDP Smem, WRITA Smem

注意:1. 源程序存储器的地址由A(15~0)指定 2. 目的程序存储器的地址由A(15~0)指定
ESIEE, Slide 127

四、存储和装载指令(续)
(3)数据空间 ?数据空间
Inst field1 1 MVDD Xmem, 2 MVKD pmad, 3 MVDK Smem, field2 Ymem Smem pmad
field2 MMR dmad

words 1 2 2
words 2 2

(4)数据空间 ? MMR
Inst field1 1 MVDM dmad 2 MVMD MMR,

(5)MMR ? MMR1
Inst field1 field2 1 MVMM MMR1 MMR2
1MMR1,
ESIEE, Slide 128

words 1

MMR2: AR0-AR7, SP only AR0- AR7,


推荐相关:

7. 在’C54x DSP 寻址和指令系统中, Xmem 和 Ymem 表示 16 位双寻址操作数 , Dmad 为 16 位立即数, 表示 数据存储器地址 ,Pmad 为 16 位立即数,...


附录三: 的寻址方式及代数汇编语言 语言指令 附录三:C54x DSP 的寻址方式及代数汇编语言指令 C54x DSP 的寻址方式 TMS320C54x 系列 DSP 的存储空间包括程序存储...


7. 在’C54x DSP 寻址和指令系统中,Xmem 和 Ymem 表示 16 位双寻址操作 数,Dmad 为 16 位立即数,表示 数据存储器地址 ,Pmad 为 16 位立 即数,表示 ...


7. 在’C54x DSP 寻址和指令系统中,Xmem 和 Ymem 表示 16 班级: 姓名 位双寻址操作数 ,Dmad 为 16 位立即数,表示 数据存储 中国矿业大学考试专用纸第 ...


的的范德萨的地方爱的规格好文章第 3 章 C54x DSP 系统硬件结构 DSP 芯片是一种特殊结构的微处理器,为了快速地实现数字信号处理运算,采用了流水线 指令执行结构...


7. 在 C54x DSP 寻址和指令系统中,Xmem 和 Ymem 表示 16 位双寻址操作数, Dmad 为 16 位立即数,表示数据存储器位双寻址操作数, Pmad 为 16 位立 即...


湘潭大学TMS 320C54xxDSP实用技术复习资料三、TMS320C54X指令系统 TMS320C...双数/双精度指令?特殊操作指令 定点 DSP 中数据表示方法 当它表示一个整数时,...


16、DSP 的寻址方式有七种,分别是立即寻址、绝对寻址、累加器寻址、直接寻址、间接寻 址、存储器映像寄存器寻址、堆栈寻址。 17、在 C54x DSP 寻址指令系统中,X...


DSPC54x系列 指令详解 实验 附注释DSPC54x系列 指令详解 实验 附注释隐藏>> 实验...中只要把在开头加上中断子程序标号的引用,并在中断表的 TINT 部分换成跳转指令...


查询法、回调法 10、片选法、译码选通法 1.DSP 与单片机、嵌入式微处理器的...7. 在’C54x DSP 寻址和指令系统中,Xmem 和 Ymem 表示 数,Dmad 为 16 ...

网站首页 | 网站地图
3986 3986.net
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@qq.com