第三章
This presentation is the property of its rightful owner.
Sponsored Links
1 / 83

第三章 DSP 软件体系 PowerPoint PPT Presentation


  • 169 Views
  • Uploaded on
  • Presentation posted in: General

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

Download Presentation

第三章 DSP 软件体系

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


Dsp

第三章 DSP软件体系

‘C54x寻址方式

‘C54x特殊寻址方式说明

‘C54x指令集

‘C54x特殊指令使用说明


3 1 tms320c54x

§3-1 TMS320C54x的寻址方式

立即数寻址: 指令中嵌有一个固定的数

绝对地址寻址: 指令中有一个固定的地址

累加器寻址: 按累加器内的地址去访问程序存储器中

的一个单元

直接寻址: 指令中的7bits是一个数据页内的偏移地址,

而所在的数据页由数据页指针DP或SP决定。

该偏移加上DP和SP的值决定了在数据存储器

中的实际地址。

间接寻址: 按照辅助寄存器中的地址访问存储器。

存储器映射寄存器寻址: 修改存储器映射寄存器中的值,

而不影响当前DP或SP的值。

堆栈寻址: 把数据压入和弹出系统堆栈。


Dsp

1 . 立即数寻址

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


Dsp

短立即数RPT

长立即数RPT

立即数寻址的其他例子:

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)


Dsp

2. 直接寻址

在直接寻址中,指令代码包含了数据存储器地址的低七位。这7-bit dma作为偏移地址与数据页指针(DP)或堆栈指针(SP)相结合共同形成16-bit的数据存储器实际地址。如右图所示。


Dsp

CPL=0:dma与9-bit的DP相结合形成数据存储器地址。

以DP为基准的直接寻址

0

1

2

DP

9-bit

510

511

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


Dsp

编程举例:


Dsp

编程举例:

直接寻址编程:

.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

…..


Dsp

CPL=1:dma加上SP基地址形成数据存储器地址。(st1中)

以SP为基准的直接寻址

使用以SP为基址的直接寻址:

AND sample, A

LD sample, A

ADD sample, B ;……..


Dsp

3. 间接寻址

在间接寻址中,64K数据空间任意单元都可通过一个辅助寄存器中的16-bit地址进行访问。‘C54x有8个16-bit辅助寄存器(AR0-AR7)。两个辅助寄存器算术单元(ARAU0和ARAU1),根据辅助寄存器的内容进行操作,完成无符号的16-bit算术运算。间接寻址很灵活,不仅能从存储器中读或写一个单16-bit数据操作数,而且能在一条指令中访问两个数据存储器单元(即从两个独立的存储器单元读数据,或读一个存储器单元同时写另一个存储器单元,或读写两个连续的存储器单元)。

单操作数寻址


Dsp

单操作数间接寻址方框图


Dsp

单操作数间接寻址类型:

  • *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本身不

    被修改


Dsp

  • *+ARx(lk): 在寻址之前,把一个带符号的16-bit的长偏移

    (lk)加到ARx中,然后用新的ARx的值作为

    数据存储器的地址

  • *+ARx(lk)%:在寻址之前,把一个带符号的16-bit的长偏移

    以循环寻址的方式加到ARx中,然后再用新

    的ARx的值作为数据存储器的地址


Dsp

编程举例:


Dsp

编程举例:

间接寻址编程:

.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

…..


Dsp

双操作数寻址方式

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

*Arx:ARx是数据存储器地址

*ARx-/ *ARx+: 访问后,ARx中的地址减1/加1

*ARx+0%: 访问后,AR0以循环寻址的方式加

到ARx中。

例如:

MPY *AR2,*AR3,A

FIRS *AR2,*AR3,coef


Dsp

双数据存储器操作数间接寻址方框图


Dsp

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)寻址适用于支持单数据存储器操作数的指令


Dsp

  • 5. 累加器寻址

  • 累加器寻址是用累加器中的数作为一个地址。这种寻址方式可用来对存放数据的程序存储器寻址。共有两条指令可以采用累加器寻址:

    • READA Smem

    • WRITA Smem

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


  • Dsp

    • 6. 存储器映射寄存器寻址

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

    • 只有8条指令能使用存储器映射寄存器寻址:

      • LDM MMR, dst

      • MVDM dmad, MMR

  • MVMD MMR, dmad

  • MVMM MMRx, MMRy

  • POPM MMR

    • PSHM MMR

    • STLM src, MMR

    • STM #lk, MMR


  • Dsp

    • 7. 堆栈寻址

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

  • 共有四条使用堆栈寻址方式访问堆栈的指令:

  • PSHD 把一个数据存储器的值压入堆栈。

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

  • POPM 把一个存储器映射寄存器的值弹出堆栈。


  • Dsp

    §3-2 特殊寻址方式说明

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

    位倒序寻址

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


    8 fft

    8点的FFT蝶型结运算

    0000

    0100

    0010

    0110

    0001

    0101

    0011

    0111


    Dsp

    FFT中混序就是位倒序

    FFT运算时输出/输入序列中必有其一要混序。


    Fft n 16 ar0 8

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


    Dsp

    循环寻址:

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

    循环寻址图示


    Dsp

    循环寻址的有效地址计算

    定义循环缓冲器大小寄存器(BK)来确定了循环缓冲器的大小。大小为R的循环缓冲器必须从一个N-bit边界开始。循环缓冲器的有效基地址(EFB)就是用户选定的辅助寄存器(ARx)的低N位置 0后所得到的值。

    满足条件:

    循环缓冲器的尾地址(EOB)是通过用BK的低N位代替ARx的低N位得到。循环缓冲器的INDEX就是ARx的低N位,step就是加到辅助寄存器,或从辅助寄存器中减去的值。循环寻址的算法如下:


    Dsp

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


    Dsp

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

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

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


    16 fir 256

    应用举例: 计算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


    3 3 tms320c54x

    §3-3 TMS320C54x的指令集

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

    算术运算指令

    逻辑运算指令

    程序控制指令

    装入和存储指令


    Dsp

    一、算术运算指令

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

     加法指令

     减法指令

     乘法指令

     乘加指令

     乘减指令

     双数/双精度指令

     特殊操作指令


    Dsp

    1、加法指令


    Dsp

    定点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。


    Dsp

    实现16位定点加法

    • ‘C54X中提供了多条用于加法的指令,如ADD,ADDC,ADDM和ADDS。其中ADDS用于无符号数的加法运算,ADDC用于带进位的加法运算(如32位扩展精度加法),而ADDM专用于立即数的加法。


    Dsp

    使用ADD完成加法

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

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

    ;结果放入A中

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

    ;temp3中。

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


    Adds 32

    利用ADDS实现32位数据装入

    ld #0,dp ; 设置数据页指针

    ld 60h,16,a; 将60H的内容装入A的高16位

    adds 61h,a; 将61H的内容加到A的低16位

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


    Dsp

    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


    Dsp

    2、减法指令


    Dsp

    实现16位定点减法

    • ‘C54X中提供了多条用于减法的指令,如SUB,SUBB,SUBC和SUBS。其中SUBS用于无符号数的减法运算,SUBB用于带进位的减法运算(如32位扩展精度的减法),而SUBC为移位减,DSP中的除法就是用该指令来实现的。SUB指令与ADD指令一样,有许多的寻址方式,其详细使用说明请参考《TMS320C54X使用教程》


    Dsp

    减法指令使用举例

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

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

    sub*ar2+, *ar3,b;将变量temp3左移16位同时变量

    ; temp2也左移16位,然后相减,结

    ; 果放入寄存器B(高16位)中,同

    ; 时ar2加1。

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


    Dsp

    利用SUBC实现除法

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


    Subc temp1 temp2

    利用SUBC完成Temp1/Temp2

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

    ;器的低16位

    rpt#15 ;重复SUBC指令16次

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

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

    ;存入变量temp3

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

    ;存入变量temp4

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


    Dsp

    实现小数除法

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


    Dsp

    3、乘法指令


    Dsp

    实现16定点整数乘法

    • 在‘C54X中提供了大量的乘法运算指令,其结果都是32位,放在A或B寄存器中。乘数在‘C54X的乘法指令很灵活,可以是T寄存器、立即数、存贮单元和A或B寄存器的高16位。如果是无符号数乘时,请使用MPYU指令。这是一条专用于无符号数乘法运算的指令,而其它指令都是有符号数的乘法。


    Dsp

    整数乘法举例

    • rsbxFRCT;清FRCT标志,准备整数乘

    • ldtemp1,T;将变量temp1装入T寄存器

    • mpytemp2,a;完成temp2*temp1,结果放

    • ;入A寄存器(32位)


    Dsp

    实现小数乘法

    • 在‘C54X中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。‘C54X中提供了一个状态位FRCT,将其设置为1时,系统自动将乘积结果左移移位。两个小数(16位)相乘后结果为32位,如果精度允许的话,可以只存高16位,将低16位丢弃,这样仍可得到16位的结果。


    Dsp

    小数乘法举例

    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


    Dsp

    4、乘加和乘减指令


    Dsp

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


    Dsp

    6、特殊指令


    Dsp

    二、逻辑运算指令

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

    1、与指令(AND)


    Dsp

    2、或、异或指令


    Dsp

    3、移位和测试指令


    Dsp

    三、程序控制指令

    程序控制指令包括:

    分支指令

    调用指令

    中断指令

    返回指令

    重复指令

    堆栈操作指令

    混合程序控制指令


    Dsp

    1、分支指令


    Dsp

    2、调用与中断指令


    Dsp

    3、返回指令


    Dsp

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


    Dsp

    5、混合程序控制指令


    Dsp

    四、装入和存储指令

    装入和存储指令包括:

    一般的装入和存储指令

    条件存储指令

    并行装入和存储指令

    并行装入和乘法指令

    并行存储和加件乘指令

    混合装入和存储指令


    Dsp

    1、一般的装入指令


    Dsp

    2、存贮指令


    Dsp

    3 并行装入和存储指令

    4、条件存储指令


    Dsp

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


    Dsp

    6、并行装入和乘法指令


    Dsp

    7、混合装入和存储指令


    Dsp

    注意:同一条指令在不同存储器中可能有不同执行时间

    • 操作数在双寻址空间、单寻址空间和外部

    • 程序代码在双寻址、单寻址和外部空间

    • 操作数和代码在相同存储器块中

    • 数据空间插入了等待周期

    • 程序空间插入了等待周期


    Dsp

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

    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存储可能信号译码输出。


    Dsp

    相关指令应用


    Dsp

    最小均方运算LMS

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

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

    滤波器输出:


    Dsp

    基于LMS的自适应滤波编程


    Exp norm

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

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


    Mvdd mvdp mvpd

    数据块移动MVDD、MVDP、MVPD

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


    Dsp

    指令效率的提高

    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


    Dsp

    本章小结本章重点介绍了TMS320C54x的软件体系,并对特殊的寻址方式和特殊指令进行了介绍,对于各指令更详细的了解需同学自己多看书。

    制作:DSP实验室

    2002.10


  • Login