您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 彭启琮DSP视频教程课件3
第三章DSP的软件结构寻址方式:立即数寻址短立即数寻址(单字指令)在指令字中包括立即操作数RPT#99;将下一条指令循环100次LD#0h,DP;将0装入数据页指针ADD#0ffh,A;将0ffh加给AccA寻址方式:立即数寻址寻址方式:立即数寻址长立即数寻址指令字的后一个字是立即数(双字指令)ADD#1234h,A;将#1234h加给AccA寻址方式:立即数寻址绝对地址寻址数据存储器地址(dmad)寻址:用一个符号或一个数来确定数据空间中的一个地址例:MVKDsample,*AR5sample所代表的就是一个dmad绝对地址寻址程序存储器地址(pmad)寻址:用一个符号或一个数来确定程序地址空间中的一个地址例:MVKDtable,*AR5table所代表的就是一个pmad绝对地址寻址端口地址(PA)寻址用一个符号或常数来确定I/O口地址PORTRPA,SmemPORTWSmem,PA绝对地址寻址*(lk)寻址用一个符号或一个常数来确定数据存储器中的一个地址例:LD*(BUFFER),A把地址为BUFFER的数据单元中的数据装到AccA中累加器寻址用累加器中的数作为一个地址,可用来对存放数据的程序存储器寻址:READASmemWRITASmemREADA,把累加器A所确定的程序存储器单元中的一个字,传送到数据存储器单元Smem中。WRITA,把数据单元Smem中的一个字,传送到累加器A确定的程序存储器单元。存储器映射寄存器(MMR)寻址存储器映射寄存器寻址用来修改存储器映射寄存器而不影响当前数据页指针(DP)或堆栈指针(SP)的值。存储器映射寄存器寻址既可以在直接寻址中使用,又可以在间接寻址中使用。堆栈寻址系统堆栈用来在中断和子程序期间自动存放程序计数器。它也能用来存放额外的数据项或传递数据值。处理器使用一个16-bit的存储器映射寄存器—堆栈指针来对堆栈寻址,它总是指向存放在堆栈中的最后一个元素。寻址方式:直接寻址TMS320C54的数据存储器分为512页,每页128字。设置一个数据页指针DP(DataPointer),用9-bit指向一个数据页,再加上一个7-bit的页内偏移地址,形成16-bit的数据地址LD#4,DP;指向页4(0200h-027Fh)ADD9h,A;将数据页4中地址9h的数据加给AccA寻址方式:直接寻址寻址方式:间接寻址8个辅助寄存器(AR0--AR7),由一个辅助寄存器指针(ARP3-bit)来指定辅助寄存器算术单元(ARAU)作16-bit无符号数运算,决定一个新的地址,装入辅助寄存器中的一个AR0--AR7的内容相当灵活,可以装入立即数,加上立即数,减去立即数;也可以从数据存储器装入地址;还可以作以下的变址寻址:寻址方式:间接寻址寻址方式:间接寻址寻址方式:间接寻址将该AR的内容加1或减1,再寻址(循环常用)将该AR的内容加上或减去AR0的内容,再寻址。将该AR的内容逆向进位加上或减去AR0的内容,再寻址。寻址方式:间接寻址ADD*,8,A;将当前辅助寄存器所指的地址里的数据,左移8-bit后加给AccAADD*+,8,A,AR4;数据左移,加给AccA后,当前辅助寄存器加1,选择辅助寄存器AR4寻址方式:间接寻址ADD*0+,8,A;执行加法后,将AR0的值加给当前辅助寄存器ADD*BR0+,8,A;执行加法后,将AR0的值加给当前辅助寄存器,但反向进位正向进位与反向进位100100+100+100————————1000010位倒序寻址AR0=100AR1=000按AR1寻址后,将AR0加给AR1,反向进位位倒序寻址原序原地址位倒序后地址位倒序0000000010011004201001023011110641000011510110156110011371111117.mmregs.bssx,4,1a0.word012ha1.word3211ha2.wordfe11ha3.wordff03h.sect“program”LD#X,AR1LD#0,A,AR1LD#a0,TMAC*+,ALD#a1,TMAC*+,ALD#a2,TMAC*+,ALD#a3,TMAC*,A33221100300xaxaxaxaxayiii循环寻址许多算法,如卷积,相关和FIR滤波等,都需要在存储器中实现一个循环缓冲器。在这些算法中,一个循环缓冲器就是一个包含了最近的数据的滑动窗口。当新的数据来到时,缓冲器就会覆盖最早的数据。循环缓冲器实现的关键是循环寻址的实现。C54x间接寻址中提供了循环寻址的方式,以%表示。循环寻址定义循环缓冲器大小寄存器(BK)来确定循环缓冲器的大小。用循环缓冲器的有效基地址(EFB)和尾地址(EOB)来组成循环地址。step是加到辅助寄存器,或从辅助寄存器中减去的值。汇编程序语法TMS320的汇编程序包含汇编指令(伪指令,assemblerdirectives)、汇编语言指令(assemblylanguageinstructions)、宏指令(macrodirectives)和注释(comments)。C54的指令既可以是助记符方式,也可以是代数式方式助记符方式汇编程序语法[label][:]mnemonic[operandlist][;comment][标号][:]助记符[操作数][;注释]汇编程序语法所有的语句必须由语句标号、空格、*号或;号开头。语句标号不是必须的,如果用,就必须在第一列。语句中的各部分之间,由一个或多个空格分开。注释不是必须的。注释可以从第一列的*号或;号开头;如果不是从第一列开始,就必须用;号开头。语句标号由字母、数字、_、$组成,最多不超过32个字符,对大小写敏感,第一个字符不能是数字。后跟:,但分号不是语句标号的组成部分。助记符助记符不允许从第一列开始,否则被认为是语句标号。助记符可以是机器指令(如ABS,MPYU,SPH等)、伪指令(如.data,.list,.set等)、宏指令(如.macro,.var,.mexit等)和宏调用。操作数操作数可以是常数、符号或表达式。当操作数多于一个时,用逗号分开。常数二进制常数(如01B或01b)八进制常数(如10Q或10q)十进制常数(如23)十六进制常数(如78H或78h)字符常数(如‘A’或‘b’)字符串(如“sampleprogram”)汇编时使用的常数表达式表达式是一个常数、符号、或用算术运算符连接起来的常数或符号。表达式的值的范围为-32768到32767指令TMS320C54x的指令集有近两百条指令,按功能分为如下几类:算术运算指令逻辑运算指令程序控制指令装入和存储指令算术运算指令加法指令减法指令乘法指令乘加指令乘减指令双数/双精度指令特殊操作指令加法指令减法指令乘法指令乘加和乘减指令乘加(TMS320C50)MACdma,pma程序存储器的值乘以数据存储器的值并累加到ACC(ACC)+(shiftedPregister)-ACC(dma)-TREG(dma)x(pma,addressedbyFPC)-PregisterModifyAR(ARP)andARPasspecified(FPC)+1-FPCMACX0,Y0,AX:(R0)+,X0Y:(R4)+N4,Y0这条指令命令DSP56300将寄存器X0和Y0中的数相乘结果加到AccA中将寄存器R0所指的X存储器地址中的值装入寄存器X0将寄存器R4所指的Y存储器地址中的值装入寄存器Y0R0的值加1寄存器N4的值加给R4逻辑运算指令移位指令测试指令程序控制指令分支指令调用指令中断指令返回指令循环指令堆栈操作指令混合程序控制指令转移指令调用指令中断指令返回指令循环指令堆栈操作指令程序控制指令装入和存储指令一般的装入和存储指令条件存储指令并行装入和存储指令并行装入和乘法指令并行存储和加件乘指令混合装入和存储指令一般的装入指令存贮指令并行装入和乘法指令混合装入和存储指令FIRS指令FIRS指令用于线性相位滤波器的处理。一个如右图的8阶线性相位滤波器的输出表达式FIRS*AR2+,*AR3+,COEFFSy=(c0*x0)+(c1*x1)+(c2*x2)+…+(c6*x6)+(c7*x7)=c0(x0+x7)+c1(x1+x6)+c2(x2+x5)+c3(x3+x4)Viterbi译码指令DADST、DSADT、CMPS在信道均衡和解码中经常会使用到Viterbi算法,C54x为此提供了专门的硬件和指令。根据输入信号确定分支似然概率增加量D1/D2,放在T寄存器中,TRN存储可能信号译码输出。Viterbi译码指令DADST、DSADT、CMPSViterbi译码指令DADST、DSADT、CMPS最小均方运算LMS在进行自适应滤波等操作中经常会使用LMS算法,C54x提供的LMS指令方便了编程。如下图所示的自适应滤波器设计中,滤波器系数修正公式为:最小均方运算LMS)()(10kixwiyNkk基于LMS的自适应滤波程序数据归一化相关指令EXP、NORM归一化一个数是先求其指数,然后把它调整到最大精度格式。实现方法如下:数据块移动MVDD、MVDP、MVPD在C54x系列DSP中,数据与数据存储器、数据与程序存储器之间可以方便的进行数据传输,结合单指令循环可实现数据块移动。如16个系数的移动:并行指令STA,*AR4-||MAC*AR5+,B累加器A中的高位数按原定的位数移动后,存入AR4指定的存储器单元,AR4中的地址减1;AR5指定的存储器单元中的数与T寄存器中的数相乘,其积加到累加器B中,AR5中的地址加1。伪指令(AssemblerDirectives)伪指令为程序提供数据、控制汇编过程。所作的工作包括:将代码和数据汇编到指定的位置。在存储器中为未初始化的变量保留存储空间。控制列表的方式。初始化存储器汇编条件块。定义全局变量。为汇编器指定可以获得宏的库检查符号调试信息段定义伪指令.bss在该段中保留若干字.data汇编入已初始化的数据段.sect“sectionname”汇编入已命名的段.text汇编入可执行的代码段初始化常数伪指令.float初始化一个32-bit的浮点常数.int初始化一个或多个16-bit的整数.string初始化一个或多个字符串.word初始化一个或多个16-bit的整数格式化输出列表的伪指令.list开始源文件列表.nolist停止源文件列表.length设置源文件列表的页长度.title在列表文件每一页打印文件名引用其他文件的伪指令.copy/.include包含其他文件的源语句.global确认一个或多个全局(外部)符号.mlib定义宏库条件汇编伪指令.if/.else/.endif条件汇编代码块.loop/.endloop循环汇编代码块.break终止循环汇编代码块汇编时的符号.equ/.set使一个符号等于一个值.end结束程序宏语言Macro:Auser-definedroutinethatcanbeusedasaninstruction汇编器支持宏语言,使用户可以建立自己的“指令”。当程序要将特定的任务执行若干次时,尤其有用。宏语言可以使用户:定义自己的宏,或重新定义正执行的宏简化长的或复杂的汇编代码访问由归档器建立的宏库在一个宏内定义条件块和可重复的块在一个宏内操作字符串控制展开列表定义宏在程序中使用宏之前,首先必须定义它。可以用两种方法来定义:(1)在源文件或.include/.copy文件中定义(2)在宏库中定义定义宏macname.macro[parameter]modelstatements[.mexit].endm定义宏macname宏的名字.macro是一个伪指令,确认源语句为宏定义的第一行[parameters]选项,作为.macro伪指令的操作数Modelst
本文标题:彭启琮DSP视频教程课件3
链接地址:https://www.777doc.com/doc-8293839 .html