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):存放单指令重复执行次数,实际执行时多1次。
2、例:RPT #10 ;执行?次MVPD table,*AR1+ ;执行功能?注1:RC不能对外访问。注2:单指令重复执行期间,不受理中断。,5,块重复计数器(BRC)、块重复起始地址寄存器(RSA)、块重复结束地址寄存器(REA)。(1)BRC存放一段指令重复执行次数,实际执行时多1次。(2)块重复起始地址(编译自动计算)执行时存入RSA。(3)块重复结束地址(程序中指定)执行时存入REA。(4)块重复执行时,可受理中断。,6,例如:STM #99, BRCRPTB end_block-1 end_block:执行次数: ?从哪里开始:?到哪里结束:?,7,二、条件操作程序,C54x的一些指令
3、只有在满足一个或是多个条件后才被执行,如条件分支转移、条件调用和条件返回等指令。 这些指令都用条件来限制分支转移、调用和返回操作。这些条件可用条件算符来表示。,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,AR0LD #1000H,Azhong: SUB AR0,ABC 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 远调用和远返回指令,21,例3、子程序调用举例,STM #123H,AR0LD
7、 #456H,AR1CALL newLD AR1,16,A new:MPY AR0,AR1,ARET,;将操作数#123H装入AR0;将操作数#456H装入AR1;调子程序new;将AR1的内容左移16位后装入A;AR0与AR1的内容相乘,结果放入A中;子程序返回,22,五、重复操作程序,C54x的重复操作是使CPU重复执行一条指令或一段指令。可以分为单指令重复和块程序重复。,实现重复操作的指令:RPT 重复下条指令; RPTZ 累加器清0,并重复下条指令;RPTB 块重复指令。,使用RPT、RPTZ能重复下一条指令;而RPTB用于重复代码块若干次。利用重复指令可实现比BANZ指令更快的循环程
8、序。,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 STM #x, AR1LD #0, ARPT #7STL A,*AR1+,.bss x, 8 STM #x
9、, AR1,RPTZ A, #7 STL A, *AR1+,注意:, 对x8中的8个元素置0,重复次数为7,即执行1次STL A,AR1+指令后,再重复执行7次;, RPTZ指令设定重复次数后,再对累加器清零。,25,2. 块程序重复操作,对于整个程序块需要重复操作时,可采用程序块重复操作。,用于块程序重复操作指令为RPTB和RPTBD。程序块的长度由块程序重复指令RPTB的操作数来确定,而重复次数由块重复计数器BRC来决定。,通常RPTB的操作数为程序块的结束地址,而重复次数可用STM指令对BRC进行设定。,26,块重复操作的特点:, 程序块的起始地址RSA是RPTB指令的下一行; 块结束地
10、址REA由RPTB指令的操作数规定; 对程序块进行重复操作时,不论程序块多长,重复次数多大,所用的机器周期为0; 与单指令重复操作不同,块重复操作可以响应中断。,块程序重复指令的特点是对任意长程序段的循环开销为0。循环由ST1状态寄存器的块重复标志位(BRAF)和紧跟在ST1状态寄存器后面的存储器映像寄存器控制。,27,循环过程:, 将块重复标志位BRAF置1,激活块程序重复循环; 将一个取值在065535范围里的循环次数N加载到BRC; 块重复指令把块重复的起始地址放在块重复开始地址寄存器RSA中; 块重复指令把块重复的末地址放在块重复结束地址寄存器REA中。,28,例5、对数组x8中的每一
11、元素加1。,.bss x, 8 begin: LD #1,16,BSTM #7,BRCSTM #x,AR4RPTB next-1ADD *AR4,16,B,ASTH A,*AR4+ next: LD #0,B,;设置数组空间 ;立即数1送入BH ;设置重复次数,BRC=7,循环8次 ;数组首地址x送入AR4 ;设置循环结束地址 ;数组数据左移16位与BH相加 ;存入数组结果,并修改地址 ;B清0, 块结束地址REA通常取程序块最后一条指令的下一条指令地址-1; 重复次数为7次 RPTB指令可以响应中断。,注意:,29,六、中断系统,中断系统是DSP应用系统实现实时操作和多任务多进程操作的关键部
12、分。C54x的中断系统根据芯片型号的不同,提供了2430个硬件及软件中断源,分为1117个中断优先级,可实现多层任务嵌套。本节从应用的角度介绍C54x中断系统的基本概念和工作过程。,30,(一)中断系统概述,中断可以由硬件触发或者软件触发,中断信号使TMS320C54x系列的DSP暂停正在执行的程序,并进入中断服务程序(ISP)。,1. 中断分类,可屏蔽中断 不可屏蔽中断,软件中断 硬件中断,31,2. 处理中断的步骤,TMS320C54x DSP处理中断分以下3个步骤: (1) 接收中断请求 通过软件(程序代码)或硬件(引脚或片内外设)请求挂起主程序。如果中断源正在请求一个可屏蔽中断,则当中
13、断被接收到时中断标志寄存器(IFR)的相应位被置1。 (2) 应答中断 TMS320C54x DSP必须应答中断请求。如果中断是可屏蔽的,则依定义条件的满足与否决定 DSP如何应答中断。如果是非屏蔽硬件中断和软件中断,中断应答是立即的。 (3) 执行中断服务程序 一旦中断被应答,执行中断向量地址所指向的分支转移指令,并执行中断服务程序。,32,(二)中断寄存器,1. 中断标志寄存器IFR,中断标志寄存器IFR是一个存储器映像寄存器,当一个中断出现时,IFR中的相应的中断标志位置1,直到CPU识别该中断为止。,C54x中断系统设置两个中断寄存器:中断标志寄存器IFR和中断屏蔽寄存器IMR。,图1
14、 中断标志寄存器IFR,33,中断标志寄存器IFR各位的功能,34,中断屏蔽寄存器是一个存储器映像寄存器,主要用于控制中断源的屏蔽和开放。,当状态寄存器ST1中的INTM位为0时,全局中断允许。IMR中的某位置1时,开放相应的中断。由于RS和NMI都不包含在IMR中,因此IMR对这两个中断不能进行屏蔽。,图2 中断屏蔽寄存器IMR,35,中断屏蔽寄存器IMR各位的功能,36,中断控制主要是屏蔽某些中断,避免其他中断对当前运行程序的干扰,以及防止同级中断之间的响应竞争。,1. 接收中断请求,一个中断可由硬件器件或软件指令提出请求。当产生一个中断时,IFR寄存器中相应的中断标志位被置1。不管中断是
15、否被处理器应答,该标志位都会置1。当相应的中断响应后,该标志位自动被清除。,(三)中断控制,37,外部硬件中断由外部中断口的信号发出请求,而内部硬件中断由片内外设的信号发出中断请求。,(1) 硬件中断请求,C5402硬件中断的请求信号:,外部中断: INT3 INT0引脚;,非屏蔽中断:RS和NMI引脚;,片内中断:BRINT0、BXINT0、BRINT1和BXINT1(串口中断)TINT0、TINT1(定时器中断);DMAC4、DMAC5(DMA中断); HPINT(HPI中断)。,38,软件中断是由程序指令产生的中断请求,主要有3条指令:,(2) 软件中断请求,INTR指令:允许执行任何的
16、可屏蔽中断,包括用户定义的中断 (从SINT0到SINT30);,TRAP指令:与INTR指令相同,但不影响状态寄存器ST1的中断方式(INTM)位;,RESET指令:可在程序的任何时候产生,使处理器返回一个预定状态。,39,对于软件中断和非屏蔽中断,CPU将立即响应,进入相应中断服务程序。对于硬件可屏蔽中断,满足以下3种条件CPU才能响应中断。,2. 中断响应, 当前中断优先级最高。 INTM位清0。 IMR屏蔽位为1。,满足上述条件后,CPU响应中断,终止当前正进行的操作,指令计数器PC自动转向相应的中断向量地址,取出中断服务程序地址,并发出硬件中断响应信号IACK,而清除相应的中断标志位
17、。,40,CPU响应中断后,将进行以下操作:,3. 中断服务程序, 保护现场,将程序计数器PC值压入堆栈; 将中断向量的地址加载到PC; 从中断向量所指定的地址开始取指; 执行分支转移,进入中断服务程序; 执行中断服务程序直到出现返回指令; 从堆栈中弹出返回地址,加载到PC中; 继续执行主程序。,41,4. 保存中断上下文,当执行中断服务程序时,有些寄存器必须保存在堆栈中。当程序从ISR返回时,用户软件代码必须恢复这些寄存器的上下文。使用堆栈操作指令可以将这些寄存器传送到堆栈中,或者从堆栈中取出。PSHM指令:将MMR寄存器中的内容传送到堆栈中; POPM指令:从堆栈中读出的数据传送到MMR寄
18、存器中; PSHD指令:将数据存储器中的数据传送到堆栈;POPD指令:从堆栈中读出的数据传送到数据存储器中。,当保存和恢复上下文时,应考虑如下几点: 当使用堆栈保存上下文时,必须按相反的方向执行恢复; 当恢复ST1寄存器的BRAF位之前,应该恢复BRC位。如果没有按照这个顺序,BRC=0,则BRAF位将被清除。,42,5.中断操作流程,(1)可屏蔽中断操作过程: 设置IFR寄存器的相应标志位; 测试中断响应条件; 当中断响应后,清除相应的标志位,屏蔽其他可屏蔽中断;PC值保存到堆栈中; 分支转移执行中断服务程序; 中断返回,将返回地址从堆栈中弹出给PC; CPU继续执行主程序。,43,(2)非
19、屏蔽中断操作过程: CPU立刻响应该中断,产生中断响应信号; 如果中断是由RS、NMI或INTR指令请求的,则INTM位被置1; 若INTR指令已经请求了一个可屏蔽中断,则相应的标志位 被清零;PC值保存到堆栈中; 分支转移执行中断服务程序; 中断返回,将返回地址从堆栈中弹出给PC; CPU继续执行主程序。,44,中断操作流程图:,45,C系统的堆栈可以完成的主要功能如下: * 分配局部变量; * 传递函数参数; * 保存所调用函数的返回地址; * 保存临时结果。,七、系统堆栈的使用,运行堆栈的增长方向是从高地址到低地址, 即入栈则地址减少,出栈则地址增加。堆栈的管理者是堆栈指针SP。堆栈的容
20、量由链接器(Linker)设定。如:在链接命令文件(.cmd文件)中加入选项-stack 0x1000则堆栈的容量被设为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,SP;初始化SP指针;在链接命令文件中指定未初始化的段:stack :DRAM PAGE 1,47,中断系统,48,一、中断的基本知识,中断类型,中断标志寄存器(
21、IFR)和中断屏蔽寄存器(IMR),49,二、CPU如何执行中断?,对硬件中断的处理,INTM,IMR,对软件中断的处理(三条指令),IFR,INTR K(INTM=1),TRAP K(对INTM不作要求),RESET (INTM=1),50,三、重新映射中断向量地址(三个问题),表7-9中中断号与地址的关系?,中断向量地址如何求得?,为什么硬件复位后中断向量表的起始地址是FF80?,51,FIR滤波器设计,52,一、认识FIR滤波器,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;,目
22、的:求y(n),初步思想:,54,延迟(z-1)的实现(两种方法),二、FIR滤波器的滤波实现,输入信号 x(n)的实现,滤波器系数 h(n)的实现,线性缓冲区法,循环缓冲区法,55,(一) 线性缓冲区法,缓冲区:,顶部为低地址单元,存放最新样本;,缓冲区顶部,最新样本,底部为高地址单元,存放最老样本;,缓冲区底部,最老样本,指针ARx指向缓冲区底部。,ARx,1、方法,56,2、算法,取数、移位和运算:, 以ARx为指针,按x(n-7)x(n)的顺序取数,每取一次数后,数据向下移一位,并完成一次乘法累加运算;, 当经过8次取数、移位和运算后,得y(n);, 求得y(n)后,输入新样本x(n+
23、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,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)=y
24、1=b1x(n-1)+y2,x(n),y(n)=b0x(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), y(n+6), y(n+7),ARx,线性缓冲区法的特点:(1)新老数据在存储器的位置直接明了。(2)输入数据在DARAM中,59,以上过程,可以用N=6的线性缓冲区示意图
25、来说明,如下图所示:,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) ,在数据存储器中;由于延迟操作在一个时钟周期内读一次、写一次,还要求为DARAM.pmad作FIR滤波系数h(n),放在程序存储器中,绝对寻址。这条指令都可以重复执行,成为单周期指令。,62,指令
26、: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,缓冲区:,顶层为低地址单元,存放最新样本;,x(n),底层为高地址单元,存放最老样本;,x(n-7),x(n-1),x(n-2),x(n-3),x(n-4),x(n-5),x(n-6),ARx指向最新样本单元。,
27、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=b0x(n)+0,y(n)=y1=b1x(n-1)+y0,y(n)=y2=b2x(n-2)+y1,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,
28、二、循环缓冲区法,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(n+2)单元, 求y(n+2):,取数顺序:x(n+2)x(n-5),最新样本:x(n+3),ARx:指向x(n+3)单元,循环缓冲区法的特点:(1)采用循环寻址,新老数据不需要移动位置,但在存储器
29、的位置不明了。(2)输入数据不要求一定在DARAM中。,65,以上过程,可以用循环缓冲区示意图来说明,如下图所示:,66,实验程序:(实验七) (1)汇编初始化代码(asm_init.asm ):.mmregs.global _asm_init,K_FIR_BFFR,d_data_buffer, COFF_FIR_START.data ;滤波器系数存储在程序存储器里 COFF_FIR_START: .include “coffLPF.inc“ K_FIR_BFFR .set 53 K_data_buffer_size .set 53 ;定义滤波器,三、FIR滤波器的DSP实现,67,.bss
30、d_data_buffer, K_data_buffer_size.asg AR1, FIR_DATA_P.text asm_init:PSHM AR1STM #d_data_buffer, FIR_DATA_PRPTZ A, #K_data_buffer_size-1STL A, *FIR_DATA_P+POPM AR1RET .end,68,;FIR滤波子程序.mmregs.global _FIR,_input_mix,K_FIR_BFFR,d_data_buffer;.global COFF_FIR_START.asg AR2,input_mix_P.asg AR3,FIR_DATA_P
31、,69,.text _FIR:;保护子程序用到的辅助寄存器FRAME -1 ; 开辟局部帧,保护主函数传递来局部变量PSHM AR2PSHM AR3PSHM ST1 ;ST1含有SXM、FRCT、OVM等控制位。fir_loop:STM #_input_mix, input_mix_PLD *input_mix_P, A;当前采样值载入到A中CALL fir ;滤波结果也返回至A中,70,SFTA A,-16;仅输出高16位,FIR函数返回值必须存放在 A的低16位;恢复辅助寄存器和原来的运算状态。POPM ST1 POPM AR3POPM AR2 FRAME 1 RET,71,fir:SSB
32、X OVM;本子程序工作在Q15运算状态。SSBX SXM SSBX FRCT;当前采样值已载入到A中,更新滤波器输入缓冲区当前采样值 STM #d_data_buffer,FIR_DATA_PSTL A,*FIR_DATA_P ;更新滤波器输入缓冲区当前采样值,72,fir_task:XOR A ;A清0STM #(d_data_buffer+K_FIR_BFFR-1),FIR_DATA_P RPTZ A, #K_FIR_BFFR-1MACD *FIR_DATA_P-,COFF_FIR_START,A;MACD寻址要求滤波系数在程序存储器 fir_task_end RET.end,73,FF
33、T运算的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)第一级,加权系数只有1个 ,没有乘法。(2)第二级,系数为2个, ,也可以不用乘法计算。(3)在最后一级(L级),系数为N/2个,,基本规律:每往前一级,系数个数减半系数指数乘2。,4、系数 的规律,83,二、DIT的FFT算法的特点,1
34、、原位运算,输入数据、中间运算结果和最后输出均用同一存储器。,-1,84,在8点蝶形图中可以看出,输出X(k)按正常顺序排列在存储单元,而输入是按顺序:这种顺序称作倒位序,即下标写成二进制数再按比特位倒过来。造成这种排列的原因是序列按下标是否奇偶数抽取而引起的,如下图所示。,2、倒位序规律,85,86,3、倒位序实现在DSP指令,用倒位序寻址实现。,(1)将AR0置N/2;,(2)输入序列的基地址存入ARx;,(3)读ARx指向的单元,然后倒位序寻址ARx+0B,( 寻址后,ARx+ AR0然后反向进位)。,注:由于x(n)为复数,占用2个存储单元,实现时,将AR0置N;,87,STM #K_
35、FFT_SIZE-1,BRC RPTBD bit_rev_end-1;带延迟的块重复指令,先执行下面的1条2字指令(STM .)STM #K_FFT_SIZE,AR0MVDD *ORIGINAL_INPUT+,*REORDERED_DATA+;复制实部MVDD *ORIGINAL_INPUT-,*REORDERED_DATA+;复制虚部MAR *ORIGINAL_INPUT+0B;倒位序修改指针,88,三、 FFT应用扩展,1、求IDFT,方法一:根据两者区别(1)把DFT中的每一个系数 改为 ,(2)再乘以常数 1/N 。,89,方法二:完全不需要改动FFT程序,分三步: 将X(k)取共轭(
36、虚部乘以-1) 对 直接作FFT 对FFT的结果取共轭并乘以1/N,得x(n)。,90,2、求实数序列的FFT以上讨论的FFT算法都是复数运算,包括序列x(n)也认为是复数,但实际存在的信号是实数序列。 如果把实信号可看成虚部为零的复信号(x(n)+j0), 再用FFT求其离散傅里叶变换。这种作法也可以,但很不经济,因为把实序列变成复序列,存储器要增加一倍,且计算机运行时,即使虚部为零,也要进行涉及虚部的运算,浪费了运算量。,91,基二实数FFT运算的算法(四步):,第一步:输入数据的组合和位倒序,2N点实序列,倒位序,组合,N点复序列,92,第二步:N点复数FFT,N点复序列,N点复数FFT
37、,N点,蝶型运算,93,第三步:分离复数FFT的输出为奇部分和偶部分,根据共轭对称性得:,94,第四步:产生2N点的复数FFT输出序列,由于:,所以:,95,四、 RFFT的实现,主程序为rfft.asm,子程序有7个 (1)fft_size.inc:定义复数FFT的点数K_FFT_SIZE和FFT运算级数K_LOGN (2)initrfft.asm:RFFT程序的初始化程序,定义了有关变量和常数。 (3)bit_rev.asm:倒位序子程序。 (4)fft.asm:N点复数FFT算法子程序。 (5)unpack.asm:N点复数FFT算法输出还原成2N点实数FFT算法输出。 (6)power
38、.asm:求2N点实数FFT算法输出的功率谱。 (7)vectors.asm:中断向量表。,96,数据传送及基本运算,97,一、数据块传送,1、指令,数据存储器数据存储器:,数据存储器MMR:,MVDK Smem,dmad MVKD dmad,Smem MVDD Xmem,Ymem,MVDM dmad,MMR MVMD MMR,dmad 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,
39、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,初始化数组,已知:,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.te
40、xt _c_int00b startnopnop,101,Start:STM #a,AR1RPT #39MVPD TBL,*AR1+,STM #x,AR2STM #y,AR3RPT #19MVDD *AR2+,*AR3+,; 将数据存储器中的数组x20复制到数组y20,;初始化数组,102,STM #a,AR1 LD #PROM,A STM #19,AR3 LOOPP: WRITA *AR1+ ADD #1,A,ABANZ LOOPP,*AR3-,;将数据存储器中的a20写入到程序存储器PROM,LD #PROM-1,A STM #DATA,AR1ST #19,BRCRPTB LOOP2ADD
41、 #1,A,A LOOP2: READA *AR1+,; 读程序存储器PROM中20个数据存入数据存储器DATA,103,二、算术运算(加、减、乘),1定点DSP中数据表示方法注意:定点DSP芯片的数值表示是基于2的补码表示形式。数的定标有:Q表示法和S表示法。Q表示法:16位的数据中,有一个符号位、Q个小数位和15-Q个整数位来表示一个数。,104,表7-10 Q表示、S表示及数值范围,105,DSP定点运算中Q15小数的表示,浮点数(x)与定点数(xq)的转换:,106,216位定点加法和16位定点减法C54x中提供了多条加法指令:ADD、ADDC、ADDM和ADDS。其中,ADDS用于无
42、符号数的加法运算,ADDC用于带进位的加法运算而ADDM专用于立即数的加法。C54x中提供了多条减法指令:SUB、SUBB、SUBC和SUBS。其中,SUBS用于无符号数的减法运算,SUBB用于带进位的减法运算,而SUBC为条件减法指令。,107,316位定点整数乘法 C54x中提供了大量的乘法运算指令,其结果都是32位,放在累加器A或B中。 乘数在C54x的乘法指令中很灵活,可以是T寄存器、立即数、存储单元和累加器A或B的高16位。 在C54x中,一般对数据的处理都当做有符号数,如果是无符号数相乘,使用MPYU指令。,108,4Q15定点小数乘法运算 两个16位整数相乘,乘积总是“向左增长”
43、,这就意味着多次相乘后乘积将会很快超出定点器件的数据范围。而且要将32位乘积保存到数据存储器,就要耗费两个机器周期以及两个字的程序和RAM单元。 两个Q15的小数相乘,乘积总是“向右增长”,这就意味着超出定点器件数据范围的将是不太感兴趣的部分。,109,5混合表示法 有些情况下,运算过程中为了既满足数值的动态范围又保证一定的精度,必须采用Q0与Q15之间的表示方法。 加、减运算时,如果两个操作数的定标不一样,在运算前要进行小数点的调整,为保证运算精度,需要使Q值小的数调整为与另一个数的Q值一样大。,110,例题,X1=20,y1=54,x2=0.5,y2=-0.5837,求:,z3=x1*y1
44、,z4=x2*y2,z1=x1+y1,z2=x1-y1,已知:,111,分析:,.title “suanshu.asm“.mmregs.def start,_c_int00 .bss x1,1 .bss x2,1 .bss y1,1.bss y2,1.bss z1,1.bss 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_int
45、00b start nopnop start: LD #x1 , DP ST #v1 , x1ST #v2 , y1,113,LD x1 , A ; load x1 - A ADD y1 , A ; A + y1 - A STL A , z1 ; save A(low 16 bits) -z1 NOP,LD x1 , A SUB y1 , A STL A,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位
46、在 z3_h单元中 STL A , 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 ; x2*y2 - B, and y2 - T STH B , 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.de
47、f 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.word 6*32768/10.word -4*32768/10.word -2*32768/10,117,.text _c_int00b start nopnop start: SSBX FRCTSTM #0,SWWSRSTM #x,AR1RPT #7MVPD table,*AR1+STM #x,AR2STM #a,AR3STM #y,AR4RPTZ A,#3MAC *AR2+,*AR3+,ASTH A,*AR4 done: B done .end,118,在C54x中也没有提供专门的除法指令。两种方法来完成除法:一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于除以常数特别适用。 另一种方法是使用条件减法SUBC指令,加上重复指令RPT #15,重复16次减法完成无符号数除法运算。,三、算术运算(除),