DSP原理及应用-汇编语言程序设计.ppt_第1页
DSP原理及应用-汇编语言程序设计.ppt_第2页
DSP原理及应用-汇编语言程序设计.ppt_第3页
DSP原理及应用-汇编语言程序设计.ppt_第4页
DSP原理及应用-汇编语言程序设计.ppt_第5页
已阅读5页,还剩122页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,第7章 汇编语言程序设计,7.1 程序流程控制,2,一、程序存储器地址生成,程序存储器中存放了指令代码、参数表和立即数。 依靠程序地址生成逻辑单元(PAGEN)产生程序地址。 程序地址产生逻辑共包括5个寄存器。 PC/XPC、RC、 BRC、RSA、REA,3,下面对5个寄存器进行说明: 程序计数器(PC): 16位程序计数器(PC)内中保存某个内部或外部程序存储器的即将要执行的指令的地址。这个地址放入程序地址总线(PAB)。 扩展程序计数器(XPC): 默认:XPC=0, 若在扩展程序空间寻址,采用23位寻址,高7位加载到XPC。,4,重复计数器(RC): 存放单指令重复执行次数,实际执

2、行时多1次。 例:RPT #10 ;执行?次 MVPD table,*AR1+ ;执行功能? 注1:RC不能对外访问。 注2:单指令重复执行期间,不受理中断。,5,块重复计数器(BRC)、块重复起始地址寄存器(RSA)、块重复结束地址寄存器(REA)。 (1)BRC存放一段指令重复执行次数,实际执行时多1次。 (2)块重复起始地址(编译自动计算)执行时存入RSA。 (3)块重复结束地址(程序中指定)执行时存入REA。 (4)块重复执行时,可受理中断。,6,例如: STM #99, BRC RPTB end_block-1 end_block: 执行次数: ? 从哪里开始:? 到哪里结束:?,7

3、,二、条件操作程序,C54x的一些指令只有在满足一个或是多个条件后才被执行,如条件分支转移、条件调用和条件返回等指令。 这些指令都用条件来限制分支转移、调用和返回操作。这些条件可用条件算符来表示。,8,表7-1 条件操作中的各种条件,9,表7-2 多条件指令中的条件组合,在条件操作时也可以要求有多个条件,只有所有条件满足时才被认为是满足条件。这种多个条件的组合就构成了指令的多重条件。,10,选用多重条件时应当注意以下几点:, 第1组:分为两类,最多可选择两个条件,组内两类条件 可以与/或构成多重条件,但不能用组内同类条件构成 与/或多重条件。, 组与组之间可用或构成多重条件。,当选择两个条件时

4、,累加器必须是同一个。 例如,可以同时选择AGT和AOV,但不能同时选择AGT和BOV。, 第2组:分为三类,最多可选三个条件,可以在每类中 各选一个条件进行与/或构成多重条件,但不能在同类 选两个以上条件。,例如,可以同时测试TC、C和BIO,但不能同时测试NTC、C和NC。,11,例1、条件操作程序,BC sub,BLEQ ; 条件分支转移 若累加器B0,则转至sub, 否则,往下执行 CC start,AGEQ,AOV ; 条件调用 若累加器A0且溢出, 则调用start,否则往下执行 RC NTC ; 条件返回 若TC = 0,则返回,否则往下执行,12,无条件分支转移:无条件执行分支

5、转移; 条件分支转移:要在满足一个或多个条件时才执行分支转移; 远程分支转移:允许分支转移到扩展存储器。,例2、分支转移举例 STM #88H,AR0 LD #1000H,A zhong: SUB AR0,A BC zhong,AGT,AOV,;将操作数#88H装入AR0 ;将操作数#1000H装入ACC ;将A中的内容减去AR0中的 ;内容结果装入A ;若累加器A0且溢出, ;则转至zhong,否则往下执行,分支转移指令可以改写PC值,使程序改变流向,三、分支转移程序,13,表7-3 无条件分支转移指令,14,表7-4 条件分支转移指令,15,表7-5 远分支转移指令,16,与分支转移一样,

6、通过传送控制到程序存储器的其他位置,子程序调用会中断连续的指令流。但是与分支转移不同的是,这种传送是临时的。 当函数的子程序被调用时,紧跟在调用后的下一条指令的地址保存在堆栈中。这个地址用于返回到调用程序并继续执行调用前的程序。 子程序调用操作分成两种形式:无条件调用和条件调用,两者都可以带延时操作和不带延时操作。,四、子程序调用与返回程序,17,无条件调用是指无条件执行调用。 条件调用和无条件调用操作相同,但是条件调用要在满足一个或多个条件时才执行调用。 远程调用允许对扩展存储器的子程序或函数进行调用。,18,表7-6 无条件调用与返回指令,19,表7-7 条件调用与返回指令,20,表7-8

7、 远调用和远返回指令,21,例3、子程序调用举例,STM #123H,AR0 LD #456H,AR1 CALL new LD AR1,16,A new:MPY AR0,AR1,A RET,;将操作数#123H装入AR0 ;将操作数#456H装入AR1 ;调子程序new ;将AR1的内容左移16位后装入A ;AR0与AR1的内容相乘,结果放入A中 ;子程序返回,22,五、重复操作程序,C54x的重复操作是使CPU重复执行一条指令或一段指令。可以分为单指令重复和块程序重复。,实现重复操作的指令: RPT 重复下条指令; RPTZ 累加器清0,并重复下条指令; RPTB 块重复指令。,使用RPT、

8、RPTZ能重复下一条指令;而RPTB用于重复代码块若干次。利用重复指令可实现比BANZ指令更快的循环程序。,23,利用RPT和RPTZ可重复执行紧随其后的一条指令。重复次数由该指令的操作数决定,并且等于操作数加1。 若要重复执行N+1次,则重复指令中应规定重复次数为N。该数值保存在16位重复计数器RC中,可通过RPT或RPTZ指令加载。一条指令的最大重复次数为65536。 由于要重复的指令只需要取指一次,对于多周期指令,采用重复操作后,可使多周期指令变成单周期指令,提高运行速度。,1. 单指令重复操作,24,例4、对数组进行初始化,使x8=0,0,0,0,0,0,0,0。,.bss x, 8

9、STM #x, AR1 LD #0, A RPT #7 STL A,*AR1+,.bss x, 8 STM #x, AR1,RPTZ A, #7 STL A, *AR1+,注意:, 对x8中的8个元素置0,重复次数为7,即执行1次STL A,AR1+指令后,再重复执行7次;, RPTZ指令设定重复次数后,再对累加器清零。,25,2. 块程序重复操作,对于整个程序块需要重复操作时,可采用程序块重复操作。,用于块程序重复操作指令为RPTB和RPTBD。程序块的长度由块程序重复指令RPTB的操作数来确定,而重复次数由块重复计数器BRC来决定。,通常RPTB的操作数为程序块的结束地址,而重复次数可用S

10、TM指令对BRC进行设定。,26,块重复操作的特点:, 程序块的起始地址RSA是RPTB指令的下一行; 块结束地址REA由RPTB指令的操作数规定; 对程序块进行重复操作时,不论程序块多长,重复次数多大,所用的机器周期为0; 与单指令重复操作不同,块重复操作可以响应中断。,块程序重复指令的特点是对任意长程序段的循环开销为0。循环由ST1状态寄存器的块重复标志位(BRAF)和紧跟在ST1状态寄存器后面的存储器映像寄存器控制。,27,循环过程:, 将块重复标志位BRAF置1,激活块程序重复循环; 将一个取值在065535范围里的循环次数N加载到BRC; 块重复指令把块重复的起始地址放在块重复开始地

11、址寄存器 RSA中; 块重复指令把块重复的末地址放在块重复结束地址寄存器 REA中。,28,例5、对数组x8中的每一元素加1。,.bss x, 8 begin: LD #1,16,B STM #7,BRC STM #x,AR4 RPTB next-1 ADD *AR4,16,B,A STH A,*AR4+ next: LD #0,B ,;设置数组空间 ;立即数1送入BH ;设置重复次数,BRC=7,循环8次 ;数组首地址x送入AR4 ;设置循环结束地址 ;数组数据左移16位与BH相加 ;存入数组结果,并修改地址 ;B清0, 块结束地址REA通常取程序块最后一条指令的下一条指令地址-1; 重复次

12、数为7次 RPTB指令可以响应中断。,注意:,29,六、中断系统,中断系统是DSP应用系统实现实时操作和多任务多进程操作的关键部分。 C54x的中断系统根据芯片型号的不同,提供了2430个硬件及软件中断源,分为1117个中断优先级,可实现多层任务嵌套。 本节从应用的角度介绍C54x中断系统的基本概念和工作过程。,30,(一)中断系统概述,中断可以由硬件触发或者软件触发,中断信号使TMS320C54x系列的DSP暂停正在执行的程序,并进入中断服务程序(ISP)。,1. 中断分类,可屏蔽中断 不可屏蔽中断,软件中断 硬件中断,31,2. 处理中断的步骤,TMS320C54x DSP处理中断分以下3

13、个步骤: (1) 接收中断请求 通过软件(程序代码)或硬件(引脚或片内外设)请求挂起主程序。如果中断源正在请求一个可屏蔽中断,则当中断被接收到时中断标志寄存器(IFR)的相应位被置1。 (2) 应答中断 TMS320C54x DSP必须应答中断请求。如果中断是可屏蔽的,则依定义条件的满足与否决定 DSP如何应答中断。如果是非屏蔽硬件中断和软件中断,中断应答是立即的。 (3) 执行中断服务程序 一旦中断被应答,执行中断向量地址所指向的分支转移指令,并执行中断服务程序。,32,(二)中断寄存器,1. 中断标志寄存器IFR,中断标志寄存器IFR是一个存储器映像寄存器,当一个中断出现时,IFR中的相应

14、的中断标志位置1,直到CPU识别该中断为止。,C54x中断系统设置两个中断寄存器:中断标志寄存器IFR和中断屏蔽寄存器IMR。,图1 中断标志寄存器IFR,33,中断标志寄存器IFR各位的功能,34,中断屏蔽寄存器是一个存储器映像寄存器,主要用于控制中断源的屏蔽和开放。,当状态寄存器ST1中的INTM位为0时,全局中断允许。IMR中的某位置1时,开放相应的中断。由于RS和NMI都不包含在IMR中,因此IMR对这两个中断不能进行屏蔽。,图2 中断屏蔽寄存器IMR,35,中断屏蔽寄存器IMR各位的功能,36,中断控制主要是屏蔽某些中断,避免其他中断对当前运行程序的干扰,以及防止同级中断之间的响应竞

15、争。,1. 接收中断请求,一个中断可由硬件器件或软件指令提出请求。当产生一个中断时,IFR寄存器中相应的中断标志位被置1。不管中断是否被处理器应答,该标志位都会置1。当相应的中断响应后,该标志位自动被清除。,(三)中断控制,37,外部硬件中断由外部中断口的信号发出请求,而内部硬件中断由片内外设的信号发出中断请求。,(1) 硬件中断请求,C5402硬件中断的请求信号:,外部中断: INT3 INT0引脚;,非屏蔽中断:RS和NMI引脚;,片内中断:BRINT0、BXINT0、BRINT1和BXINT1(串口中断) TINT0、TINT1(定时器中断); DMAC4、DMAC5(DMA中断); H

16、PINT(HPI中断)。,38,软件中断是由程序指令产生的中断请求,主要有3条指令:,(2) 软件中断请求,INTR指令:允许执行任何的可屏蔽中断,包括用户定义的中断 (从SINT0到SINT30);,TRAP指令:与INTR指令相同,但不影响状态寄存器ST1的中断 方式(INTM)位;,RESET指令:可在程序的任何时候产生,使处理器返回一个预 定状态。,39,对于软件中断和非屏蔽中断,CPU将立即响应,进入相应中断服务程序。 对于硬件可屏蔽中断,满足以下3种条件CPU才能响应中断。,2. 中断响应, 当前中断优先级最高。 INTM位清0。 IMR屏蔽位为1。,满足上述条件后,CPU响应中断

17、,终止当前正进行的操作,指令计数器PC自动转向相应的中断向量地址,取出中断服务程序地址,并发出硬件中断响应信号IACK,而清除相应的中断标志位。,40,CPU响应中断后,将进行以下操作:,3. 中断服务程序, 保护现场,将程序计数器PC值压入堆栈; 将中断向量的地址加载到PC; 从中断向量所指定的地址开始取指; 执行分支转移,进入中断服务程序; 执行中断服务程序直到出现返回指令; 从堆栈中弹出返回地址,加载到PC中; 继续执行主程序。,41,4. 保存中断上下文,当执行中断服务程序时,有些寄存器必须保存在堆栈中。当程序从ISR返回时,用户软件代码必须恢复这些寄存器的上下文。 使用堆栈操作指令可

18、以将这些寄存器传送到堆栈中,或者从堆栈中取出。 PSHM指令:将MMR寄存器中的内容传送到堆栈中; POPM指令:从堆栈中读出的数据传送到MMR寄存器中; PSHD指令:将数据存储器中的数据传送到堆栈; POPD指令:从堆栈中读出的数据传送到数据存储器中。,当保存和恢复上下文时,应考虑如下几点: 当使用堆栈保存上下文时,必须按相反的方向执行恢复; 当恢复ST1寄存器的BRAF位之前,应该恢复BRC位。如果没有按照这个顺序,BRC=0,则BRAF位将被清除。,42,5.中断操作流程,(1)可屏蔽中断操作过程: 设置IFR寄存器的相应标志位; 测试中断响应条件; 当中断响应后,清除相应的标志位,屏

19、蔽其他可屏蔽中断;PC值保存到堆栈中; 分支转移执行中断服务程序; 中断返回,将返回地址从堆栈中弹出给PC; CPU继续执行主程序。,43,(2)非屏蔽中断操作过程: CPU立刻响应该中断,产生中断响应信号; 如果中断是由RS、NMI或INTR指令请求的,则INTM位被置1; 若INTR指令已经请求了一个可屏蔽中断,则相应的标志位 被清零;PC值保存到堆栈中; 分支转移执行中断服务程序; 中断返回,将返回地址从堆栈中弹出给PC; CPU继续执行主程序。,44,中断操作流程图:,45,C系统的堆栈可以完成的主要功能如下: * 分配局部变量; * 传递函数参数; * 保存所调用函数的返回地址; *

20、 保存临时结果。,七、系统堆栈的使用,运行堆栈的增长方向是从高地址到低地址, 即入栈则地址减少,出栈则地址增加。堆栈的管理者是堆栈指针SP。堆栈的容量由链接器(Linker)设定。 如:在链接命令文件(.cmd文件)中加入选项 -stack 0 x1000 则堆栈的容量被设为1000H个字。,46,例如: K_STACK_SIZE .set 100 ;堆栈大小,共100个 单元 STACK .usect “stack”,K_STACK_SIZE ;自定义未初始化段stack SYSTEM_STACK .set STACK+K_STACK_SIZE ;堆栈栈底 STM #SYSTEM_STACK

21、,SP ;初始化SP指针 ;在链接命令文件中指定未初始化的段: stack :DRAM PAGE 1,47,中断系统,48,一、中断的基本知识,中断类型,中断标志寄存器(IFR)和中断屏蔽寄存器(IMR),49,二、CPU如何执行中断?,对硬件中断的处理,INTM,IMR,对软件中断的处理(三条指令),IFR,INTR K(INTM=1),TRAP K(对INTM不作要求),RESET (INTM=1),50,三、重新映射中断向量地址(三个问题),表7-9中中断号与地址的关系?,中断向量地址如何求得?,为什么硬件复位后中断向量表的起始地址是FF80?,51,FIR滤波器设计,52,一、认识FI

22、R滤波器,53,算法实现: A=0(A先清零); A=A+h(0) x(n); A=A+h(1) x(n-1); A=A+h(N-1) x(n-N+1); y(n)=A;,目的:求y(n),初步思想:,54,延迟(z-1)的实现(两种方法),二、FIR滤波器的滤波实现,输入信号 x(n)的实现,滤波器系数 h(n)的实现,线性缓冲区法,循环缓冲区法,55,(一) 线性缓冲区法,缓冲区:,顶部为低地址单元,存放最新样本;,缓冲区顶部,最新样本,底部为高地址单元,存放最老样本;,缓冲区底部,最老样本,指针ARx指向缓冲区底部。,ARx,1、方法,56,2、算法,取数、移位和运算:, 以ARx为指针

23、,按x(n-7)x(n)的顺序取数,每取一次数后,数据向下移一位,并完成一次乘法累加运算;, 当经过8次取数、移位和运算后,得y(n);, 求得y(n)后,输入新样本x(n+1),存入缓冲区顶部单元;, 修改指针ARx,指向缓冲区的底部。,57,3、求y(n)的过程,ARx,x(n-7),ARx,x(n-6),y(n)=y7=b7x(n-7)+0,x(n-6),ARx,x(n-5),y(n)=y6=b6x(n-6)+y7,x(n-5),ARx,x(n-4),y(n)=y5=b5x(n-5)+y6,x(n-4),ARx,x(n-3),y(n)=y4=b4x(n-4)+y5,x(n-3),ARx,

24、x(n-2),y(n)=y3=b3x(n-3)+y4,x(n-2),ARx,x(n-1),y(n)=y2=b2x(n-2)+y3,x(n-1),ARx,x(n),y(n)=y1=b1x(n-1)+y2,x(n),y(n)=b0 x(n)+y1,PORTR,x(n+1),ARx,结果:, y(n),58,4、求y(n+1)的过程,结果:, y(n),取数顺序:,x(n-6)x(n+1),x(n-5),x(n-4),x(n-3),x(n-2),x(n-1),x(n),x(n+1),最新样本:,x(n+2),x(n+2), y(n+1), y(n+2), y(n+3), y(n+4), y(n+5)

25、, y(n+6), y(n+7),ARx,线性缓冲区法的特点: (1)新老数据在存储器的位置直接明了。 (2)输入数据在DARAM中,59,以上过程,可以用N=6的线性缓冲区示意图来说明,如下图所示:,60,MACD 可以很方便地实现线性缓冲区法FIR滤波。 MACP 指令则没有延迟运算,可用DELAY指令。 Xmem、Ymem要求双间接寻址;,5、运算指令:,61,指令:MACD 格式:MACD Smem, pmad, src 执行:src = src + Smem * pmad, T = Smem, (Smem + 1) = Smem 存储器要求: Smem作输入数据x(n) ,在数据存储

26、器中;由于延迟操作在一个时钟周期内读一次、写一次,还要求为DARAM. pmad作FIR滤波系数h(n),放在程序存储器中,绝对寻址。 这条指令都可以重复执行,成为单周期指令。,62,指令:MACP 只是没有延迟运算,其它同MACD,可用DELAY补充。 DELAY Smem ; (Smem + 1) = Smem 指令: MAC 格式: MAC Xmem, Ymem, src , dst 执行: dst = src + Xmem * Ymem, T = Xmem 存储器要求: Xmem、Ymem:双间接寻址; 一个作输入数据x(n) , 另一个作FIR滤波系数h(n)。,63,缓冲区:,顶层

27、为低地址单元,存放最新样本;,x(n),底层为高地址单元,存放最老样本;,x(n-7),x(n-1),x(n-2),x(n-3),x(n-4),x(n-5),x(n-6),ARx指向最新样本单元。,ARx,算 法:,计算过程:, 以ARx为指针,按顺序取数,并修改指针;,x(n),ARx,x(n-1),ARx,x(n-2),ARx,x(n-3),ARx,x(n-4),ARx,x(n-5),ARx,x(n-6),ARx,x(n-7),ARx, 每取1次数后,完成1次乘法累加计算;,y(n)=y0=b0 x(n)+0,y(n)=y1=b1x(n-1)+y0,y(n)=y2=b2x(n-2)+y1,

28、y(n)=y3=b3x(n-3)+y2,y(n)=y4=b4x(n-4)+y3,y(n)=y5=b5x(n-5)+y4,y(n)=y6=b5x(n-6)+y5,y(n)=y7=b5x(n-7)+y6,二、循环缓冲区法,64,算 法:,计算过程:, 每取1次数后,完成1次乘法累加计算;, 求得y(n)后,输入新样本替代最老样本;,x(n+1),x(n+1), 修改指针ARx,指向最新样本单元。,ARx, 求y(n):,取数顺序:x(n)x(n-7),最新样本:x(n+1),ARx:指向x(n+1)单元, 求y(n+1):,取数顺序:x(n+1)x(n-6),最新样本:x(n+2),ARx:指向x

29、(n+2)单元, 求y(n+2):,取数顺序:x(n+2)x(n-5),最新样本:x(n+3),ARx:指向x(n+3)单元,循环缓冲区法的特点: (1)采用循环寻址,新老数据不需要移动位置,但在存储器的位置不明了。 (2)输入数据不要求一定在DARAM中。,65,以上过程,可以用循环缓冲区示意图来说明,如下图所示:,66,实验程序:(实验七) (1)汇编初始化代码(asm_init.asm ): .mmregs .global_asm_init,K_FIR_BFFR,d_data_buffer, COFF_FIR_START .data ;滤波器系数存储在程序存储器里 COFF_FIR_ST

30、ART: .includecoffLPF.inc K_FIR_BFFR .set 53 K_data_buffer_size .set 53;定义滤波器,三、FIR滤波器的DSP实现,67,.bss d_data_buffer, K_data_buffer_size .asgAR1, FIR_DATA_P .text asm_init: PSHMAR1 STM#d_data_buffer, FIR_DATA_P RPTZ A, #K_data_buffer_size-1 STLA, *FIR_DATA_P+ POPMAR1 RET .end,68,;FIR滤波子程序 .mmregs .glob

31、al_FIR,_input_mix,K_FIR_BFFR,d_data_buffer; .globalCOFF_FIR_START .asgAR2,input_mix_P .asgAR3,FIR_DATA_P,69,.text _FIR: ;保护子程序用到的辅助寄存器 FRAME-1 ; 开辟局部帧,保护主函数传递来局部变量 PSHM AR2 PSHM AR3 PSHM ST1 ;ST1含有SXM、FRCT、OVM等控制位。 fir_loop: STM#_input_mix, input_mix_P LD*input_mix_P, A;当前采样值载入到A中 CALLfir ;滤波结果也返回至A

32、中,70,SFTA A,-16;仅输出高16位,FIR函数返回值必须存放在 A的低16位 ;恢复辅助寄存器和原来的运算状态。 POPM ST1 POPM AR3 POPM AR2 FRAME1 RET,71,fir: SSBX OVM;本子程序工作在Q15运算状态。 SSBX SXM SSBX FRCT ;当前采样值已载入到A中,更新滤波器输入缓冲区当前采样值 STM #d_data_buffer,FIR_DATA_P STL A,*FIR_DATA_P;更新滤波器输入缓冲区当前采样值,72,fir_task: XOR A ;A清0 STM #(d_data_buffer+K_FIR_BFFR

33、-1),FIR_DATA_P RPTZ A, #K_FIR_BFFR-1 MACD *FIR_DATA_P-,COFF_FIR_START,A ;MACD寻址要求滤波系数在程序存储器 fir_task_end RET .end,73,FFT运算的DSP实现,74,1、DFT变换对,一、按时间抽取(DIT)的基2 FFT算法,75,2、基2-复数FFT算法原理,其中:,76,3、蝶形运算,运算结构如下:,-1,77,以8点为例:,78,依此类推作N/4点DFT:,-1,W,N,0,X1(0),X1(2),79,80,也即:,可见,第一级蝶形运算没有乘法。,81,最后得到的蝶形图为:,82,(1)

34、第一级,加权系数只有1个 ,没有乘法。 (2)第二级,系数为2个, ,也可以不用乘法计算。 (3)在最后一级(L级),系数为N/2个,,基本规律:每往前一级,系数个数减半系数指数乘2。,4、系数 的规律,83,二、DIT的FFT算法的特点,1、原位运算,输入数据、中间运算结果和最后输出均用同一存储器。,-1,84,在8点蝶形图中可以看出,输出X(k)按正常顺序排列在存储单元,而输入是按顺序: 这种顺序称作倒位序,即下标写成二进制数再按比特位倒过来。 造成这种排列的原因是序列按下标是否奇偶数抽取而引起的,如下图所示。,2、倒位序规律,85,86,3、倒位序实现 在DSP指令,用倒位序寻址实现。,

35、(1)将AR0置N/2;,(2)输入序列的基地址存入ARx;,(3)读ARx指向的单元,然后倒位序寻址ARx+0B, ( 寻址后,ARx+ AR0然后反向进位)。,注:由于x(n)为复数,占用2个存储单元,实现时,将AR0置N;,87,STM #K_FFT_SIZE-1,BRC RPTBD bit_rev_end-1;带延迟的块重复指令, 先执行下面的1条2字指令(STM .) STM #K_FFT_SIZE,AR0 MVDD *ORIGINAL_INPUT+,*REORDERED_DATA+;复制实部 MVDD *ORIGINAL_INPUT-,*REORDERED_DATA+;复制虚部 M

36、AR *ORIGINAL_INPUT+0B;倒位序修改指针,88,三、 FFT应用扩展,1、求IDFT,方法一:根据两者区别 (1)把DFT中的每一个系数 改为 , (2)再乘以常数 1/N 。,89,方法二:完全不需要改动FFT程序,分三步: 将X(k)取共轭(虚部乘以-1) 对 直接作FFT 对FFT的结果取共轭并乘以1/N,得x(n)。,90,2、求实数序列的FFT 以上讨论的FFT算法都是复数运算,包括序列x(n)也认为是复数,但实际存在的信号是实数序列。 如果把实信号可看成虚部为零的复信号(x(n)+j0), 再用FFT求其离散傅里叶变换。这种作法也可以,但很不经济,因为把实序列变成

37、复序列,存储器要增加一倍,且计算机运行时,即使虚部为零,也要进行涉及虚部的运算,浪费了运算量。,91,基二实数FFT运算的算法(四步):,第一步:输入数据的组合和位倒序,2N点实序列,倒位序,组合,N点复序列,92,第二步:N点复数FFT,N点复序列,N点复数FFT,N点,蝶型运算,93,第三步:分离复数FFT的输出为奇部分和偶部分,根据共轭对称性得:,94,第四步:产生2N点的复数FFT输出序列,由于:,所以:,95,四、 RFFT的实现,主程序为rfft.asm,子程序有7个 (1)fft_size.inc:定义复数FFT的点数K_FFT_SIZE和FFT运算级数K_LOGN (2)ini

38、trfft.asm:RFFT程序的初始化程序,定义了有关变量和常数。 (3)bit_rev.asm:倒位序子程序。 (4)fft.asm:N点复数FFT算法子程序。 (5)unpack.asm:N点复数FFT算法输出还原成2N点实数FFT算法输出。 (6)power.asm:求2N点实数FFT算法输出的功率谱。 (7)vectors.asm:中断向量表。,96,数据传送及基本运算,97,一、数据块传送,1、指令,数据存储器数据存储器:,数据存储器MMR:,MVDK Smem,dmad MVKD dmad,Smem MVDD Xmem,Ymem,MVDM dmad,MMR MVMD MMR,dm

39、ad MVMM mmr,mmr,98,MVPD Pmad,Smem MVDP Smem,Pmad READA Smem WRITA Smem,程序存储器数据存储器:,99,2、例题,a20=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,x20=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,y20=?,三个数据存储器中的数组:,两个空间:,程序存储器空间:PROM(2000H2013H),数据存储器空间:DATA(0200H0213H),要求:,x20 y 20,a20 PROM,PROM DATA,初始化数

40、组,已知:,100,.mmregs .def _c_int00 .data TBL: .word 0.19 .word 11 PROM .usect “PROM”,20 .bss a,20 .bss x,20 .bss y,20 DATA .usect “DATA”,20 .text _c_int00 b start nop nop,101,Start: STM #a,AR1 RPT #39 MVPD TBL,*AR1+,STM #x,AR2 STM #y,AR3 RPT #19 MVDD *AR2+,*AR3+,; 将数据存储器中的数组x20复制到数组y20,;初始化数组,102,STM #

41、a,AR1 LD #PROM,A STM #19,AR3 LOOPP:WRITA *AR1+ ADD #1,A,A BANZ LOOPP,*AR3-,;将数据存储器中的a20写入到程序存储器PROM,LD #PROM-1,A STM #DATA,AR1 ST #19,BRC RPTB LOOP2 ADD #1,A,A LOOP2: READA *AR1+,; 读程序存储器PROM中20个数据存入数据存储器DATA,103,二、算术运算(加、减、乘),1定点DSP中数据表示方法 注意:定点DSP芯片的数值表示是基于2的补码表示形式。 数的定标有:Q表示法和S表示法。 Q表示法:16位的数据中,有

42、一个符号位、Q个小数位和15-Q个整数位来表示一个数。,104,表7-10 Q表示、S表示及数值范围,105,DSP定点运算中Q15小数的表示,浮点数(x)与定点数(xq)的转换:,106,216位定点加法和16位定点减法 C54x中提供了多条加法指令: ADD、ADDC、ADDM和ADDS。其中,ADDS用于无符号数的加法运算,ADDC用于带进位的加法运算而ADDM专用于立即数的加法。 C54x中提供了多条减法指令: SUB、SUBB、SUBC和SUBS。其中,SUBS用于无符号数的减法运算,SUBB用于带进位的减法运算,而SUBC为条件减法指令。,107,316位定点整数乘法 C54x中提

43、供了大量的乘法运算指令,其结果都是32位,放在累加器A或B中。 乘数在C54x的乘法指令中很灵活,可以是T寄存器、立即数、存储单元和累加器A或B的高16位。 在C54x中,一般对数据的处理都当做有符号数,如果是无符号数相乘,使用MPYU指令。,108,4Q15定点小数乘法运算 两个16位整数相乘,乘积总是“向左增长”,这就意味着多次相乘后乘积将会很快超出定点器件的数据范围。而且要将32位乘积保存到数据存储器,就要耗费两个机器周期以及两个字的程序和RAM单元。 两个Q15的小数相乘,乘积总是“向右增长”,这就意味着超出定点器件数据范围的将是不太感兴趣的部分。,109,5混合表示法 有些情况下,运

44、算过程中为了既满足数值的动态范围又保证一定的精度,必须采用Q0与Q15之间的表示方法。 加、减运算时,如果两个操作数的定标不一样,在运算前要进行小数点的调整,为保证运算精度,需要使Q值小的数调整为与另一个数的Q值一样大。,110,例题,X1=20,y1=54,x2=0.5,y2=-0.5837,求:,z3=x1*y1,z4=x2*y2,z1=x1+y1,z2=x1-y1,已知:,111,分析:,.titlesuanshu.asm .mmregs .def start,_c_int00 .bss x1,1 .bss x2,1 .bss y1,1 .bss y2,1 .bss z1,1 .bss

45、z2,1 .bss z3_h,1 .bss z3_l,1 .bss z4,1,112,v1.set 014H;20-x1 v2 .set 036H;54 -y1 v3.set 04000H ; 0.5(fraction)-x2 v4.set 00b548H ; -0.5837(fraction)-y2 _c_int00 b start nop nop start: LD #x1 , DP ST #v1 , x1 ST #v2 , y1,113,LDx1 , A ; load x1 - A ADDy1 , A ; A + y1 - A STL A , z1 ; save A(low 16 bit

46、s) -z1 NOP,LDx1 , A SUB y1 , A STLA,z2 NOP,加法:,减法:,114,RSBX FRCT ; 准备整数乘法 LD x1 , T ; x1 - T MPY y1 ,A ; x1*y1 - A (result is 32 bit) STH A , z3_h ; 乘法结果高16位在 z3_h单元中 STLA , z3_l ; 乘法结果低16位在z3_l单元中 NOP,ST #v3 , x2 ST #v4 , y2 SSBX FRCT ; 准备小数乘法 LD x2 , 16 ,A ; load x2 into A (high 16 bits) MPYA y2 ;

47、 x2*y2 - B, and y2 - T STHB , z4 ; 结果在 z4 单元中,小数乘法:,整数乘法:,115,例题,a1=0.1, a2=0.2, a3=-0.3, a4=0.4,求:,已知:,x1=0.8, x2=0.6, x3=-0.4, x4=-0.2,116,分析:,.mmregs .def start,_c_int00 .bss x,4 .bss a,4 .bss y,1 .data table: .word 1*32768/10 .word 2*32768/10 .word -3*32768/10 .word 4*32768/10 .word 8*32768/10 .

48、word 6*32768/10 .word -4*32768/10 .word -2*32768/10,117,.text _c_int00 b start nop nop start: SSBX FRCT STM#0,SWWSR STM #x,AR1 RPT#7 MVPD table,*AR1+ STM #x,AR2 STM #a,AR3 STM#y,AR4 RPTZ A,#3 MAC *AR2+,*AR3+,A STH A,*AR4 done: B done .end,118,在C54x中也没有提供专门的除法指令。 两种方法来完成除法: 一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于除以常数特别适用。 另一种方法是使用条件减法SUBC指令,加上重复指令RPT #15,重复16次减法完成无符号数除法运算。,三、算术运算(除),119,1. 16位无符号整数除法,被除数载入到累加器,除数存储到Smem, SUBC重复执行16次,完成两个16位无符 号整数除法运算。累加器高16位为余数, 低16位为商。,语法:SUBC Smem, src 功能: Else,120,2. 1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论