第三章 DSP软件体系
C54x寻址方式
‘ C54x特殊寻址方式说明
‘ C54x指令集
‘ C54x特殊指令使用说明立即数寻址,指令中嵌有一个固定的数绝对地址寻址,指令中有一个固定的地址累加器寻址,按累加器内的地址去访问程序存储器中的一个单元直接寻址,指令中的 7bits是一个数据页内的偏移地址,
而所在的数据页由数据页指针 DP或 SP决定 。
该偏移加上 DP和 SP的值决定了在数据存储器中的实际地址 。
间接寻址,按照辅助寄存器中的地址访问存储器 。
存储器映射寄存器寻址,修改存储器映射寄存器中的值,
而不影响当前 DP或 SP的值 。
堆栈寻址,把数据压入和弹出系统堆栈 。
§ 3-1 TMS320C54x的寻址方式在立即数寻址中,指令里包括了立即操作数。在一条指令中可对两种立即数编码。一种是短立即数( 3、
5,8或 9bits),另一种是 16bits的长立即数。立即数可包含在单字或双字指令中。 3-,5-,8-或 9-bit值在单字指令中,16-bit值在双字指令中。
1,立即数寻址立即数寻址的其他例子:
LD #0,ARP ; ARP=2( #k3)
LD #3,ASM ; ASM=3( #k5)
LD #50,DP ; DP=50( #k9)
LD #1234,A ; A=1234( #k)
STM #FFFFh,IMR; IMR=FFFFh( #lk)
短立即数 RPT
长立即数 RPT
在直接寻址中,指令代码包含了数据存储器地址的低七位。这 7-bit dma
作为偏移地址与数据页指针( DP)或堆栈指针( SP)相结合共同形成 16-
bit的数据存储器实际地址。如右图所示 。
2,直接寻址
CPL=0,dma与 9-bit的 DP相结合形成数据存储器地址。
以 DP为基准的直接寻址
DP
9-bit
9-bit的 DP指向数据存储空间的 512个数据页中的一页
0
1
2
510
511
编程举例:
编程举例:
33221100
3
0
0 xaxaxaxaxay
i
ii
直接寻址编程,
.mmregs
.bss x,4,1
a0,word 012h
a1,word 3211h
a2,word fe11h
a3,word ff03h
.sect,program”
LD #0,A
LD #X,DP
LD #a0,T
MAC x,A
LD #a1,T
MAC X+1,A
LD #a2,T
MAC X+2,A
…..
以 SP为基准的直接寻址
CPL=1,dma加上 SP基地址形成数据存储器地址。 (st1中)
使用以 SP为基址的直接寻址:
AND sample,A
LD sample,A
ADD sample,B ; ……..
3,间接寻址在间接寻址中,64K数据空间任意单元都可通过一个辅助寄存器中的 16-bit地址进行访问。‘ C54x有 8个 16-bit辅助寄存器( AR0-AR7)。两个辅助寄存器算术单元( ARAU0和
ARAU1),根据辅助寄存器的内容进行操作,完成无符号的
16-bit算术运算。间接寻址很灵活,不仅能从存储器中读或写一个单 16-bit数据操作数,而且能在一条指令中访问两个数据存储器单元(即从两个独立的存储器单元读数据,或读一个存储器单元同时写另一个存储器单元,或读写两个连续的存储器单元)。
单操作数寻址单操作数间接寻址方框图单操作数间接寻址类型:
*Arx,ARx包含了数据存储器地址
*ARx-/ *ARx+,访问后,ARx中的地址减 1/加 1
*+ARx,在寻址之前,ARx中的地址加 1
*ARx-0B/ *ARx+0B,访问后,从 ARx中以位倒序进位的方式减去 /加上 AR0
*ARx-0/ *ARx+0,访问后,从 ARx中减去 /加上 AR0
*ARx-%/ *ARx+%,访问后,ARx中的地址以循环寻址的方式减 1/加 1
*ARx-0%/ *ARx+0%,访问后,从 ARx中以循环寻址的方式减去 /加上 AR0
*ARx(lk),ARx和 16-bit的长偏移 (lk) 的和用来作为数据存储器地址。 ARx本身不被修改
*+ARx(lk),在寻址之前,把一个带符号的 16-bit的长偏移
( lk)加到 ARx中,然后用新的 ARx的值作为数据存储器的地址
*+ARx(lk)%,在寻址之前,把一个带符号的 16-bit的长偏移以循环寻址的方式加到 ARx中,然后再用新的 ARx的值作为数据存储器的地址编程举例:
编程举例:
33221100
3
0
0 xaxaxaxaxay
i
ii
间接寻址编程,
.mmregs
.bss x,4,1
a,word 1,2,3,4
.sect,program”
STM #a,AR1
STM #x,AR2
LD #0,A
LD *AR1+,T
MAC *AR2+,A
LD *AR1+,T
MAC *AR2+,A
LD *AR1+,T
MAC *AR2+,A
LD *AR1,T
MAC *AR2,A
…..
双操作数寻址方式双数据存储器操作数间接寻址类型
*Arx,ARx是数据存储器地址
*ARx-/ *ARx+,访问后,ARx中的地址减 1/加 1
*ARx+0%,访问后,AR0以循环寻址的方式加到 ARx中。
例如:
MPY *AR2,*AR3,A
FIRS *AR2,*AR3,coef
双数据存储器操作数间接寻址方框图
4,绝对地址寻址有 个别指令可以使用 16bits的绝对地址寻址,
数据存储器地址 ( dmad) 寻址:
MVDK Smem,dmad MVDM dmad,MMR
MVKD dmad,Smem MVMD pmad,Smem
程序存储器地址 ( pmad) 寻址:
FIRS Xmem,Ymem,pmad MACD Smem,pmad,src
MACP Smem,pmad,src MVPD pmad,Smem
端口地址 (PA)寻址
PORTR PA,Smem PORTW Smem,PA
*(lk)寻址适用于支持单数据存储器操作数的指令
5,累加器寻址累加器寻址是用累加器中的数作为一个地址 。 这种寻址方式可用来对存放数据的程序存储器寻址 。 共有两条指令可以采用累加器寻址:
READA Smem
WRITA Smem
READA是把累加器 A所确定的程序存储器单元中的一个字,传送到单数据存储器 ( Smem) 操作数所确定的数据存储器单元中 。 WRITA是把 Smem操作数所确定的数据单元中的一个字,传送到累加器 A确定的程序存储器单元中去 。
只有 8条指令能使用存储器映射寄存器寻址:
LDM MMR,dst
MVDM dmad,MMR
MVMD MMR,dmad
MVMM MMRx,MMRy
POPM MMR
PSHM MMR
STLM src,MMR
STM #lk,MMR
6,存储器映射寄存器寻址存储器映射寄存器寻址用来修改存储器映射寄存器而不影响当前数据页指针 ( DP) 或堆栈指针 ( SP) 的值 。
存储器映射寄存器寻址既可以在直接寻址中使用,又可以在间接寻址中使用 。
7,堆栈寻址系统堆栈用来在中断和子程序期间自动存放程序计数器 。
它也能用来存放额外的数据项或传递数据值 。 处理器使用一个 16-bit的存储器映射寄存器 — 堆栈指针来对堆栈寻址,它总是指向存放在堆栈中的最后一个元素 。
共有四条使用堆栈寻址方式访问堆栈的指令:
PSHD 把一个数据存储器的值压入堆栈 。
PSHM 把一个存储器映射寄存器的值压入堆栈 。
POPD 把一个数据存储器的值弹出堆栈 。
POPM 把一个存储器映射寄存器的值弹出堆栈 。
§ 3-2 特殊寻址方式说明本小节重点介绍两种广泛应用的特殊寻址方式 —循环寻址和位倒序寻址。
位倒序寻址位倒序寻址提高了执行速度和在 FFT算法的程序中使用存储器的效率。在这种寻址方式中,AR0存放的整数 N
是 FFT点数的一半。一个辅助寄存器指向一数据存放的物理单元。当使用位倒序寻址把 AR0加到辅助寄存器中时,
地址以位倒序的方式产生,即进位是从左向右,而不是从右向左。间接寻址中 *Arn+0B/-0B表示位倒序寻址。
8点的 FFT蝶型结运算
W
0
W
0
W
2
W
0
W
2
W
0
W
1
W
2
W
3
x(0)
x(4)
x(2)
x(6)
x(1)
x(5)
x(3)
x(7) X(7)
X(6)
X(5)
X(4)
X(3)
X(2)
X(1)
X(0)
W
0
W
0
W
0
0000
0100
0010
0110
0001
0101
0011
0111
FFT中混序就是位倒序
FFT运算时输出 /输入序列中必有其一要混序。
位倒序寻址的执行设 FFT长度 N=16,则 AR0赋值为 8,位倒序方式读入数据情况如下:
循环寻址:
许多算法,如卷积,相关和 FIR滤波等,都需要在存储器中实现一个循环缓冲器。在这些算法中,一个循环缓冲器就是一个包含了最近的数据的滑动窗口。当新的数据来到时,缓冲器就会覆盖最早的数据。循环缓冲器实现的关键是循环寻址的实现。‘ C54x间接寻址中提供了循环寻址的方式,以 %表示。
循环寻址图示循环寻址的有效地址计算定义循环缓冲器大小寄存器( BK)来确定了循环缓冲器的大小。大小为 R的循环缓冲器必须从一个 N-bit边界开始。循环缓冲器的有效基地址( EFB)就是用户选定的辅助寄存器( ARx)的低 N位置 0后所得到的值。
满足条件:
循环缓冲器的尾地址( EOB)是通过用 BK的低 N位代替
ARx的低 N位得到。循环缓冲器的 INDEX就是 ARx的低
N位,step就是加到辅助寄存器,或从辅助寄存器中减去的值。循环寻址的算法如下:
RN?2
if 0≤ index+step < BK:
index = index + step
else if index + step ≥ BK:
index = index + step - BK
else if index + step< 0
index = index + step + BK
如何确定循环缓冲的起始地址?
R(BK)=32 ---> 二进制 100000 ---> N=6
R(BK)=31 ---> 二进制 011111 ---> N=5
应用举例,计算 16阶的 FIR滤波器输出 256个点
.sect,fir -prog”
STM #255,BRC ; Repeat 256 times
RPTBD fir_filter_loop
STM #16,BK ; FIR circular buffer
size
LD *AR7+,A ; load the input value
STL A,*AR4+% ; replace oldest sample with; newest sample
RPTZ A,#16
MAC *AR4+0%,*AR3+0%,A ; filtering
STH A,*AR5+ ; replace the oldest
buffer value
fir_filter_loop
TMS320C54x的指令集有近两百条指令,按功能分为如下几类,
算术运算指令
逻辑运算指令
程序控制指令
装入和存储指令
§ 3-3 TMS320C54x的指令集一、算术运算指令算术运算指令可分为如下几类:
加法指令
减法指令
乘法指令
乘加指令
乘减指令
双数 /双精度指令
特殊操作指令
1、加法指令定点 DSP中数据表示方法
当它表示一个整数时,其最低位( D0)表示 1,
D1位表示 2的 1次方,次高位( D14)表示 2的 14方。
如果表示一个有符号数时,最高位( D15)为符号位,0表示正数,1表示负数。例如,07FFFH
表示最大的正数 32767(十进制),而 0FFFFH表示最大的负数 -1(负数用 2的补码方式显示)。
当需要表示小数时,小数点的位置始终在最高为后,而最高位( D15)表示符号位。这样次高位
( D14)表示 0.5,然后是 0.25,最低位( D0)表示。
所以 04000H表示小数 0.5,01000H表示小数 0.25,
而 0001H表示 16位定点 DSP表示的最小的小数(有符号) 0.000030517578125。
实现 16位定点加法
‘C54X中提供了多条用于加法的指令,如
ADD,ADDC,ADDM和 ADDS。其中
ADDS用于无符号数的加法运算,ADDC
用于带进位的加法运算(如 32位扩展精度加法),而 ADDM专用于立即数的加法。
使用 ADD完成加法
ld temp1,a ;将变量 temp1装入寄存器 A
add temp2,a ;将变量 temp2与寄存器 A相加;结果放入 A中
stl a,temp3 ;将结果 ( 低 16位 ) 存入变量; temp3中 。
注意,这里完成计算 temp3=temp1+temp2,我们没有特意考虑 temp1和 temp2是整数还是小数,在加法和下面的减法中整数运算和定点的小数运算都是一样的。
利用 ADDS实现 32位数据装入
ld #0,dp ; 设置数据页指针
ld 60h,16,a ; 将 60H的内容装入 A的高 16位
adds 61h,a ; 将 61H的内容加到 A的低 16位
dld 60h,b ; 直接装入 32位到 B寄存器
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
2、
减法指令实现 16位定点减法
‘C54X中提供了多条用于减法的指令,如
SUB,SUBB,SUBC和 SUBS。其中 SUBS
用于无符号数的减法运算,SUBB用于带进位的减法运算(如 32位扩展精度的减法),而 SUBC为移位减,DSP中的除法就是用该指令来实现的。 SUB指令与 ADD指令一样,有许多的寻址方式,其详细使用说明请参考,TMS320C54X使用教程,
减法指令使用举例
stm #60h,ar3 ;将变量 temp1的地址装入 ar3寄存器
stm #61h,ar2 ;将变量 temp3的地址装入 ar3寄存器
sub *ar2+,*ar3,b ;将变量 temp3左移 16位同时变量; temp2也左移 16位,然后相减,结; 果放入寄存器 B( 高 16位 ) 中,同; 时 ar2加 1。
sth b,63h ;将相减的结果 ( 高 16位 ) 存入变量 63h
利用 SUBC实现除法
在‘ C54X中没有提供专门的除法指令,
一般有两种方法来完成除法。一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。
这种方法对于除以常数特别适用。另一种方法是使用 SUBC指令,重复 16次减法完成除法运算。
利用 SUBC完成 Temp1/Temp2
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
注,实际上是完成整数除法实现小数除法
在‘ C54X中实现 16位的小数除法与前面的整数除法基本一致,也是使用 SUBC指令来完成。
但有两点需要注意,第一,小数除法的结果一定是小数(小于 1),所以被除数一定小于除数。 在执行 SUBC指令前,应将被除数装入 A或
B寄存器的高 16位,而不是低 16位。 其结果的格式与整数除法一样。第二,应考虑符号位对结果小数点的影响。所以应对 商右移一位,得到正确的有符号数。
3、乘法指令实现 16定点整数乘法
在‘ C54X中提供了大量的乘法运算指令,
其结果都是 32位,放在 A或 B寄存器中。
乘数在‘ C54X的乘法指令很灵活,可以是 T寄存器、立即数、存贮单元和 A或 B
寄存器的高 16位。如果是无符号数乘时,
请使用 MPYU指令。这是一条专用于无符号数乘法运算的指令,而其它指令都是有符号数的乘法。
整数乘法举例
rsbx FRCT ;清 FRCT标志,准备整数乘
ld temp1,T ;将变量 temp1装入 T寄存器
mpy temp2,a ;完成 temp2*temp1,结果放;入 A寄存器 ( 32位 )
实现小数乘法
在‘ C54X中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。‘ C54X中提供了一个状态位 FRCT,将其设置为 1时,
系统自动将乘积结果左移移位。两个小数
( 16位)相乘后结果为 32位,如果精度允许的话,可以只存高 16位,将低 16位丢弃,这样仍可得到 16位的结果。
小数乘法举例
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
4、乘加和乘减指令
5、
双精度
/
双数操作指令
6、
特殊指令二、逻辑运算指令逻辑指令包括与、或、异或、移位和测试指令
1、与指令( AND)
2、或、异或指令
3、移位和测试指令三、程序控制指令程序控制指令包括:
分支指令调用指令中断指令返回指令重复指令堆栈操作指令混合程序控制指令
1、分支指令
2、调用与中断指令
3、返回指令
4、重复指令和堆栈操作指令
5、混合程序控制指令四、装入和存储指令装入和存储指令包括:
一般的装入和存储指令条件存储指令并行装入和存储指令并行装入和乘法指令并行存储和加件乘指令混合装入和存储指令
1、一般的装入指令
2、存贮指令
3 并行装入和存储指令
4、条件存储指令
5、并行存储和加、减、乘法指令
6、并行装入和乘法指令
7、混合装入和存储指令注意:同一条指令在不同存储器中可能有不同执行时间
操作数在双寻址空间、单寻址空间和外部
程序代码在双寻址、单寻址和外部空间
操作数和代码在相同存储器块中
数据空间插入了等待周期
程序空间插入了等待周期
FIRS指令 使用方法:
FIRS *AR2+,*AR3+,COEF
§ 3-4 特殊指令使用说明
FIRS指令
FIRS指令用于线性相位滤波器的处理。一个如下图的 8阶线性相位滤波器的输出表达式:
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算法,C54x为此提供了专门的硬件和指令。根据输入信号确定分支似然概率增加量 D1/D2,放在 T寄存器中,TRN存储可能信号译码输出。
相关指令应用最小均方运算 LMS
在进行自适应滤波等操作中经常会使用 LMS算法,C54x
提供的 LMS指令方便了编程。如下图所示的自适应滤波器设计中,滤波器系数修正公式为:
其中,e(i) = d(i) - y(i)。
滤波器输出:
)()(
1
0
kixwiy
N
k
k
基于 LMS的自适应滤波编程数据归一化相关指令 EXP,NORM
归一化一个数是先求其指数,然后把它调整到最大精度格式。实现方法如下:
数据块移动 MVDD,MVDP,MVPD
在 C54x系列 DSP,数据与数据存储器、数据与程序存储器之间可以方便的进行数据传输,结合单指令循环可实现数据块移动。如 16个系数的移动:
指令效率的提高
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
本章小结本章重点介绍了 TMS320C54x的软件体系,并对特殊的寻址方式和特殊指令进行了介绍,对于各指令更详细的了解需同学自己多看书。
制作,DSP实验室
2002.10
C54x寻址方式
‘ C54x特殊寻址方式说明
‘ C54x指令集
‘ C54x特殊指令使用说明立即数寻址,指令中嵌有一个固定的数绝对地址寻址,指令中有一个固定的地址累加器寻址,按累加器内的地址去访问程序存储器中的一个单元直接寻址,指令中的 7bits是一个数据页内的偏移地址,
而所在的数据页由数据页指针 DP或 SP决定 。
该偏移加上 DP和 SP的值决定了在数据存储器中的实际地址 。
间接寻址,按照辅助寄存器中的地址访问存储器 。
存储器映射寄存器寻址,修改存储器映射寄存器中的值,
而不影响当前 DP或 SP的值 。
堆栈寻址,把数据压入和弹出系统堆栈 。
§ 3-1 TMS320C54x的寻址方式在立即数寻址中,指令里包括了立即操作数。在一条指令中可对两种立即数编码。一种是短立即数( 3、
5,8或 9bits),另一种是 16bits的长立即数。立即数可包含在单字或双字指令中。 3-,5-,8-或 9-bit值在单字指令中,16-bit值在双字指令中。
1,立即数寻址立即数寻址的其他例子:
LD #0,ARP ; ARP=2( #k3)
LD #3,ASM ; ASM=3( #k5)
LD #50,DP ; DP=50( #k9)
LD #1234,A ; A=1234( #k)
STM #FFFFh,IMR; IMR=FFFFh( #lk)
短立即数 RPT
长立即数 RPT
在直接寻址中,指令代码包含了数据存储器地址的低七位。这 7-bit dma
作为偏移地址与数据页指针( DP)或堆栈指针( SP)相结合共同形成 16-
bit的数据存储器实际地址。如右图所示 。
2,直接寻址
CPL=0,dma与 9-bit的 DP相结合形成数据存储器地址。
以 DP为基准的直接寻址
DP
9-bit
9-bit的 DP指向数据存储空间的 512个数据页中的一页
0
1
2
510
511
编程举例:
编程举例:
33221100
3
0
0 xaxaxaxaxay
i
ii
直接寻址编程,
.mmregs
.bss x,4,1
a0,word 012h
a1,word 3211h
a2,word fe11h
a3,word ff03h
.sect,program”
LD #0,A
LD #X,DP
LD #a0,T
MAC x,A
LD #a1,T
MAC X+1,A
LD #a2,T
MAC X+2,A
…..
以 SP为基准的直接寻址
CPL=1,dma加上 SP基地址形成数据存储器地址。 (st1中)
使用以 SP为基址的直接寻址:
AND sample,A
LD sample,A
ADD sample,B ; ……..
3,间接寻址在间接寻址中,64K数据空间任意单元都可通过一个辅助寄存器中的 16-bit地址进行访问。‘ C54x有 8个 16-bit辅助寄存器( AR0-AR7)。两个辅助寄存器算术单元( ARAU0和
ARAU1),根据辅助寄存器的内容进行操作,完成无符号的
16-bit算术运算。间接寻址很灵活,不仅能从存储器中读或写一个单 16-bit数据操作数,而且能在一条指令中访问两个数据存储器单元(即从两个独立的存储器单元读数据,或读一个存储器单元同时写另一个存储器单元,或读写两个连续的存储器单元)。
单操作数寻址单操作数间接寻址方框图单操作数间接寻址类型:
*Arx,ARx包含了数据存储器地址
*ARx-/ *ARx+,访问后,ARx中的地址减 1/加 1
*+ARx,在寻址之前,ARx中的地址加 1
*ARx-0B/ *ARx+0B,访问后,从 ARx中以位倒序进位的方式减去 /加上 AR0
*ARx-0/ *ARx+0,访问后,从 ARx中减去 /加上 AR0
*ARx-%/ *ARx+%,访问后,ARx中的地址以循环寻址的方式减 1/加 1
*ARx-0%/ *ARx+0%,访问后,从 ARx中以循环寻址的方式减去 /加上 AR0
*ARx(lk),ARx和 16-bit的长偏移 (lk) 的和用来作为数据存储器地址。 ARx本身不被修改
*+ARx(lk),在寻址之前,把一个带符号的 16-bit的长偏移
( lk)加到 ARx中,然后用新的 ARx的值作为数据存储器的地址
*+ARx(lk)%,在寻址之前,把一个带符号的 16-bit的长偏移以循环寻址的方式加到 ARx中,然后再用新的 ARx的值作为数据存储器的地址编程举例:
编程举例:
33221100
3
0
0 xaxaxaxaxay
i
ii
间接寻址编程,
.mmregs
.bss x,4,1
a,word 1,2,3,4
.sect,program”
STM #a,AR1
STM #x,AR2
LD #0,A
LD *AR1+,T
MAC *AR2+,A
LD *AR1+,T
MAC *AR2+,A
LD *AR1+,T
MAC *AR2+,A
LD *AR1,T
MAC *AR2,A
…..
双操作数寻址方式双数据存储器操作数间接寻址类型
*Arx,ARx是数据存储器地址
*ARx-/ *ARx+,访问后,ARx中的地址减 1/加 1
*ARx+0%,访问后,AR0以循环寻址的方式加到 ARx中。
例如:
MPY *AR2,*AR3,A
FIRS *AR2,*AR3,coef
双数据存储器操作数间接寻址方框图
4,绝对地址寻址有 个别指令可以使用 16bits的绝对地址寻址,
数据存储器地址 ( dmad) 寻址:
MVDK Smem,dmad MVDM dmad,MMR
MVKD dmad,Smem MVMD pmad,Smem
程序存储器地址 ( pmad) 寻址:
FIRS Xmem,Ymem,pmad MACD Smem,pmad,src
MACP Smem,pmad,src MVPD pmad,Smem
端口地址 (PA)寻址
PORTR PA,Smem PORTW Smem,PA
*(lk)寻址适用于支持单数据存储器操作数的指令
5,累加器寻址累加器寻址是用累加器中的数作为一个地址 。 这种寻址方式可用来对存放数据的程序存储器寻址 。 共有两条指令可以采用累加器寻址:
READA Smem
WRITA Smem
READA是把累加器 A所确定的程序存储器单元中的一个字,传送到单数据存储器 ( Smem) 操作数所确定的数据存储器单元中 。 WRITA是把 Smem操作数所确定的数据单元中的一个字,传送到累加器 A确定的程序存储器单元中去 。
只有 8条指令能使用存储器映射寄存器寻址:
LDM MMR,dst
MVDM dmad,MMR
MVMD MMR,dmad
MVMM MMRx,MMRy
POPM MMR
PSHM MMR
STLM src,MMR
STM #lk,MMR
6,存储器映射寄存器寻址存储器映射寄存器寻址用来修改存储器映射寄存器而不影响当前数据页指针 ( DP) 或堆栈指针 ( SP) 的值 。
存储器映射寄存器寻址既可以在直接寻址中使用,又可以在间接寻址中使用 。
7,堆栈寻址系统堆栈用来在中断和子程序期间自动存放程序计数器 。
它也能用来存放额外的数据项或传递数据值 。 处理器使用一个 16-bit的存储器映射寄存器 — 堆栈指针来对堆栈寻址,它总是指向存放在堆栈中的最后一个元素 。
共有四条使用堆栈寻址方式访问堆栈的指令:
PSHD 把一个数据存储器的值压入堆栈 。
PSHM 把一个存储器映射寄存器的值压入堆栈 。
POPD 把一个数据存储器的值弹出堆栈 。
POPM 把一个存储器映射寄存器的值弹出堆栈 。
§ 3-2 特殊寻址方式说明本小节重点介绍两种广泛应用的特殊寻址方式 —循环寻址和位倒序寻址。
位倒序寻址位倒序寻址提高了执行速度和在 FFT算法的程序中使用存储器的效率。在这种寻址方式中,AR0存放的整数 N
是 FFT点数的一半。一个辅助寄存器指向一数据存放的物理单元。当使用位倒序寻址把 AR0加到辅助寄存器中时,
地址以位倒序的方式产生,即进位是从左向右,而不是从右向左。间接寻址中 *Arn+0B/-0B表示位倒序寻址。
8点的 FFT蝶型结运算
W
0
W
0
W
2
W
0
W
2
W
0
W
1
W
2
W
3
x(0)
x(4)
x(2)
x(6)
x(1)
x(5)
x(3)
x(7) X(7)
X(6)
X(5)
X(4)
X(3)
X(2)
X(1)
X(0)
W
0
W
0
W
0
0000
0100
0010
0110
0001
0101
0011
0111
FFT中混序就是位倒序
FFT运算时输出 /输入序列中必有其一要混序。
位倒序寻址的执行设 FFT长度 N=16,则 AR0赋值为 8,位倒序方式读入数据情况如下:
循环寻址:
许多算法,如卷积,相关和 FIR滤波等,都需要在存储器中实现一个循环缓冲器。在这些算法中,一个循环缓冲器就是一个包含了最近的数据的滑动窗口。当新的数据来到时,缓冲器就会覆盖最早的数据。循环缓冲器实现的关键是循环寻址的实现。‘ C54x间接寻址中提供了循环寻址的方式,以 %表示。
循环寻址图示循环寻址的有效地址计算定义循环缓冲器大小寄存器( BK)来确定了循环缓冲器的大小。大小为 R的循环缓冲器必须从一个 N-bit边界开始。循环缓冲器的有效基地址( EFB)就是用户选定的辅助寄存器( ARx)的低 N位置 0后所得到的值。
满足条件:
循环缓冲器的尾地址( EOB)是通过用 BK的低 N位代替
ARx的低 N位得到。循环缓冲器的 INDEX就是 ARx的低
N位,step就是加到辅助寄存器,或从辅助寄存器中减去的值。循环寻址的算法如下:
RN?2
if 0≤ index+step < BK:
index = index + step
else if index + step ≥ BK:
index = index + step - BK
else if index + step< 0
index = index + step + BK
如何确定循环缓冲的起始地址?
R(BK)=32 ---> 二进制 100000 ---> N=6
R(BK)=31 ---> 二进制 011111 ---> N=5
应用举例,计算 16阶的 FIR滤波器输出 256个点
.sect,fir -prog”
STM #255,BRC ; Repeat 256 times
RPTBD fir_filter_loop
STM #16,BK ; FIR circular buffer
size
LD *AR7+,A ; load the input value
STL A,*AR4+% ; replace oldest sample with; newest sample
RPTZ A,#16
MAC *AR4+0%,*AR3+0%,A ; filtering
STH A,*AR5+ ; replace the oldest
buffer value
fir_filter_loop
TMS320C54x的指令集有近两百条指令,按功能分为如下几类,
算术运算指令
逻辑运算指令
程序控制指令
装入和存储指令
§ 3-3 TMS320C54x的指令集一、算术运算指令算术运算指令可分为如下几类:
加法指令
减法指令
乘法指令
乘加指令
乘减指令
双数 /双精度指令
特殊操作指令
1、加法指令定点 DSP中数据表示方法
当它表示一个整数时,其最低位( D0)表示 1,
D1位表示 2的 1次方,次高位( D14)表示 2的 14方。
如果表示一个有符号数时,最高位( D15)为符号位,0表示正数,1表示负数。例如,07FFFH
表示最大的正数 32767(十进制),而 0FFFFH表示最大的负数 -1(负数用 2的补码方式显示)。
当需要表示小数时,小数点的位置始终在最高为后,而最高位( D15)表示符号位。这样次高位
( D14)表示 0.5,然后是 0.25,最低位( D0)表示。
所以 04000H表示小数 0.5,01000H表示小数 0.25,
而 0001H表示 16位定点 DSP表示的最小的小数(有符号) 0.000030517578125。
实现 16位定点加法
‘C54X中提供了多条用于加法的指令,如
ADD,ADDC,ADDM和 ADDS。其中
ADDS用于无符号数的加法运算,ADDC
用于带进位的加法运算(如 32位扩展精度加法),而 ADDM专用于立即数的加法。
使用 ADD完成加法
ld temp1,a ;将变量 temp1装入寄存器 A
add temp2,a ;将变量 temp2与寄存器 A相加;结果放入 A中
stl a,temp3 ;将结果 ( 低 16位 ) 存入变量; temp3中 。
注意,这里完成计算 temp3=temp1+temp2,我们没有特意考虑 temp1和 temp2是整数还是小数,在加法和下面的减法中整数运算和定点的小数运算都是一样的。
利用 ADDS实现 32位数据装入
ld #0,dp ; 设置数据页指针
ld 60h,16,a ; 将 60H的内容装入 A的高 16位
adds 61h,a ; 将 61H的内容加到 A的低 16位
dld 60h,b ; 直接装入 32位到 B寄存器
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
2、
减法指令实现 16位定点减法
‘C54X中提供了多条用于减法的指令,如
SUB,SUBB,SUBC和 SUBS。其中 SUBS
用于无符号数的减法运算,SUBB用于带进位的减法运算(如 32位扩展精度的减法),而 SUBC为移位减,DSP中的除法就是用该指令来实现的。 SUB指令与 ADD指令一样,有许多的寻址方式,其详细使用说明请参考,TMS320C54X使用教程,
减法指令使用举例
stm #60h,ar3 ;将变量 temp1的地址装入 ar3寄存器
stm #61h,ar2 ;将变量 temp3的地址装入 ar3寄存器
sub *ar2+,*ar3,b ;将变量 temp3左移 16位同时变量; temp2也左移 16位,然后相减,结; 果放入寄存器 B( 高 16位 ) 中,同; 时 ar2加 1。
sth b,63h ;将相减的结果 ( 高 16位 ) 存入变量 63h
利用 SUBC实现除法
在‘ C54X中没有提供专门的除法指令,
一般有两种方法来完成除法。一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。
这种方法对于除以常数特别适用。另一种方法是使用 SUBC指令,重复 16次减法完成除法运算。
利用 SUBC完成 Temp1/Temp2
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
注,实际上是完成整数除法实现小数除法
在‘ C54X中实现 16位的小数除法与前面的整数除法基本一致,也是使用 SUBC指令来完成。
但有两点需要注意,第一,小数除法的结果一定是小数(小于 1),所以被除数一定小于除数。 在执行 SUBC指令前,应将被除数装入 A或
B寄存器的高 16位,而不是低 16位。 其结果的格式与整数除法一样。第二,应考虑符号位对结果小数点的影响。所以应对 商右移一位,得到正确的有符号数。
3、乘法指令实现 16定点整数乘法
在‘ C54X中提供了大量的乘法运算指令,
其结果都是 32位,放在 A或 B寄存器中。
乘数在‘ C54X的乘法指令很灵活,可以是 T寄存器、立即数、存贮单元和 A或 B
寄存器的高 16位。如果是无符号数乘时,
请使用 MPYU指令。这是一条专用于无符号数乘法运算的指令,而其它指令都是有符号数的乘法。
整数乘法举例
rsbx FRCT ;清 FRCT标志,准备整数乘
ld temp1,T ;将变量 temp1装入 T寄存器
mpy temp2,a ;完成 temp2*temp1,结果放;入 A寄存器 ( 32位 )
实现小数乘法
在‘ C54X中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。‘ C54X中提供了一个状态位 FRCT,将其设置为 1时,
系统自动将乘积结果左移移位。两个小数
( 16位)相乘后结果为 32位,如果精度允许的话,可以只存高 16位,将低 16位丢弃,这样仍可得到 16位的结果。
小数乘法举例
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
4、乘加和乘减指令
5、
双精度
/
双数操作指令
6、
特殊指令二、逻辑运算指令逻辑指令包括与、或、异或、移位和测试指令
1、与指令( AND)
2、或、异或指令
3、移位和测试指令三、程序控制指令程序控制指令包括:
分支指令调用指令中断指令返回指令重复指令堆栈操作指令混合程序控制指令
1、分支指令
2、调用与中断指令
3、返回指令
4、重复指令和堆栈操作指令
5、混合程序控制指令四、装入和存储指令装入和存储指令包括:
一般的装入和存储指令条件存储指令并行装入和存储指令并行装入和乘法指令并行存储和加件乘指令混合装入和存储指令
1、一般的装入指令
2、存贮指令
3 并行装入和存储指令
4、条件存储指令
5、并行存储和加、减、乘法指令
6、并行装入和乘法指令
7、混合装入和存储指令注意:同一条指令在不同存储器中可能有不同执行时间
操作数在双寻址空间、单寻址空间和外部
程序代码在双寻址、单寻址和外部空间
操作数和代码在相同存储器块中
数据空间插入了等待周期
程序空间插入了等待周期
FIRS指令 使用方法:
FIRS *AR2+,*AR3+,COEF
§ 3-4 特殊指令使用说明
FIRS指令
FIRS指令用于线性相位滤波器的处理。一个如下图的 8阶线性相位滤波器的输出表达式:
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算法,C54x为此提供了专门的硬件和指令。根据输入信号确定分支似然概率增加量 D1/D2,放在 T寄存器中,TRN存储可能信号译码输出。
相关指令应用最小均方运算 LMS
在进行自适应滤波等操作中经常会使用 LMS算法,C54x
提供的 LMS指令方便了编程。如下图所示的自适应滤波器设计中,滤波器系数修正公式为:
其中,e(i) = d(i) - y(i)。
滤波器输出:
)()(
1
0
kixwiy
N
k
k
基于 LMS的自适应滤波编程数据归一化相关指令 EXP,NORM
归一化一个数是先求其指数,然后把它调整到最大精度格式。实现方法如下:
数据块移动 MVDD,MVDP,MVPD
在 C54x系列 DSP,数据与数据存储器、数据与程序存储器之间可以方便的进行数据传输,结合单指令循环可实现数据块移动。如 16个系数的移动:
指令效率的提高
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
本章小结本章重点介绍了 TMS320C54x的软件体系,并对特殊的寻址方式和特殊指令进行了介绍,对于各指令更详细的了解需同学自己多看书。
制作,DSP实验室
2002.10