第三章 DSP 软件体系

Post on 13-Feb-2016

66 views 10 download

description

第三章 DSP 软件体系.  ‘C54x 寻址方式 ‘ C54x 特殊寻址方式说明  ‘ C54x 指令集 ‘ C54x 特殊指令使用说明. §3-1 TMS320C54x 的寻址方式. 立即数寻址: 指令中嵌有一个固定的数 绝对地址寻址: 指令中有一个固定的地址 累加器寻址: 按累加器内的地址去访问程序存储器中 的一个单元 直接寻址: 指令中的 7bits 是一个数据页内的偏移地址, - PowerPoint PPT Presentation

Transcript of 第三章 DSP 软件体系

第三章 第三章 DSPDSP 软件体系软件体系‘‘C54xC54x 寻址方式寻址方式‘‘C54xC54x 特殊寻址方式说明特殊寻址方式说明‘‘C54xC54x 指令集指令集‘‘C54xC54x 特殊指令使用说明特殊指令使用说明

立即数寻址: 指令中嵌有一个固定的数绝对地址寻址: 指令中有一个固定的地址累加器寻址: 按累加器内的地址去访问程序存储器中 的一个单元直接寻址: 指令中的 7bits 是一个数据页内的偏移地址, 而所在的数据页由数据页指针 DP 或 SP 决定。 该偏移加上 DP 和 SP 的值决定了在数据存储器 中的实际地址。间接寻址: 按照辅助寄存器中的地址访问存储器。存储器映射寄存器寻址: 修改存储器映射寄存器中的值, 而不影响当前 DP 或 SP 的值。堆栈寻址: 把数据压入和弹出系统堆栈。

§3-1 TMS320C54x§3-1 TMS320C54x 的寻址方式的寻址方式

在立即数寻址中,指令里包括了立即操作数。在一条指令中可对两种立即数编码。一种是短立即数( 3 、 5 、8 或 9bits ),另一种是 16bits 的长立即数。立即数可包含在单字或双字指令中。 3- , 5- , 8- 或 9-bit 值在单字指令中, 16-bit 值在双字指令中。

1 . 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 为基准的直接寻址

DP9-bit

9-bit 的 DP 指向数据存储空间的 512 个数据页中的一页

01

2

510511

编程举例:编程举例:

编程举例: 33221100

3

00 xaxaxaxaxay

iii

直接寻址编程:.mmregs.bss x, 4, 1

a0 .word 012ha1 .word 3211ha2 .word fe11ha3 .word ff03h

.sect “program”LD #0, ALD #X, DPLD #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

00 xaxaxaxaxay

iii

间接寻址编程:.mmregs.bss x, 4, 1

a .word 1, 2, 3, 4.sect “program”STM #a, AR1STM #x, AR2LD #0, ALD *AR1+ , TMAC *AR2+ , ALD *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 , AFIRS *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 SmemWRITA Smem

READA 是把累加器 A 所确定的程序存储器单元中的一个字,传送到单数据存储器( Smem )操作数所确定的数据存储器单元中。 WRITA 是把 Smem 操作数所确定的数据单元中的一个字,传送到累加器 A 确定的程序存储器单元中去。

只有 8 条指令能使用存储器映射寄存器寻址:LDM MMR , dstMVDM dmad, MMR

MVMD MMR, dmad MVMM MMRx, MMRy POPM MMR

PSHM MMRSTLM src, MMRSTM #lk, MMR

6. 存储器映射寄存器寻址 存储器映射寄存器寻址用来修改存储器映射寄存器而不影响当前数据页指针( DP )或堆栈指针( SP )的值。存储器映射寄存器寻址既可以在直接寻址中使用,又可以在间接寻址中使用。

7. 堆栈寻址 系统堆栈用来在中断和子程序期间自动存放程序计数器。它也能用来存放额外的数据项或传递数据值。处理器使用一个 16-bit 的存储器映射寄存器—堆栈指针来对堆栈寻址,它总是指向存放在堆栈中的最后一个元素。 共有四条使用堆栈寻址方式访问堆栈的指令:

PSHD 把一个数据存储器的值压入堆栈。PSHM 把一个存储器映射寄存器的值压入堆栈。POPD 把一个数据存储器的值弹出堆栈。POPM 把一个存储器映射寄存器的值弹出堆栈。

§3-2 §3-2 特殊寻址方式说明特殊寻址方式说明 本小节重点介绍两种广泛应用的特殊寻址方式—循环寻址和位倒序寻址。 位倒序寻址

位倒序寻址提高了执行速度和在 FFT 算法的程序中使用存储器的效率。在这种寻址方式中, AR0 存放的整数 N 是 FFT 点数的一半。一个辅助寄存器指向一数据存放的物理单元。当使用位倒序寻址把 AR0 加到辅助寄存器中时,地址以位倒序的方式产生,即进位是从左向右,而不是从右向左。间接寻址中 *Arn+0B/-0B 表示位倒序寻址。

88 点的点的 FFTFFT 蝶型结运算蝶型结运算W0

W0

W2

W0

W2

W0

W1

W2

W3

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)

W0

W0

W0

0000

0100

0010

0110

0001

0101

0011

0111

FFTFFT 中混序就是位倒序中混序就是位倒序FFT 运算时输出 / 输入序列中必有其一要混序。

位倒序寻址的执行位倒序寻址的执行 设 设 FFTFFT 长度长度 N=16N=16 ,则,则 AR0AR0 赋值为赋值为 88 ,位,位倒序方式读入数据情况如下:倒序方式读入数据情况如下:

循环寻址: 许多算法,如卷积,相关和 FIR 滤波等,都需要在存储器中实现一个循环缓冲器。在这些算法中,一个循环缓冲器就是一个包含了最近的数据的滑动窗口。当新的数据来到时,缓冲器就会覆盖最早的数据。循环缓冲器实现的关键是循环寻址的实现。‘ C54x 间接寻址中提供了循环寻址的方式,以 % 表示。循环寻址图示

循环寻址的有效地址计算循环寻址的有效地址计算 定义循环缓冲器大小寄存器( BK )来确定了循环缓冲器的大小。大小为 R 的循环缓冲器必须从一个 N-bit 边界开始。循环缓冲器的有效基地址( EFB )就是用户选定的辅助寄存器( ARx )的低 N 位置 0 后所得到的值。 满足条件: 循环缓冲器的尾地址( EOB )是通过用 BK 的低 N 位代替 ARx 的低 N 位得到。循环缓冲器的 INDEX 就是 ARx 的低 N 位, step 就是加到辅助寄存器,或从辅助寄存器中减去的值。循环寻址的算法如下:

RN 2

if 0≤ if 0≤ index+step index+step < < BK:BK: index = index + step index = index + stepelse if index + step ≥ BK:else if index + step ≥ BK: index = index + step - BK index = index + step - BKelse if index + stepelse if index + step< < 00 index = index + step + BK index = index + step + BK

如何确定循环缓冲的起始地址?如何确定循环缓冲的起始地址?

R(BK)=32 ---> 二进制 100000 ---> N=6

R(BK)=31 ---> 二进制 011111 ---> N=5

应用举例应用举例 : : 计算计算 1616 阶的阶的 FIRFIR 滤波器输出滤波器输出 256256 个个点点.sect “fir-prog”STM #255, BRC ; Repeat 256 timesRPTBD fir_filter_loopSTM #16, BK ; FIR circular buffer sizeLD *AR7+, A ; load the input valueSTL A, *AR4+% ; replace oldest sample with; newest sampleRPTZ A, #16MAC *AR4+0%, *AR3+0%, A ; filteringSTH A, *AR5+ ; replace the oldest buffer valuefir_filter_loop

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

逻辑运算指令 程序控制指令 装入和存储指令

§3-3 TMS320C54x§3-3 TMS320C54x 的指令集的指令集

一、算术运算指令一、算术运算指令算术运算指令可分为如下几类: 加法指令 减法指令 乘法指令 乘加指令 乘减指令

双数 / 双精度指令 特殊操作指令

11 、加法指、加法指令令

定点定点 DSPDSP 中数据表示方法中数据表示方法 当它表示一个整数时,其最低位( 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 。

实现实现 1616 位定点加法位定点加法‘C54X 中提供了多条用于加法的指令,如 ADD , ADDC , ADDM 和 ADDS 。其中 ADDS 用于无符号数的加法运算,

ADDC 用于带进位的加法运算(如 32 位扩展精度加法),而 ADDM专用于立即数的加法。

使用使用 ADDADD 完成加法完成加法 ld temp1,a ;将变量 temp1装入寄存器 A add temp2,a ;将变量 temp2 与寄存器 A 相加 ;结果放入 A 中 stl a,temp3 ;将结果(低 16 位)存入变量 ; temp3 中。 注意,这里完成计算 temp3=temp1+temp2 ,我们没有特意考虑 temp1 和 temp2 是整数还是小数,在加法和下面的减法中整数运算和定点的小数运算都是一样的。

利用利用 ADDSADDS 实现实现 3232 位数据装位数据装入入 ld #0,dp ; 设置数据页指针 ld 60h,16,a ; 将 60H 的内容装入 A 的高 16位 adds 61h,a ; 将 61H 的内容加到 A 的低 16位

dld 60h,b ; 直接装入 32 位到 B 寄存器

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

22 、、减减法法指指令令

实现实现 1616 位定点减法位定点减法‘C54X 中提供了多条用于减法的指令,如 S

UB , 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

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

利用利用 SUBCSUBC 完成完成 Temp1/TemTemp1/Temp2p2

ld temp1,B ;将被除数 temp1装入 B 寄存 ;器的低 16 位rpt #15 ;重复 SUBC 指令 16次subc temp2,b ;使用 SUBC 指令完成除法stl B,temp3 ;将商( B 寄存器的低 16 位) ;存入变量 temp3sth B,temp4 ;将余数( B 寄存器的高 16 位) ;存入变量 temp4

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

实现小数除法实现小数除法 在‘ C54X 中实现 16 位的小数除法与前面的整数除法基本一致,也是使用 SUBC 指令来完成。但有两点需要注意:第一,小数除法的结果一定是小数(小于 1 ),所以被除数一定小于除数。在执行 SUBC 指令前,应将被除数装入 A或 B 寄存器的高 16 位,而不是低 16 位。其结果的格式与整数除法一样。第二,应考虑符号位对结果小数点的影响。所以应对商右移一位,得到正确的有符号数。

33 、乘法指令、乘法指令

实现实现 1616 定点整数乘法定点整数乘法 在‘ 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 中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。‘ C54

X 中提供了一个状态位 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

44 、乘加和乘减指令、乘加和乘减指令

55 、、双双精精度度//双双数数操操作作指指令令

66 、、特特殊殊指指令令

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

1 、与指令( AND )

22 、或、异或指、或、异或指令令

33 、移位和测试指令、移位和测试指令

三、程序控制指令三、程序控制指令程序控制指令包括:

分支指令调用指令中断指令返回指令重复指令堆栈操作指令混合程序控制指令

11 、分支指、分支指令令

2 、调用与中断指令

33 、返回指令、返回指令

44 、重复指令和堆栈操作指令、重复指令和堆栈操作指令

55 、混合程序控制指令、混合程序控制指令

四、装入和存储指令四、装入和存储指令装入和存储指令包括:

一般的装入和存储指令条件存储指令并行装入和存储指令并行装入和乘法指令并行存储和加件乘指令混合装入和存储指令

11 、一般的装入指令、一般的装入指令

22 、存贮指令、存贮指令

3 并行装入和存储指令

4 、条件存储指令

55 、并行存储和加、减、乘法指令、并行存储和加、减、乘法指令

66 、并行装入和乘法指令、并行装入和乘法指令

77 、混合装入和存储指令、混合装入和存储指令

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

FIRS 指令使用方法:FIRS *AR2+ , *AR3+ , COEF

§3-4 §3-4 特殊指令使用说明特殊指令使用说明FIRS 指令

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

FIRFIR 滤波的两指令滤波的两指令 MACMAC 、、 FIRFIRSS

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为 ;系数起始地址

ViterbiViterbi 译码指令译码指令 DADSTDADST 、、 DSADTDSADT 、、 CMPCMPSS

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

相关指令应用相关指令应用

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

其中, e(i) = d(i) - y(i) 。滤波器输出:)()(

1

0kixwiy

N

kk

基于基于 LMSLMS 的自适应滤波编的自适应滤波编程程

数据归一化相关指令数据归一化相关指令 EXPEXP 、、 NORMNORM

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

数据块移动数据块移动 MVDDMVDD 、、 MVDPMVDP 、、 MVPDMVPD 在 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