基于泰勒级数算法正弦信号的C54实现.docx
《基于泰勒级数算法正弦信号的C54实现.docx》由会员分享,可在线阅读,更多相关《基于泰勒级数算法正弦信号的C54实现.docx(36页珍藏版)》请在冰点文库上搜索。
![基于泰勒级数算法正弦信号的C54实现.docx](https://file1.bingdoc.com/fileroot1/2023-5/25/462ab57a-e28c-424e-a138-9c62f5bd9795/462ab57a-e28c-424e-a138-9c62f5bd97951.gif)
基于泰勒级数算法正弦信号的C54实现
课程实训说明书
名称DSP原理与应用课程设计
课程设计任务书
课程名称:
DSP原理与应用课程设计
起讫时间:
2013年1月7日至2013年1月11日共1周
院系:
电子信息工程学院
班 级:
通信工程
指导教师:
系主任:
课程设计课题
基于泰勒级数算法正弦信号的C54实现
一、课程设计要求
1.掌握CCS集成开发环境的使用方法。
2.理解正弦信号的泰勒级数算法的原理。
3.理解实现正弦信号的软件程序流程。
4.调试程序,生成相应的正弦波数据。
5.利用CCS集成开发环境的软件作图程序,生成正弦波形。
6.将结果向指导教师演示,由教师提问验收通过;
7.打印程序清单,撰写程序说明,完成课程设计报告书,进行分组讨论设计心得。
二、课程设计工作量
1.周一:
明确课程设计任务和目标,从理论上理解设计的原理。
2.周二:
明确设计指标,调试程序,记录得到的数据。
3.周三、周四:
学生演示设计结果,教师提问评分。
4.周四、五:
打印程序清单,撰写程序说明,完成课程设计报告书。
三、课程设计说明书内容
1,掌握CCS集成开发环境的使用方法
项目建立、程序加载、调试的步骤
2,正弦函数泰勒级数算法的原理
3,软件设计、调试过程
4,软件清单与注释
5,设计心得与体会
目录
第一章DSP芯片介绍3
1.1DSP芯片的原理3
1.2DSP芯片的基本结构、原理和功能3
1.3TMS320C54xDSP芯片介绍11
1.4用DSP实现基本的函数运算方法7
1.4.1、查表法9
1.4.2、泰勒级数展开法9
第二章CCS集成开发环境10
2.1css集成开发环境10
2.2建立工程文件15
2.3在工程中添加删除文件16
2.4编辑源程序16
2.5编辑与调试16
2.5.1断点设置17
2.5.2断点的删除17
2.5.3允许和禁止断点18
第三章系统程序设计20
3.1编写汇编程序sin.asm(附代码)20
3.2编写链接命令文件sin.cmd(附代码)20
3.3编写复位向量文件sin_v.asm(附代码)22
3.4在CCS中生成项目,编译,调试22
第四章实验结果27
4.1.参数设置27
4.2.结果图27
4.3.实验分析28
第五章总结与心得29
参考文献30
附录31
附录一31
附录二32
附录三33
第一章DSP芯片介绍
1.1DSP芯片的原理
数字信号处理(简称DSP)是一门涉及多门学科并广泛应用于很多科学和工程领域的新兴学科。
数字信号处理是利用计算机或专用处理设备,以数字的形式对信号进行分析、采集、合成、变换、滤波、估算、压缩、识别等加工处理,以便提取有用的信息并进行有效的传输与应用。
数字信号处理是以众多学科为理论基础,它所涉及的范围极其广泛。
如数学领域中的微积分、概率统计、随机过程、数字分析等都是数字信号处理的基础工具。
它与网络理论、信号与系统、控制理论、通信理论、故障诊断等密切相关。
DSP可以代表数字信号处理技术(DigitalSignalProcessing),也可以代表数字信号处理器(Digital Signal Processor)。
前者是理论和计算方法上的技术,后者是指实现这些技术的通用或专用可编程微处理器芯片。
数字信号处理包括两个方面的内容:
1.法的研究2.数字信号处理的实现
1.2DSP芯片的基本结构、原理和功能
数字信号处理器(DSP)是一种特别适合于进行数字信号处理运算的微处理器,主要用于实时快速实现各种数字信号处理的算法。
在20世纪80年代以前,由于受实现方法的限制,数字信号处理的理论还不能得到广泛的应用。
直到20年及80年代初,世界上第一块单片可编程DSP芯片的诞生,才使理论研究成果广泛应用到实际的系统中,并且推动了新的理论和应用领域的发展。
可以毫不夸张地讲,DSP芯片的诞生及发展对近20年来通信、计算机、控制等领域的技术发展起到十分重要的作用。
数字信号处理不同于普通的科学计算与分析,它强调运算的实时性。
除了具备普通微处理器所强调的高速运算和控制能力外,针对实时数字信号处理的特点,在处理器的结构、指令系统、指令流程上作了很大的改进,其主要特点如下:
1.采用哈佛结构
DSP芯片普遍采用数据总线和程序总线分离的哈佛结构或改进的哈佛结构,比传统处理器的冯·诺伊曼结构有更快的指令执行速度。
(a)冯·诺伊曼(VonNeuman)结构
该结构采用单存储空间,即程序指令和数据共用一个存储空间,使用单一的地址和数据总线,取指令和取操作数都是通过一条总线分时进行。
当进行高速运算时,不但不能同时进行取指令和取操作数,而且还会造成数据传输通道的瓶颈现象,其工作速度较慢。
(b)哈佛(Harvard)结构
该结构采用双存储空间,程序存储器和数据存储器分开,有各自独立的程序总线和数据总线,可独立编址和独立访问,可对程序和数据进行独立传输,使取指令操作、指令执行操作、数据吞吐并行完成,大大地提高了数据处理能力和指令的执行速度,非常适合于实时的数字信号处理。
微处理器的哈佛结构如图1.2.2所示。
(c)改进型的哈佛结构
改进型的哈佛结构是采用双存储空间和数条总线,即一条程序总线和多条数据总线。
其特点如下:
①允许在程序空间和数据空间之间相互传送数据,使这些数据可以由算术运算指令直接调用,增强芯片的灵活性
②提供了存储指令的高速缓冲器(cache)和相应的指令,当重复执行这些指令时,只需读入一次就可连续使用,不需要再次从程序存储器中读出,从而减少了指令执行作需要的时间。
如:
TMS320C6200系列的DSP,整个片内程序存储器都可以配制成高速缓冲结构。
2.采用多总线结构
DSP芯片都采用多总线结构,可同时进行取指令和多个数据存取操作,并由辅助寄存器自动增减地址进行寻址,使CPU在一个机器周期内可多次对程序空间和数据空间进行访问,大大地提高了DSP的运行速度。
如:
TMS320C54x系列内部有P、C、D、E等4组总线,每组总线中都有地址总线和数据总线,这样在一个机器周期内可以完成如下操作:
从程序存储器中取一条指令;
从数据存储器中读两个操作数;
向数据存储器写一个操作数。
3.采用流水线技术
利用这种流水线结构,加上执行重复操作,就能保证在单指令周期内完成数字信号处理中用得最多的乘法-累加运算。
如:
4.配有专用的硬件乘法-累加器
为了适应数字信号处理的需要,当前的DSP芯片都配有专用的硬件乘法-累加器,可在一个周期内完成一次乘法和一次累加操作,从而可实现数据的乘法-累加操作。
如矩阵运算、FIR和IIR滤波、FFT变换等专用信号的处理。
5.具有特殊的DSP指令
为了满足数字信号处理的需要,在DSP的指令系统中,设计了一些完成特殊功能的指令。
如:
TMS320C54x中的FIRS和LMS指令,专门用于完成系数对称的FIR滤波器和LMS算法。
6.快速的指令周期
由于采用哈佛结构、流水线操作、专用的硬件乘法器、特殊的指令以及集成电路的优化设计,使指令周期可在20ns以下。
如:
TMS320C54x的运算速度为100MIPS,即100百万条/秒。
7.硬件配置强
新一代的DSP芯片具有较强的接口功能,除了具有串行口、定时器、主机接口(HPI)、DMA控制器、软件可编程等待状态发生器等片内外设外,还配有中断处理器、PLL、片内存储器、测试接口等单元电路,可以方便地构成一个嵌入式自封闭控制的处理系统。
8.支持多处理器结构
为了满足多处理器系统的设计,许多DSP芯片都采用支持多处理器的结构。
如:
TMS320C40提供了6个用于处理器间高速通信的32位专用通信接口,使处理器之间可直接对通,应用灵活、使用方便;
9.省电管理和低功耗
DSP功耗一般为0.5~4W,若采用低功耗技术可使功耗降到0.25W,可用电池供电,适用于便携式数字终端设备。
1.3TMS320C54xDSP芯片介绍
TMS320C54x(简称’C54x)是TI公司为实现低功耗、高速实时信号处理而专门设计的16位定点数字信号处理器,采用改进的哈佛结构,具有高度的操作灵活性和运行速度,适应于远程通信等实时嵌入式应用的需要,现已广泛地应用于无线电通信系统中。
CPU
1、先进的多总线结构。
2、40位算术逻辑运算单元(ALU),包括1个40位桶形移位寄存器和2个独立的40位累加器。
3、17位*17位并行乘法器,与40位专用加法器相连,用与非流水线式单周期乘法/累加(MAC)运算。
4、比较、选择、存储单元(CSSU),用于加法/比较选择。
5、指数编码器,可以在单个周期内计算40位累加器中数值的指数。
6、双地址生成器,包括8个辅助寄存器和2个辅助寄存器算术运算单元(ARAU)。
存储器
1、192K字可寻址存储空间(64K字程序存储器、64K字数据存储器以及64K字I/O空间),在’C548和’C549中存储空间可扩展至8M字。
2、片内ROM,可配置为程序/数据存储器。
3、片内双寻址RAM(DARAM)。
4、片内单寻址RAM(SARAM)(仅’C548和’C549)。
指令系统
1、单指令重复和块指令重复操作。
2、块存储器传送指令。
3、32位长操作数指令。
4、同时读入2或3个操作数的指令。
5、能并行存储和并行加载的算术指令。
6、条件存储指令。
7、从中断快速返回。
在片外围电路
1、软件可编程等待状态发生器。
2、可编程分区转换逻辑电路。
3、带有内部振荡器或用外部时钟源的片内锁相环(PLL)时钟发生器。
4、全双工串行口,支持8位或16位传送(仅’C541、’LC545和’LC546)。
5、时分多路(TDM)串行口(仅’C542、’C543、’C546、’C548和’C549)。
6、缓冲串行口(BSP)(仅’C542、’C543、’C545、’C546、’C548和’C549)。
7、16位可编程定时器。
8、8位并行主机接口(HPI)(’C542、’C545、’C548和’C549)。
9、外部总线关断控制,以断开外部的数据总线、地址总线和控制信号。
10.据总线具有总线保持器特性。
电源
1、可用IDLEI、IDLE2和IDLE3指令控制功耗,以工作在省电方式。
2、CLKOUT输出信号可以关断。
在片坊真接口
具有符合IEEE1149.1标准的在片坊真接口。
速度
单周期定点指令的执行时间为25/20/15/12.5/10ns(40/50/66/80/10/MIPS)。
1.4用DSP实现基本的函数运算方法
在通信、仪器和控制等领域的信号处理系统中,可能会用到正弦发生器。
一般,产生正弦波的方法有两种:
1.4.1、查表法
此中方法用于对精度要求不是很高的场合。
如果要求精度高,表就很大,相应的存储器容量也要增大。
1.4.2、泰勒级数展开法
这是一种更为有效的方法。
与查表法相比,需要的存储单元很少,而且精度很高。
一个角度θ的正弦和余弦函数,都可以展开成台劳级数,取其前5项进行近似:
Sinθ=x-x3/3!
+x5/5!
-x7/7!
+x9/9!
=x(1-x2/2*3(1-x2/4*5(1-x2/6*7(1-x2/8*9)))
Cosθ=1-x2/2!
+x4/4!
-x6/6!
+x8/8!
=1-x2/2!
(1-x2/3*4(1-x2/5*6(1-x2/7*8)))
上式中的X为θ的弧度值。
也可以有递推公式求正弦和余弦值:
Sinnθ=2cosθ*sin(n-1)θ-sin(n-2)θ
Cosnθ=2cosθ*cos(n-1)θ-cos(n-2)θ
利用递推公式计算正弦和余弦值需已知Cosθ和正、余弦的前两个值。
用这种方法,求少数点还可以,如产生连续正弦、余弦波,则积累误差太大,不可取。
第二章CCS集成开发环境
2.1css集成开发环境
利用CCS集成开发环境,用户可以在一个开发环境下完成工程定义、程序编辑、编译链接、调试和数据分析等工作环节.使用CCS开发应用程序的一般步骤为:
(1)打开或创建一个工程文件.工程文件中包括源程序(C或汇编)、目标文件、库文件、连接命令文件和包含文件.
(2)编辑各类文件.如头文件(.h文件),命令文件(.cmd文件)和源程序(.c,.asm文件)等.可以使用一般的编辑软件或CCS集成编辑环境进行各类文件编辑.
(3)对工程进行编译.如果有语法错误,将在构建(Build)窗口中显示出来.用户可以根据显示的信息定位错误位置,更改错误.
(4)排除程序的语法错误后,用户可以对计算结果/输出数据进行分析,评估算法性能.CCS提供了探针、图形显示、性能测试等工具来分析数据、评估性能.
图中为一个典型的CCS集成环境窗口示例.整个窗口由主菜单、工具条、工程窗口、编辑窗口、图形显示窗口、内存单元显示窗口和寄存器显示窗口等构成.
2.2建立工程文件
CCS采用工程文件来集中管理一个工程.一个工程包括源程序、库文件、链接命令文件和头文件等,它们按照目录树的结构组织在工程文件中.工程构建(编译链接)完成后生成可执行文件.工程视窗显示了工程的整个内容.例如图2-4显示了工程codec_eg.mak所包含的内容.其中Include文件夹包含源文件中以”.include”声明的文件,Libraies文件夹包含所有后缀为”.lib”的库文件,Source文件夹包含所有后缀为”.c”和”.asm”的源文件.文件夹上的”+”符号表示该文件夹被折叠,”-“表示该文件夹被展开.
命令ProjectNew用于创建一个新的工程文件(后缀为”.mak”),此后用户就可以编辑源程序、链接命令文件和头文件等,然后加入到工程中.工程编译链接后产生的可执行程序后缀为”.out”.
命令ProjectOpen用于打一个已存在的工程文件.例如用户打开位于”c:
\ti\c5400\dsk\
examples\dsp”目录下的codec_eg.mak工程文件时,工程中包含的各项信息也被载入,其工程窗口。
如下图所示。
2.3在工程中添加删除文件
以下任一操作都可以添加文件到工程中:
选择命令ProjectAddFiletoProject…
在工程视图中右键单击调出关联菜单,选择AddFile…
在工程中源文件、链接命令文件及库文件(Libraries)需要用户指定加入,头文件(Include文件)通过扫描相关性(ScanAllDependencies)自动加入到工程中.
在工程视图中右键单击某文件,从关联莱单中选择”Removefromproject”可以从工程中删除此文件.
2.4编辑源程序
CCS集成编辑环境可以编辑任何文本文件(对C程序和汇编程序),可以打开多个窗口或对同一文件打开多个窗口,进行多窗口显示.点击主莱单命令FileNewSourceFile弹出编辑窗口进行编辑.
2.5编辑与调试
A,载入可执行程序:
命令FileLoadProgram载入编译链接好的可执行程序.用户也可以修改”ProgramLoad”属性,使得在构建工程后自动装入可执行程序.设置方法为选择命令OptionsProgramLoad.
B,使用反汇编工具:
在某些时候(例如调试C语言关键代码),用户可能需要深入到汇编指令一级.此时可以利用CCS的反汇编工具.用户的执行程序(不论是C程序或是汇编程序)载入到目标板或仿真器时,CCS调试器自动打开一个反汇编窗口.如下图所示.
C,断点:
2.5.1断点设置
有两种方法可以增加一条断点.
(1)使用断点对话框
选择命令DebugBreakpoints将弹出对话框如图2-7所示.在”BreakpointType”栏中可以选择”无条件断点(BreakatLocation)”或”有条件断点(BreakatLocationifexpressionisTRUE)”.在”Location”栏中填写需要中断的指令地址.用户可以观察反汇编窗口,确定指令所处地址.对C代码,由于一条C语句可能对应若干条汇编指令,难以用唯一地址确定位置.为此可以采用”filenamelinelineNumber”的形式定位源程序中的一条C语句.断点类型和位置设置完成后,依次单击”Add”和”OK”按钮即可.断点设置成功后,该语句条用彩色光条显示.
(1)采用工程工具条
将光标移到需要设置断点的语句上,点击工程工具条上的”设置断点”按钮.则该语句位置一断点,默认情况下为”无条件断点”.用户也可以使用断点对话框修改断点属性,例如将”无条件断点”改为”有条件断点”.
2.5.2断点的删除
在图2-7所示断点对话框中,单击”Breakpoint”列表中的一个断点,然后点击”Delete”按钮可
删除此断点.点击”Deleteall”按钮或工程工具条上的”取消所有断点”按钮,将删除所有断点.
2.5.3允许和禁止断点
在图2-7所示断点对话框中,单击”EnableAll”或”DisableAll”将允许或禁止所有断点.”允许”状态下,断点位置前的复选框有”对勾”符号.注意只有当设一断点,并使其”允许”时,断点才发挥作用.
设置断点对话框(下页)
D,查看、编辑内存
CCS允许显示特定区域的内存单元数据.方法为选择ViewMemory或单击调试工具条上的”显示内存数据”按钮.在弹出对话框中输入内存变量名(或对应地址)、显示方式即可显示指定地址的内存单元.为改变内存窗口显示属性(如数椐显示格式,是否对照显示等),可以在内存显示窗口中单击右键,从关联莱单中选择Properties即弹出选项对话框.
内存窗口选项包括以下内容:
(1)Address:
输入需要显示内存区域的起始地址.
(2)QValue:
显示整数时使用的Q值(定点位置).新的整数值=整数/2Q.
(3)Format:
从下拉菜单中选取数据显示的格式.
(4)UseIEEEFloat:
是否使用IEEE浮点格式.
(5)Page:
选择显示的内存空间类型-程序、数据或I/O.
(6)EnableReferenceBuffer:
选择此检查框将保存一特定区域的内存快照以便用于比较.
(7)StartAddress:
用户希望保存到参考缓冲区(ReferenceBuffer)的内存段的起始地址.只有当用户选中”EnableReferenceBuffer”检查框时此区域才被激活.
(8)EndAddress:
用户希望保存到参考缓冲区的内存段的终止地址.只有当用户选中”EnableReferenceBuffer”检查框时此区域才被激活.
(9)UpdateReferenceBufferAutomatically:
若选择此检查框,则参考缓冲区的内容将自动被内存段(由定义参考缓冲区的起始/终止地址所规定的区域)的当前内容覆盖.
第三章系统程序设计
3.1编写汇编程序sin.asm(附代码)
;ThisfunctiongeneratesthesinewaveofangleusingtheTaylorseriesexpansion
;sin(theta)=x(I-x2/2*3(1-x'2/4*5(1-x2/6*7(1-x'2/8*9))))
;cos(theta)=1-x2/2(1-x2/3*4(1-x2/5*6(1-x'2/7*8)))
;sin(2*theta)=2*sin(theta)*cos(theta)
.title"sin.asm"
.mmregs
.defstart
;.refd_xs,d_sinx,d_xc,d_cosx
;.refsinx,d_xs,d_sinx,cosx,d_xc,d_cosx
sin_x:
.usect"sin_x",360
STACK:
.usect"STACK",10
k_theta.set286;theta=pi/360(0.5deg.)
PA0.set0
start:
.text
STM#STACK+10,SP
STMk_theta,AR0;ARO-->ktheta(increment)
STM0,AR1;(ARl)=x(rad.)
STM#sin_x,AR6;AR6-->sinx
STM#90,BRC;formsinO(deg.)sin90(deg.)
RPTBloop1-1
LDMAR1,A
LD#d_xs,DP
STLA,@d_xs
STLA,@d_xc
CALLsinx;(dsinx)=sin(x)
CALLcosx;(dcosx)=cos(x)
LD#d_sinx,DP
LD@d_sinx,16,A;A=sin(x)
MPYA@d_cosx;B=sin(x)*cos(x)
STHB,1,*AR6+;AR6-->2*sin(x)*cos(x)
MAR*AR1+0
loop1:
STM#sin_x+89,AR7;sin91(deg.).-sin179(deg.)
STM#88,BRC
RPTBloop2-1
LD*AR7-,A
STLA,*AR6+
loop2:
STM#179,BRC;sin180(deg.)sin359(deg.)
STM#sin_x,AR7
RPTBloop3-1
LD*AR7+,A
NEGA
STLA,*AR6+
loop3:
STM#sin_x,AR6;generatesinwave
STM#1,AR0
STM#360,BK
loop4:
PORTW*AR6+0%,PA0
Bloop4
sinx:
.defd_xs,d_sinx
.data
table_s.word01c7h;c1=1/(8*9)
.word030bh;c2=1/(6*7)
.word0666h;c3=1/(4*5)
.word1556h;c4=1/(2*3)
d_coef_s.usect"coef_s",4
d_xs.usect"sin_vars",1
d_squr_xs.usect"sin_vars",1
d_temp_s.usect"sin_vars",1
d_sinx.usect"sin_vars",1
c_1_s.usect"sin_vars",1
.text
SSBXFRCT
STM#d_coef_s,AR5
RPT#