版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 TMS320C54x汇编语言程序设计,4.1 概述 4.1.1 汇编语言源程序格式 汇编语言程序以.asm为扩展名,可以用任意的编辑器编写源文件。 一条语句占源程序的一行,长度可以是源文件编辑器格式允许的长度,但汇编器每行最多读200个字符。因此,语句的执行部分必须限制在200个字符以内。,4.1.1 汇编语言源程序格式,1. 源文件格式 助记符指令源语句的每一行通常包含4个部分:标号区、助记符区、操作数区和注释区。 助记符指令语法格式: 标号: 助记符 操作数 ; 注释,【例4.1.1】 助记符指令源语句举例。 NANHUA .set 1 ; 符号NANHUA1 Begin: LD
2、#NANHUA,AR1 ; 将1加载到AR1,标 号,助记符,操作数,注 释,1. 源文件格式,语句的书写规则: 所有语句必须以标号、空格、星号或分号(*或;)开始; 标号是可选项,若使用标号,则标号必须从第一列开始; 所有包含有汇编伪指令的语句必须在一行完成指定; 各部分之间必须用空格分开,Tab字符与空格等效;,1. 源文件格式,语句的书写规则: 程序中注释是可选项。如果注释在第一列开始时,前面必须标上星号或分号,在其他列开始的注释前面必须以分号开头; 如果源程序很长,可以在前一行用反斜杠字符()结束,余下部分接着在下一行继续书写。,2.标号,所有汇编指令和大多数汇编伪指令都可以选用标号,
3、供本程序或其它程序调用。 标号必须从语句的第1列写起,其后的冒号“:”可任选; 若不使用标号,则语句的第一列必须是空格、星号或分号; 标号是由字母、数字以及下划线和美元符号等组成,最多可达32个字符; 标号分大小写,且第一个字符不能是数字。,3.助记符,助记符用来表示指令所完成的操作,可以是汇编语言指令、汇编伪指令、宏伪指令。 助记符指令:一般用大写,不能从第一列开始 ; 汇编伪指令:用来为程序提供数据和控制汇编进程。以句号“.”开始,且用小写; 宏伪指令:用来定义一段程序,以便宏调用来调用这段程序。以句号“.”开始,且用小写; 宏调用:用来调用由宏伪指令定义的程序段。,4.操作数,(1) 指
4、令的操作数前缀 汇编器允许指定的常数、符号或表达式作为地址、立即数或间接地址。 作为操作数的前缀有三种情况: 使用“#”符号作为操作数的前缀; 使用“*”符号作为操作数的前缀; 使用“” 符号作为操作数的前缀。,4.操作数,(2) 伪指令的立即数 将“#”加在数值之前而构成的立即数方式,主要用在指令中。 例如: SUB # 18, B ; 操作数#18为立即数 例如: .byte 18 立即数方式没有使用,但汇编器认为操作数是一个数值18(即立即数),用18数值初始化一个字节。,5.注释,用来说明指令功能的文字,便于用户阅读。 注释可位于句首或句尾,位于句首时,以“*”或“;”开始,位于句尾时
5、,以分号“;”开始。 注释可单独一行或数行; 注释是任选项。 11 00000 .bss sym, ; 保留空间于.bss * * 改变段,允许第五个mylab定义 * *,4.1.2 汇编语言中的常数与字符串,汇编器可支持7种类型的常数(常量)。,4.1.3 汇编源程序中的符号,汇编程序中的符号用于标号、常数和替代字符。 由字母、数字以及下划线和美元符号(AZ,az,09,_和$)等组成; 符号名最多可长达200个字符; 在符号中,第1位不能是数字,并且符号中不能含空格。,4.1.3 汇编源程序中的符号,通常,标号是局部变量,在一个文件中局部使用的标号必须是唯一的。 助记符操作码和汇编伪指令
6、名(不带前缀“.”)为有效标号。 标号分大小写。 例如:ABC,Abc,abc是3个不同的符号。,4.1.4 汇编源程序中的表达式,4.1.4 汇编源程序中的表达式,1. 运算符 C54x汇编器使用与C语言相似的优先级。 取正(+)、负()和乘(*)比二进制形式有较高的优先级。 2. 条件表达式 汇编器支持关系运算符,可以用于任何表达式。 = 等于 = = 等于 != 不等于 = 大于或等于 大于 小于,4.1.4 汇编源程序中的表达式,3. 有效定义的表达式 某些汇编器要求有效定义的表达式作为操作数。操作数是汇编时间常数或链接时可重定位的符号。 有效定义的表达式是指表达式中的符号或汇编时间常
7、数在表达式之前就已经被定义。 有效定义的表达式的计算必须是绝对的。,3. 有效定义的表达式,【例4.1.2】 有效定义的表达式。,.data label1 .word 0 .word 1 .word 2 label2 .word 3 X .set 50h goodsym1 .set l00h + X goodsym2 .set $ goodsym3 .set label1 goodsym4 .set label2-label1,; 将16位值0,1,2放入标号为 label1的当前段连续字中,; 有效定义的表达式,; 引用已定义的所有局部标号,; 有效定义的表达式,; 定义X的值,; 将3放入
8、标号为label2的字中,3. 有效定义的表达式,【例4.1.3】无效定义的表达式。,.global Y badsym1 .set Y badsym2 .set 50h + Y badsym3 .set 50h + Z Z .set 60h,; 定义Y为全局外部符号,; Y在当前文件中未定义,; 无效的表达式,; 无效的表达式,Z还未定义,; 定义Z,但应在表达式使用之前,4.1.4 汇编源程序中的表达式,4. 表达式上溢和下溢 汇编时执行了算术操作以后,汇编器检查上溢和下溢的条件。当出现上溢或下溢时,汇编器会发出一个值被截断了的警告。 汇编器不检查乘法的溢出状态。,4.1.4 汇编源程序中的
9、表达式,5. 可重新定位符号和合法表达式 对于绝对符号、可重新定位符号以及外部符号的有效操作,可参见下表。,5. 可重新定位符号和合法表达式,表达式不能包含可重新定位符号和外部符号的乘或除; 表达式中不能含有对其他的段为可重新定位的符号; 用.global伪指令定义为全局的符号和寄存器也可以用在表达式中。这些符号和寄存器被声明为外部符号; 可重新定位的寄存器也可以用在表达式中,这些寄存器的地址相对于定义它们的寄存器段是可重新定位的,除非将它们声明为外部符号。,4.1.5 汇编伪指令(Assembler Directives),汇编器伪指令可完成以下工作: 汇编器伪指令是汇编语言程序的一个重要内
10、容。用于为程序提供数据,并控制汇编程序如何汇编源程序。 将代码和数据汇编进指定的段 为未初始化的变量在存储器中保留空间 控制清单文件是否产生 初始化存储器 汇编条件代码块 定义全局变量 为汇编器指定从中可以获得宏的库 检查符号调试信息,4.1.5 汇编伪指令,1定义段的伪指令(P86) 用于定义相应的汇编语言程序的段。,1定义段的伪指令,【例4.1.4】 段伪指令的使用。(P86),1 * 2 * 开始汇编到.text段 * 3 * 4 000000 .text 5 000000 0001 .word 1,2 000001 0002 6 000002 0003 .word 3,4 000003
11、 0004 7,【例4.1.4】 段伪指令的使用。,8 * 9 * 开始汇编到.data段 * 10 * 11 000000 .data 12 000000 0009 .word 9,10 000001 000A 13 000002 000B .word 11,12 000003 000C 14,【例4.1.4】 段伪指令的使用。,15 * 16 * 开始汇编到命名的初始化段 * 17 * var_defs * 18 * 19 000000 .sect “var_defs” 20 000000 0011 .word 17,18 000001 0012 21,【例4.1.4】 段伪指令的使用。,
12、22 * 23 * 再继续汇编到.data段 * 24 * 25 000004 .data 26 000004 000D .word 13,14 000005 000E 27 000000 .bss sym,19 28 000006 000F .word 15,16 000007 0010 29,【例4.1.4】 段伪指令的使用。,30 * 31 * 再继续汇编到.text段 * 32 * 33 000004 .text 34 000004 0005 .word 5,6 000005 0006 35 000000 usym .usect “xy”,20 36 000006 0007 .word
13、 7,8 000007 0008,【例4.1.5】 段伪指令的使用。,.text初始化值为1,2,3,4,5,6,7,8的字; .data初始化值为9,10,11,12,13,14,15,16的字; var_defs初始化值为17,18的字; .bss保留19个字的空间; .usect保留20个字的空间。 .bss和.usect伪指令既不结束当前的段也不开始新段,它们保留指定数量的空间,然后汇编器开始将代码或数据汇编进当前的段。,4.1.5 汇编伪指令,2初始化常数的伪指令(P87) 用于为当前的段汇编常数值。,2初始化常数的伪指令,3条件汇编伪指令 (P89),用来通知汇编器按照表达式计算出
14、的结果的真假,决定是否对某段代码进行汇编。 有两组伪指令用于条件代码块的汇编: (1) .if/.elseif/.else/.endif伪指令 用于通知汇编器按照表达式的计算结果,对某段代码块进行条件汇编。要求表达式和伪指令必须完全在同一行指定。 (2) .loop/.break/.endloop伪指令 用于通知汇编器按照表达式的计算结果重复汇编一个代码块。要求表达式和伪指令必须完全在同一行指定。,3条件汇编伪指令,4.1.6 宏定义和宏调用,A user-defined routine that can be used as instruction C54x汇编器支持宏指令语言。如果程序中有
15、一段程序需要执行多次,就可以把这一段程序定义(宏定义)为一条宏指令,然后在需要重复执行这段程序的地方调用这条宏指令(宏调用)。利用宏指令,可以使源程序变得简短。 宏的使用分以下3个步骤: 定义宏 在调用宏时,必须首先定义宏; 调用宏 在定义宏之后,可在源程序中调用宏; 扩展宏 在源程序调用宏指令时,汇编器将对宏指令进行扩展。,4.1.6 宏定义和宏调用(P90),1. 宏定义 有两种方法定义宏: 可在源文件的开始定义宏,或者在.include或.copy的文件中定义; 在宏库中定义。 宏库是由存档器以存档格式产生的文件集。 宏库中的每一成员包含一个与成员对应的宏定义。可通过.mlib指令访问宏
16、库。,宏定义的格式(P90),macname .macro parameter 1,parameter n 宏程序语句或宏伪指令 .mexit .endm macname: 宏程序名称,必须将名称放在源程序标号域。 .macro: 用来说明该语句为宏定义的第一行伪指令, 必须放在助记符操作码区域。 parameters: 为任选的替代参数,作为宏指令的操作数。 宏程序语句: 每次宏调用时要执行的指令或汇编命令。 宏伪指令: 用于控制宏指令展开的命令。 .mexit: 相当于一条跳到.endm语句。 .endm: 结束宏定义。,2. 宏调用,在定义宏之后,可在源程序中使用宏名进行宏调用。 宏调用
17、的格式:,label: macname parameter 1,parameter n,标号 任选项,宏指令名 位于操作码区,任选的替代参数 数目应与宏指令定义的相等,3. 宏扩展,若源程序中调用宏指令,则汇编时就将对宏指令进行扩展。 扩展时汇编器先将变量传递给宏参数,按宏定义取代调用宏语句,然后再对源代码进行汇编。 在默认的情况下,扩展宏将出现在清单文件中,若不需要扩展宏出现在清单文件中,则可通过伪指令.mnolist来实现。,4.2 TMS320C54x软件开发过程,C54x的应用软件开发主要完成以下工作: (1) 选择编程语言编写源程序 C54x提供2种编程语言,即汇编语言和C语言。 对
18、于完成一般功能的代码,这两种语言都可使用,但对于一些运算量很大的关键代码,最好采用汇编语言来完成,以提高程序的运算效率。 (2) 选择开发工具和环境 C54x提供了两种开发环境。即非集成开发环境和集成开发环境CCS。,(2) C54x的开发工具,(1)代码生成工具: C编译器:用来将C/C+语言源程序自动编译为C54x的汇编语言源程序。 汇编器:用来将汇编语言源文件汇编成机器语言COFF目标文件。 链接器:将汇编生成的、可重新定位的COFF目标模块组合成一个可执行的COFF目标模块。 文档管理器:允许用户将一组文件(源文件或目标文件)集中为一个文档文件库。,(1)代码生成工具:,助记符指令代数
19、式指令翻译器:用来将包含助记符指令的汇编语言源文件转换成包含代数式指令的汇编语言源文件。 建库实用程序:用来建立用户自己使用的、并用C/C+语言编写的支持运行的库函数。 十六进制转换程序:可以很方便地将COFF目标文件转换成TI、Intel、Motorola等公司的目标文件格式。,(1)代码生成工具:,绝对制表程序:将链接后的目标文件作为输入,生成.abs输出文件。 交叉引用制表程序:利用目标文件生成一个交叉引用清单,列出链接的源文件中的符号以及它们的定义和引用情况。,(2)代码调试工具:,C/汇编语言源码调试器:与软件仿真器、评价模块、软件开发系统、软件仿真器等配合使用。 软件仿真器:是一种
20、模拟DSP芯片各种功能并在非实时条件下进行软件调试的调试工具,它不需目标硬件支持,只需在计算机上运行。 初学者工具DSK:是TI公司提供给初学者进行DSP编程练习的一套廉价的实时软件调试工具。,4.3 汇编语言程序的编辑、汇编和链接过程,汇编语言源程序可以在任何一种文本编辑器中进行。如笔记本、WORD、EDIT、TC等。 当汇编语言源程序编写完成后,还必须经过汇编和链接后才能运行。,汇编语言程序的编辑、汇编和链接过程示意图,4.4 COFF的一般概念,汇编器和链接器生成的目标文件,是一个可以由C54x器件执行的文件。这些目标文件的格式称之为公共目标文件格式(COFF)。 在编写汇编语言程序时,
21、COFF采用代码段和数据段的形式,以便于模块化的编程,使编程和管理变得更加方便。 这些代码段和数据段简称为段。汇编器和链接器提供一些伪指令来建立和管理各种各样的段。,4.4.1 COFF文件的基本单元,1. 段(sections) 段是存储器中占据相邻空间的代码或数据块。一个目标文件中的每个段都是分开的和各不相同的。 COFF目标文件都包含以下3种形式的段: .text 段(文本段),通常包含可执行代码; .data 段(数据段),通常包含初始化数据; .bss 段(保留空间段),通常为未初始化变量保留存储空间。,2. 段的基本类型 COFF目标文件中的段有两种基本类型。 (1) 初始化段 初
22、始化段 初始化段中包含有数据或程序代码。主要有: .text段已初始化段; .data段已初始化段; .sect段已初始化段,由汇编器伪指令建立的自定义段。,(2) 未初始化段 在存储空间中,为未初始化数据保留存储空间。 它包括: .bss段未初始化段; .usect段未初始化段,由汇编命令建立的命名段(自定义段)。,3. 段与目标存储器的对应关系 汇编器的任务:在汇编过程中,根据汇编命令用适当的段将各部分程序代码和数据连在一起,构成目标文件。 链接器的任务:就是分配存储单元,将目标文件中的段重新定位到目标系统的存储器中,这一过程称为定位或分配。,3. 段与目标存储器的对应关系,目标文件中的段
23、与目标存储器之间的关系,.bss,.data,.text,RAM,E2PROM,ROM,4.4.2 汇编器对段的处理,汇编器对段的处理是通过段伪指令来区别各个段的,并将段名相同的语句汇编在一起。 汇编器有5条伪指令可识别汇编语言程序的各个部分: .bss 定义未初始化段 .usect定义未初始化段 .text定义已初始化段 .data定义已初始化段 .sect定义已初始化段,1. 未初始化段 未初始化段就是在C54x存储器中保留空间,通常它们被定位在RAM区。在目标文件中,这些段中没有确切的内容。 未初始化段分为默认的和命名的两种,分别由汇编器伪指令.bss和.usect产生。,(1) .bs
24、s伪指令 用于在bss段中保留若干个空间。 格式: .bss 符号, 字数 符号对应于保留的存储空间第一个字的变量名称。可以让其他段引用,也可以用.global命令定义为全局符号。 字数表示在bss段或标有名字的段中保留若干个存储单元。,(2) .usect伪指令 用于为指定的命名段保留若干个空间。 格式: 符号 .usect “段名”, 字数 段名程序员为未初始化的命名段定义的名字。,2. 已初始化段 已初始化段中包含有可执行代码或初始化数据。 这些段中的内容都在目标文件中,当加载程序时再放到C54x的存储器中。链接器在链接时会自动地处理段间的相互引用。 已初始化段由.text、.data和
25、.sect三个伪指令建立。,2. 已初始化段 已初始化命令的句法: .text 段起点 .data 段起点 .sect “段名”,段起点 段起点是任选项。 若选用,它为段程序计数器SPC定义一个起始值。 若默认,则SPC从0开始。,4.4.2 汇编器对段的处理,当汇编器遇到.text或.data或.sect命令时,将停止对当前段的汇编(相当于一条结束当前段汇编的命令),然后将紧接着的程序代码或数据汇编到指定的段中,直到再遇到另一条.text、.data或.sect命令为止。 当汇编器遇到.bss或.usect命令时,并不结束当前段的汇编,只是暂时从当前段脱离出来,并开始对新的段进行汇编。,3.
26、 命名段(自定义段) 命名段由用户指定,与默认的.text,.data和.bss段的使用相同,但它们被分开汇编。 可用.usect和.sect两个伪指令产生命名段 .usect伪指令产生类似.bss的段,为变量在RAM中保留存储空间。 .sect伪指令产生类似.text和.data的段,可以包含代码或数据。.sect伪指令产生可重新定位地址的命名段。 产生命名段伪指令格式: 符号 .usect “段名”,字数 .sect “段名”,4. 段程序计数器SPC 汇编器为每个段都安排了一个单独的程序计数器称之为段程序计数器SPC。 SPC表示在程序代码或数据段内当前的地址。开始时汇编器将每个SPC置
27、0。当汇编器将程序代码或数据加到段内时,增加相应的SPC值。若再继续对某个段汇编,则相应的SPC就在先前的数值上继续增加。,汇编语言源程序经过汇编后,共建立了5个段: .text段文本段,段内有10个字可执行的程序代码。 .data段已初始化的数据段,段内有7 个字的数据。 .vectors段用.sect命令生成的命名段, 段内有2个字的初始化数据。 .bss段未初始化的数据段,在存储器中为变量保留8个存储单元。 .newvars段用.usect命令建立的命名段, 为变量保留10个存储单元。,4.4.3 链接器对段的处理,链接器是开发C54x器件必不可少的开发工具之一,它对段处理时有2个主要任
28、务: 将一个或多个COFF目标文件中的各种段作为链接器的输入段,经链接后在一个执行的COFF输出模块中建立各个输出段; 在程序装入时对其重新定位,为各个输出段选定存储器地址。,1. 默认的存储器分配,默认的存储器分配: 将所有.text段组合在一起,形成一个.text段,并分配到程序存储器中; 将多个目标文件中的.data段组合在一起,分配到紧接着.text段的程序存储空间中; 将.bss段组合,配置到数据存储器中; 组合命名段。初始化的命名段按顺序分配到紧随.data段的程序存储器,而未初始化命名段将被配置到紧随.bss段的数据存储器中。,默认的存储器分配过程:,.text,.text1,.
29、text2,.data,.data1,.data2,.bss,.bss1,.bss2,table,table_1,table_2,u_vars1,u_vars1,u_vars2,FFT,FFT,没有使用,没有配置,没有配置,没有使用,4.4.4 程序装入,可以采用以下方法装入程序: 使用调试工具转入程序 C54x的调试工具包括软件模拟器,XDS仿真器和集成系统CCS。它们都具有内部的装入器,调用装入器的LOAD命令,装入器将程序复制到目标系统的存储器中。 采用Hex转换工具转入程序 可以使用转换工具Hex500,将可执行COFF目标模块转换成几种其他目标格式文件,然后将转换后的文件通过编程器将
30、程序装(烧)进EPROM。,4.5 FIR滤波器的DSP实现,4.5.1 线性缓冲区法 4.5.2 循环缓冲区法 4.5.3 系数对称FIR滤波器的DSP实现,数字滤波是DSP的最基本应用,利用MAC(乘、累加)指令和循环寻址可以方便地完成滤波运算。两种常用的数字滤波器:FIR(有限冲激响应)滤波器和IIR(无限冲激响应)滤波器的DSP实现。 设FIR滤波器的系数为h(0),h(1), .,h(N-1),X(n)表示滤波器在n时刻的输入,则n时刻的输出为:,其对应的滤波器传递函数为: 如下图所示为横截型(又称直接型或卷积型)FIR数字滤波器的结构图。,横截型FIR数字滤波器的结构图,4.5.1
31、 线性缓冲区法,线性缓冲区法又称延迟线法。其方法是:对于n=N的FIR滤波器,在数据存储器中开辟一个N单元的缓冲区,存放最新的N个样本;滤波时从最老的样本开始,每读一个样本后,将此样本向下移位;读完最后一个样本后,输入最新样本至缓冲区的顶部。 以上过程,可以用N=6的线性缓冲区示意图来说明,如下图所示,N=6的线性缓冲区示意图,4.5.2 循环缓冲区法,图7-12说明了使用循环寻址实现FIR滤波器的方法。对于N级FIR滤波器,在数据存储区开辟一个称为滑窗的具有N个单元的缓冲区,滑窗中存放最新的N个输入样本值。每次输入新的样本时,新的样本将改写滑窗中最老的数据,其他数据则不需要移动。,FIR滤波
32、器循环缓冲区存储器图,用循环缓冲区和双操作数寻址方法编写实现FIR滤波的程序。 1FIR滤波器设计 设计一个FIR低通滤波器,通带边界频率为1500Hz,通带波纹小于1dB;阻带边界频率为2000Hz,阻带衰减大于40dB;采样频率为8000Hz。FIR滤波器的设计可以用MATLAB窗函数法进行。,2产生滤波器输入信号的文件 按照通常的程序调试方法,先用Simulator逐步调试各子程序模块,再用硬件仿真器在实际系统中与硬件仪器联调。使用CCS的Simulator进行滤波器特性测试时,需要输入时间信号x(n)。本例设计一个采样频率Fs为8000Hz,输入信号频率为1000Hz和2500Hz的合
33、成信号,通过设计的低通滤波器将2500Hz信号滤掉,余下1000Hz信号。,3编写FIR数字滤波器的汇编源程序 FIR数字滤波器汇编程序fir.asm如下: *一个FIR滤波器源程序fir.asm* .mmregs .global start .def start,_c_int00 INDEX .set 1 KS.set 256 ;输入样本数据个数 COEF_FIR.sect COEF_FIR;FIR滤波器系数 N .set 17 ;FIR滤波器阶数,.word 0,158,264,-290,-1406,-951,3187,9287,12272 .word9287,3187,-951,-140
34、6,-290,264,158,0 .data INPUT.copy firin.inc;输入数据在数据区0 x2400 OUTPUT .space1024;输出数据在数据区0 x2500 COEFTAB .usectFIR_COEF,N DATABUF.usectFIR_BFR,N BOS.usectSTACK,0Fh TOS.usectSTACK,1 .text .asgAR0,INDEX_P,.asgAR4,DATA_P;输入数据x(n)循环缓冲区指针 .asgAR5,COEF_P;FIR系数表指针 .asg AR6,INBUF_P;模拟输入数据指针 .asgAR7,OUTBUF_P ;F
35、IR滤波器输出数据指针 _c_int00 b start nop nopstart: SSBxFRCT ;小数乘法编程时,设置FRCT(小数方式)位 MVPD#COEF_FIR,*COEF_P+ STM#INDEX,INDEX_P,STM#DATABUF,DATA_P;数据循环缓冲区清零 RPTZA,#N-1 STLA,*DATA_P+ STM#(DATABUF+N-1),DATA_P;数据循环缓冲区指针指向xn-(N-1) STM#COEFTAB,COEF_P STM #COEFTAB,COEF_P;将FIR系数从程序存储器移到数据存储器 RPT #N-1 FIR_TASK: STM#INP
36、UT,INBUF_P STM #OUTPUT,OUTBUF_P,STM#KS-1,BRC RPTBDLOOP-1 STM#N,BK;FIR循环缓冲区大小 LD*INBUF_P+,A;装载输入数据 FIR_FILTER: ;FIR滤波运算 STLA,*DATA_P+%;用最新的样本值替代最旧的样本值 RPTZA,N-1 MAC*DATA_P+0%,*COEF_P+0%,A STHA,*OUTBUF_P+ LOOP: EENDB EEND .end,4编写FIR滤波器链接命令文件 对应以上汇编程序的链接命令文件fir.cmd如下: fir.obj -m fir.map -ofir.out MEMO
37、RY PAGE 0: ROM1(RIX) :ORIGIN=0080H,LENGTH=100H PAGE1:INTRAM1(RW):ORIGIN=2400H,LENGTH=0200H INTRAM2(RW):ORIGIN=2600H,LENGTH=0100H,INTRAM3(RW) :ORIGIN=2700H,LENGTH=0100H B2B(RW):ORIGIN=0070H,LENGTH=10H SECTIONS .text :ROM1PAGE 0 .data : INTRAM1 PAGE 1 FIR_COEF: INTRAM2 PAGE 1 FIR_BFR : INTRAM3 PAGE 1
38、.stack : B2B PAGE 1 ,5CCS集成开发环境下上机操作过程 (1)在CCS上建立fir工程并运行fir.out程序。 (2)观察输入信号的波形及频谱(如图7-137-15所示)。 (3)观察输出信号的波形及频谱(如图7-16、7-17所示 )。,Graph 属性设置窗口,输入信号的时域波形,输入信号的频谱图,滤波器输出信号时域波形,滤波器输出信号频谱图,4.5.3 系数对称FIR滤波器的DSP实现,1在数据存储器中开辟两个循环缓冲区: New循环缓冲区中存放N/2=4个新数据(设N=8);Old循环缓冲区中存放4个老数据。循环缓冲区的长度为N/2。缓冲区指针AR2指向New
39、缓冲区中最新的数据;AR3指向Old 缓冲区中最老的数据,并在程序存储器中设置系数表,如图7-18所示。,2.(AR2)+(AR3)AH(累加器A的高位) (AR2)-1AR2,(AR3)-1AR3 3将累加器B清0,重复执行以下操作N/2次(i=0,1,2,3): (AH)系数ai+(B)B,系数指针(PAR)加1 (AR2)+(AR3)AH,AR2 和AR3减1 并保存或输出结果(结果在BH中)。,4修正数据指针 将AR2和AR3分别指向New缓冲区中最新的数据和Old 缓冲区中最老的数据。用New 缓冲区最老的数据替代Old 缓冲区中最老的数据,如图7-18中箭头所示。Old 缓冲区指针
40、减1。 5输入一个新的数据替代New 缓冲区中最老的数据 重复执行步骤25。,4.6 IIR数字滤波器的DSP实现,IIR数字滤波器的传递函数H(z)为: 其对应的差分方程为: 例如,对于直接形式的二阶IIR数字滤波器,其结构如图7-19所示,编程时,可以分别开辟四个缓冲区,存放输入、输出变量和滤波器的系数,如图7-20所示。,直接形式的二阶IIR数字滤波器,存放输入、输出变量和滤波器系数的缓冲区,【例7-15】设计一个三阶的切比雪夫型带通数字滤波器,其采样频率Fs =16kHz,其通频带3.2kHz5.6kHz为阻带,其衰减大于20dB。 1IIR滤波器的设计 在MATLAB中设计IIR滤波
41、器,程序为: wp=3.2,4.8;ws=2.4,5.6;rp=1;rs=20 n,wn=cheb1ord(wp/8,ws/8,rp,rs) b,a=cheby1(n,rp,wn) 设计结果为:,N=3 wn =0.4000 0.6000 b0=0.0114747a0=1.000000 b1=0 a1=0 b2=-0.034424 a2=2.13779 b3=0 a3=0 b4=0.034424 a4=1.76935 b5=0 a5=0 b6=-0.0114747 a6=0.539758,2产生滤波器输入信号的文件 使用CCS的Simulator进行滤波器特性的测试时,需要输入时间信号x(n)
42、。 #include #include void main() int i; double f256; FILE *fp; if(fp=fopen(iirin.inc,wt)=NULL) printf(cant open file! n); return; ,fprintf(fp,INPUT:.sect %cINPUT %cn,); for(i=0;i=255;i+) fi=sin(2*3.14159*i*4000/16000)+sin(2*3.14159*i*6500/16000); fprintf(fp, .word%1dn,(long)(fi*32768/2); fclose(fp);
43、,该程序将产生名为iirin.inc的输入信号程序,内容如下: INPUT:.sectINPUT .word0 .word25486 .word-15136 .word-314 .word-11585 .word19580 .word6270 .word-30006 .word16383 然后,在DSP汇编语言程序中通过.copy汇编命令将生成的数据文件iirin.inc复制到汇编程序中,作为IIR滤波器的输入数据。,3直接型IIR数字滤波器汇编源程序的编写 直接型IIR数字滤波器汇编程序diir.asm如下: *直接型IIR数字滤波器通用程序* .title diir.asm .mmregs
44、 .globalstart .def start,_c_int00 N .set16 .copy iirin.inc;输入信号x(n)数据 table;IIR滤波器系数 .word 63, 0, -188, 0, 188, 0, -63 .word 0, 11675, 0, 9663, 0, 2948 .data,BN .usect BN,N+1 AN .usect AN,N+1 INBUF .usectINBUF,256;输入缓冲区在数据区0 x2400 OUTPUT .usect OUTPUT,256;输出缓冲区在数据区0 x2600 .text .asgAR0,INDEX_P .asgA
45、R2,XN_P .asgAR3,ACOFF_P .asgAR4,YN_P .asgAR5,BCOFF_P _c_int00 b start nop nop start:SSBXFRCT,SSBX OVM SSBX SXM STM#BN+N,AR1 RPT#N MVPD#table,*AR1-; ;将bi由程序区存放到数据区 STM#AN+N-1,AR1 RPT#N-1 MVPD#table+N+1,*AR1- ;将ai由程序区存放到数据区 STM#OUTPUT,AR1 RPTZA,#255 STL A,*AR1+ ;输出数据缓冲区清零 STM#INBUF,AR1 RPT#255 MVPD#IN
46、PUT,*AR1+ ;将输入数据由程序区,STM#OUTPUT,YN_P STM#INBUF,XN_P STM#N-1,INDEX_P STM#255,BRC RPTB LOOP-1 IIR: SUB A,A STM#BN,BCOFF_P STM#AN,ACOFF_P RPT#N-1;计算前向通道 MAC*XN_P+,*BCOFF_P+,A MAC*XN_P,*BCOFF_P,A,MAR *XN_P-0 ;将AR2指针指向x(n-N) RPT #N-1;计算反馈通道 MAC*YN_P+,*ACOFF_P+,A STHA,*YN_P-0;保存y(n) LOOP: EEND B EEND .end
47、,4IIR滤波器链接命令文件的编写 对应以上汇编程序的链接命令文件diir.cmd如下: diir.obj -o diir.out -m diir.map MEMORY PAGE 0: ROM: ORIGIN=0080H, LENGTH=1000H PAGE 1: SPRAM: ORIGIN=0060H,LENGTH=0020H DARAM: ORIGIN=0080H, LENGTH=1380H RAM1: ORIGIN=2400H, LENGTH=0200H RAM2: ORIGIN=2600H, LENGTH=0200H SECTIONS, .text:ROM PAGE 0 .data:DARAM PAGE 1 BN:DARA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水上围堰施工安全技术方案
- 汽车零部件厂环保规则
- 社区公共服务设施适老化设计指南
- 智能家居技术专业人才培养方案
- 小学综合实践活动教学实施方案
- 企业服务供应商管理办法
- 流域总氮治理水质预警方案
- 旅居康养服务项目申请报告
- 楼宇电气设备维护培训
- 美丽城乡传统风貌改造提升方案
- 安全生产考核巡查办法
- 机器人中小学科普
- 气瓶检验知识培训心得
- 盘式制动器拆装课件
- 塑胶-塑胶件控制计划
- DBJT15-189-2020 广东省公共厕所设计标准
- 辽宁省病历书写基本规范
- 环境科学与工程专业职业生涯规划书4100字数
- T/CECS 10209-2022给水用高环刚钢骨架增强聚乙烯复合管材
- (中级)四级有机合成工职业技能鉴定理论考试题库(含答案)
- 暖气维修施工方案
评论
0/150
提交评论