1402121170吴江平小实验剖析.docx
《1402121170吴江平小实验剖析.docx》由会员分享,可在线阅读,更多相关《1402121170吴江平小实验剖析.docx(44页珍藏版)》请在冰豆网上搜索。
1402121170吴江平小实验剖析
西安电子科技大学
DSP技术及应用实验小作业
学院电子工程学院
专业模式识别与智能系统
学号1402121170
学生姓名吴江平
授课老师郭万有
实验一VISUALDSP++的使用入门
实验目的:
本次实验主要目的是熟悉VISUALDSP++的开发环境。
针对ADSP-TS201,利用几个用C、C++和汇编语言写成的简单例子来描述VISUALDSP++编程环境和调试器(debugger)的主要特征和功能。
Part1C语言代码的性能评估实验
实验步骤:
1、打开VisualDSP++,并新建一个工程文件,命名为”test1_1”,保存路径选择”D:
\DSP\”。
2、新建C语言源程序文件,命名为”dotprod.c”。
3、若工程中源程序文件夹(SourseFiles)中默认新建了.c文件,请先删除,然后再将新建的dotprod.c语言源程序文件添加到新建的工程文件中。
4、编译C语言源程序文件,分析输出窗口的错误并纠正,直至文件编译通过,输出窗口显示“Buildcompletedsuccessfully”。
5、新建一个调试会话(Session),按照下表进行调试会话的属性设置。
域
选择值
DebugTarget
ADSP-TS20xFamilySimulator
Platform
ADSP-TS201Rev.0.0SingleProcessorSimulator
SessionName
ADSP-TS201ADSP-TS201Rev.0.0SingleProcessorSimulator
Processor
ADSP-TS201ADSP-TS201Rev.0.0SingleProcessorSimulator
或
域
选择值
Processor
TigerSHARC--->ADSP-TS201
ConnectionType
EZ-KITLite(评估板调试),Emulator(仿真器仿真),Simulator(软件仿真)
Platform
ADSP-TS201Rev.1.x/2.xSingleProcessorSimulator
SessionName
选择Platform后默认即可(也可修改)
6、编译整个工程,(首次编译需要先选择调试会话(Session)对象,选择新建Session对象即可),输出窗口无错误信息提示则整个工程编译连接通过。
7、在整个工程编译完成后,环境已经自动进入调试状态,选择运行(Run)工程,程序将被执行,其输出结果在Outputwindow中显示。
用VisualDSP++调试时,调试器会自动调入工程的.dxe可执行文件,并打开相应的窗口(调试器的输出窗口、反汇编窗口和源代码窗口等),源代码窗口中,箭头所指为当前执行指令,红圆圈代表设定的断点位置。
当调试器加载C程序时,会自动设置两个断点,分别在代码执行的开头和结尾。
8、新建代码性能分析器(LinearProfiling)工具,程序评估函数a_doc_b,a_doc_c,a_doc_d的性能。
(注意在LinearProfiling窗口点击右键选择Properties然后在filter选项卡中设置要分析的程序段的起始地址或函数,在LinearProfiling窗口点击右键选择ViewExecution…切换性能分析结果的显示方式(百分比或计数器)。
9、将ProjectOptions中的编译器设置将代码优化功能选中(ProjectCompileGeneral选中Enableoptimization),重新编译和链接程序后,对上面的三个子函数的运行性能重新进行评估,对比优化前和优化后的区别,考虑其原因。
(提示:
显示结果要采用计数器的显示方式才能区分两者的差别)。
实验结果:
(a)程序运行结果
(b)代码优化前a_doc_b,a_doc_c,a_doc_d三个子函数的性能值(Count值和百分值)
(c)代码优化后a_doc_b,a_doc_c,a_doc_d三个子函数的性能值(Count值和百分值)
实验结果分析:
从图中可以看出利用VisualDSP+十可以很好的对C语言的各种的效率进行分析。
Part2C语言与汇编语言混合编程代码的性能评估实验
实验步骤:
1、打开VisualDSP++,导入工程”test1_2”,工程路径为”D:
\DSP\test1_2”文件夹,并添加该文件夹下的dotprod.c和main.c文件。
2、查看源程序代码并与实验1中的代码进行对比观察两者的不同之处,最后对文件进行编译纠错。
3、编译整个工程,(首次编译需要先选择调试会话(Session)对象,选择已建立的Session对象或新建一个Session对象),输出窗口无错误信息提示则整个工程编译连接通过。
4、新建代码性能分析器(LinearProfiling)工具,要评估函数的函数为a_doc_c。
5、运行(Run)工程,程序将被执行,其输出结果在Outputwindow中显示,记录实验结果和代码性能分析结果。
6、添加”D:
//DSP/test1_2”文件夹下的dotprod.asm文件,并将main.c中代码作如下修改:
将externinta_dot_c(int*,int*);修改为externinta_dot_c_asm(int*,int*)。
将result[1]=a_dot_c(a,c);修改为result[1]=a_dot_c_asm(a,c)。
此处代码修改是将主函数调用的a_dot_c函数,由采用C语言编写的函数修改为采用汇编语言书写的程序。
7、重新编译工程,出现错误,创建链接描述文件(ToolExpertLinkerCreatLDF),并打开,为my_asm_section下的dotprod.doj分配存储空间至M0Code。
8、修改代码性能分析器中要分析asm代码的起始地址(在Profile设置窗口中要选择Memoryranges,设置代码的起始地址分别为_a_dot_c_asm,_a_dot_c_asm.end),运行(RUN),记录程序执行结果和性能分析结果,并与第5)步中的结果进行对比。
实验结果:
代码修改前的输出结果和代码性能分析结果如下:
代码修改后的输出结果和代码性能分析结果如下:
实验结果分析:
从图中可以看出原来没有优化的C语言子程序为626,现在改变为汇编语言程序嵌入后为201,从而说明汇编语言执行速度比C语言快多了。
Part3数据绘图(Plotting)实验
实验步骤:
1、将已编译好的工程的可执行文件调入Debugger环境,目录为D:
\DSP\test1_3.dxe(选择菜单File\LoadProgram)。
2、在弹出的汇编语言源代码查看inputs和output两个全局数组。
3、新建绘图窗口(选择菜单View\DebugWindows\Plot\New…项)在Plot设置窗口中type设定为LinePlotTitle命名为”FIR”;添加两个DataSetting,参数按以下表格进行设定。
DataSets
Name
Memory
Address
Data
Count
Stride
Inputs
Inputs
TigerSharcMemory
Inputs
Float
256
1
Ouput
Ouput
TigerSharcMemory
Ouput
Float
256
1
4、将Plot窗口调整合适的大小,运行(Run),观察Plot窗口中图像的变化。
将图像记录下来。
并确定count=150时in变量和out变量的值并记录下来。
5、绘制幅度谱线图:
在plot窗口点击右键,选择“modifysetting”,在“plotsetting”窗口选择“dataprocessing”,在“datasets”窗口选择“inputs”,在“dataprocess”窗口选择“FFTMagnitude”,然后点“OK”,观察图像,重复以上操作,把数据“output”也改为“FFTMagnitude”,观察图像,把数据“output”也改为“FFTMagnitude”,就得到了最终的滤波谱图,将图像记录下来。
并请实验老师查看实验结果。
实验结果:
接F5运行程序,当程序Halt(SHIFT-F5)后,用Plot窗口绘出出现数据output的曲线,图中的两条曲线分别代表inputs(绿)和output(紫)数组的值,程序运行后的Plot窗口如图7.20
(1)所示:
该图就是bkfir2_flp32滤波前后的数据频谱图。
实验结果分析:
软件可以很好的绘制出输入和输出波形,从而更好的对程序进行分析。
Part4代码性能统计实验
实验步骤:
1、导入工程文件,目录为将D:
\DSP\test1_4\test1_4.dpj。
(选择菜单File\OpenProject)
2、编译。
3、新建代码性能分析器(LinearProfiling)工具,弹出代码性能统计窗口。
在窗口中:
Histogram:
用图形的方式来显示该执行单元所用时间百分比。
%:
用数字显示该执行单元所占用的时间百分比。
ExecutionUnit:
执行单元,对于C或C十十语言中的函数显示其函数名,对于其它指令或汇编语言显示指令的地址,显示为PC[xxx]。
4、运行(RUN),代码性能统计窗口得到统计信息,双击窗口中的main(),在窗口右半部分观察最耗时间的程序段。
实验结果:
从窗口中可以看出,内循环占去了绝大部分的时间。
因此,在编程时若需提高算法的执行效率,可将该段代码用汇编语言重新编写来提高它的效率。
其结果如下:
实验结果分析:
从窗口中我们可以看出main()函数用去了总程序时间的约99.94%。
用鼠标双击该行,在右边窗口显示该函数的源代码及其行数,且显示各语句所用的时间百分比。
从窗口中可以看出,内循环占去了92.29%的时间。
因此,在编程时若需提高算法的执行效率,可将该段代码用汇编语言重新编写来提高它的效率。
实验二用SIMULATOR模拟实现数字信号处理以及DMA传输
实验目的:
了解DMA通信基本原理,掌握内存与SDRAM间一维DMA通信方式、二维DMA通信方式以及相关控制方法。
学习数字滤波器设计方法,掌握其调试步骤,使学生加深对IIR的理解,进一步提高对数字信号处理理论的认识。
实验任务:
实验1:
内存与SDRAM间的一维DMA通信实验
实验2:
内存与SDRAM间的二维DMA通信实验
实验3:
无限脉冲响应数字滤波器(IIR)的设计实验
实验内容:
Part1内存与SDRAM间的一维DMA通信实验
实验原理:
DMA是一种不需要处理器内核干预的数据传输机制,作为一种后台任务执行,即进行DMA传输时,处理器可以处理其它任务。
如果使能了DMA中断,那么当数据传输结束后会产生中断信号,表示DMA传输已经完成。
DMA传输方式包括:
一维DMA、二维DMA、链式DMA、AutoDMA等,本次实验使用一维DMA方式,即传输存储器中一段连续的数据(地址是相邻接的)。
若要利用DMA传输数据,首先应配置DMA传输控制块(TCB)寄存器。
DMA传输的数据具有方向性,即从发送端(源)到接受端(目的),若为外部存储器DMA传输,则需要设置两个TCB参数,一个源TCB,用于描述源数据的地址、大小和每次传输数据的长度等;还有一个目的TCB,用于描述数据传入的目标地址、数据大小及每次传输数据的长度等。
若要使能DMA中断,也需要在TCB中设置相应位。
若使用链路或AutoDMA通道则只需一个目的TCB。
设置好TCB寄存器后,DMA传输自动开始。
TS201S一共14个DMA通道,4个通道(0~3)专用于外部存储器设备,8个通道(4~11)用于链路口,2个通道(12~13)用于自动DMA操作。
本次实验使用DMA0通道实现内存与外部存储器SDRAM间的一维DMA通信。
实验步骤:
1、启动VisualDSP++,新建工程命名为”test2_1”,路径选择为”D:
\DSP\”,并将源代码文件夹下默认生成的test2_1.c文件移除。
2、新建空白文件(选择菜单FileNewFile),输入参考源代码,保存为DMA_1.asm,并将其添加到工程中。
3、分析、理解源程序,并编译文件纠错。
4、建立链接文件(选择菜单ToolsExpertLinkerCreateLDF)。
5、编译整个工程,若出现错误“Thefollowingsymbolsreferencedinprocessor'p0'couldnotberesolved:
'main[_main]'referencedfrom'ts_hdr_TS201.doj'”则说明声明的程序段/数据段(变量)所存放到了不能被执行的位置,导致该程序段/数据段(变量)没有被分配到相应的存储空间。
处理方式:
打开生成的LDF链接文件,在打开的ExpertLinker窗口中将红叉项下的DMA1.obj添加(用鼠标拖拽)到MSSD0存储区(由于TS201S将外部存储器SDRAM地址映射到了0x40000000到0x7FFFFFFF之间的四个部分:
MSSD0~3,所以我们将DMA1.obj添加至其中之一即可,由于开发板上SDRAM是映射在MSSD0,为方便以后实验,直接添加至MSSD0即可)。
6、重新编译工程,为方便观察存储器内相应地址其内容变化,在__Done处设置断点,同时打开两个存储器观察窗口(选择菜单Memory->TigerSHARCMemory)分别输入tx_data和rx_data。
7、运行(RUN)工程,程序自动运行至_Done后停止,观察tx_data内数据值,然后单步运行程序(按F11键),观察rx_data内数据变化。
实验结果:
要求:
1、按照实验步骤完成实验。
2、修改程序,DMA每次传输一个字(32位),验证结果。
3、修改程序,用软环境模拟外部中断来启动DMA传输,并观察传输结果。
通过下列步骤来建立一个外部中断:
a、打开对话框选Settings\Interrupts,会出现一个InterruptTiming对话框。
b、设置中断属性。
c、设置断点并且运行程序。
用如下程序段:
_Set_IRQ_A:
/*设置外部中断*/
j0=_IRQ0_ISR;;
IVIRQ0=j0;;
xr0=INT_IRQ0;;
IMASKH=xr0;;//外部中断IRQ0使能
SQCTLST=SQCTL_GIE;;
_Wait_For_Interrupt:
.align_code4;
nop;nop;nop;idle;;//无限等待直到中断发生,然后跳至中断程序_IRQ0_ISR执行
jump_Wait_For_Interrupt;;
_IRQ0_ISR:
_Load_DMA0_TCBs:
//将初始值倒入DMA0的传输和接收TCB
j0=DC0_Source_TCB;;
xr3:
0=q[j0+j31];;//注意这种传递方式
j0=DC0_Destination_TCB;;
yr3:
0=q[j0+j31];;
DCS0=xr3:
0;;
DCD0=yr3:
0;;//开始进行DMA传输
rti(np)(abs);;
代替以下原程序:
_Load_DMA0_TCBs:
//将初始值倒入DMA0的传输和接收TCB
j0=DC0_Source_TCB;;
xr3:
0=q[j0+j31];;//注意这种传递方式
j0=DC0_Destination_TCB;;
yr3:
0=q[j0+j31];;
DCS0=xr3:
0;;
DCD0=yr3:
0;;//开始进行DMA传输
实验结果:
4、分析两个程序的原理,简述软环境模拟外部硬件中断的程序流程。
实验结果分析:
原程序是直接将初始值倒入DMA0的传输和接收TCB,而修改后的程序是通过触发中断响应,然后才进行始进行DMA传输。
软环境模拟外部硬件中断的程序是先设置中断,然后不停地进行中断扫描,当中断发生时,跳转到DMA传输程序段。
Part2内存与SDRAM间的二维DMA通信实验
实验原理:
二维DMA将存储区中的数据块作为一个数据阵列进行传输,有利于执行矩阵操作的DSP算法。
若要进行二维DMA传输,对DX、DY寄存器都要进行设置,同时在DP寄存器中使能二维DMA(第27位)。
DX增量寄存器(DX低16位)保存的是偏移值,此值加上当前地址后指向X维的下一数据元素(下一内循环首址),DX计数寄存器(DX高十六位)保存在X维方向(循环内部)需要传输的字数,传输一次减一,可以指示当前行中待传输的字数。
DY增量寄存器保存的是Y维方向(外循环)的偏移值,此值加上当前地址可以指示Y维方向上下一个数据元素(下外循环的首址)。
DY计数寄存器初始值是Y维的传输单元数(外循环次数),每当DX计数器减少至零时,其值才减一。
当Y计数寄存器内容减为零时,DMA传输完成。
二维DMA的具体执行过程:
1、输出保存在TCBDI寄存器中的当前地址,启动一个DMA存储器周期。
2、在此周期内,将TCBDX增量寄存器中的值与当前DI寄存器中的当前地址相加,产生下一个要访问的数据元素地址,同时更新DI寄存器的值。
3、DX计数器的值减一,然后跳回第二步执行,直至DX计数器值减为零。
4、DX计数器减为零后,DX计数器被重新加载原来的初始值。
5、DY增量寄存器的值加到DI寄存器中的当前地址。
6、DY计数寄存器内容减一,然后从第二步继续开始执行,直至DY计数器减少至零,完成二维DMA传输。
实验步骤:
1、启动VisualDSP++,新建工程命名为”test2_2”,路径选择为”D:
\DSP\”,并将源代码文件夹下默认生成的test2_2.c文件移除。
2、新建空白文件(选择菜单FileNewFile),输入参考源代码,保存为DMA_2.asm,并将其添加到工程中。
3、分析、理解源程序,并编译文件纠错。
4、建立链接文件(选择菜单ToolsExpertLinkerCreateLDF)。
5、编译整个工程,若出现错误“Thefollowingsymbolsreferencedinprocessor'p0'couldnotberesolved:
'main[_main]'referencedfrom'ts_hdr_TS201.doj'”处理方法同前一个实验。
6、重新编译工程,为方便观察存储器内相应地址其内容变化,在__Done处设置断点,同时打开两个存储器观察窗口(选择菜单Memory->TigerSHARCMemory)分别输入tx_data和rx_data。
7、运行(RUN)工程,程序自动运行至_Done后停止,观察tx_data内数据值,然后单步运行程序(按F11键),观察rx_data内数据变化。
实验结果:
1、按照实验步骤完成实验。
2、理解并修改程序,使rx_data收到的数据排列验证结果如下:
3、修改程序,只传输tx_data中的奇数值,且接受到的数据在tx_data中连续排列,验证结果。
实验结果分析:
通过对DSP的DMA设置,由于不经过cpu传输可以快速的数据进行传输。
Part3无限脉冲响应数字滤波器(IIR)的设计实验
实验原理:
所谓的数字滤波,指的是输入、输出均为数字信号,通过一定运算关系改变输入信号所含频率成分的相对比例或者滤除某些频率成分。
数字滤波可分为无限脉冲响应(IIR)滤波和有限脉冲响应(FIR)滤波。
本次试验利用VISUALDSP++软环境SIMULATOR模拟实现无限脉冲响应(IIR)数字信号处理。
无限脉冲响应(IIR)的系统函数为:
(2-3-1)
即如果输入为X(Z),输出为Y(N),则:
Y(Z)=X(Z)H(Z),即
(2-3-2)
本试验中利用的公式是对上面的公式2对了相应的形式变化,利用中间变量
(2-3-3)
那么
(2-3-4)
因此,本次试验设计了一个4阶IIR滤波,其对应的公式3和公式4的时域公式如下:
(2-3-5)
(2-3-6)
本次设计中系数a4,a3,a2,a1,b4,b3,b2,b1都是用户自己初始化的时候给定的且均为常数,其中x(n)是输入的数字序列。
从公式5和公式6可知,只要我们设定设计需要的a4,a3,a2,a1,b4,b3,b2,b1,以及初始化w(n-1),w(n-2),w(n-3),w(n-4),就可以得到我们所需要的滤波器了。
滤波器算法中的变量分配:
inputs[N]:
存放输入数据;
coeffs[2*SECTIONS]:
按顺序猘2,a4,b2,b4,a1,a3,b1,b3存放滤波器系数;
delayline[SECTIONS]:
存放w(n-1),w(n-2),w(n-3),w(n-4)初始化值(此处滤波器设计为因果滤波器,n<0时w(n)全为0);
output[N]:
存放计算结果。
实验步骤:
1、启动VisualDSP++,新建工程命名为”test2_3”,路径选择为”D:
\DSP\”,并将源代码文件夹下默认生成的test2_3.c文件移除。
2、新建空白文件(选择菜单FileNewFile),输入参考源代码,保存为IIR.asm,并将其添加到工程中。
3、分析、理解源程序,并编译文件纠错。
4、编译整个工程。
5、查看inputs[]和output[]的时域图和频谱图。
新建绘图窗口(选择菜单View\DebugWindows\Plot\New…项)在Plot设置窗口中type设定为LinePlotTitle命名为”IIR”;添加两个DataSetting,参数按以下表格进行设定。
DataSets
Name
Memory
Address
Count
Stride
Data
Inputs
Inputs
TigerSharcMemory
Inputs
30
1
Float
Output
Output
TigerSharcMemory
Output
30
1
Float
实验结果:
输入数据和输出数据的时域图和频谱图如图所示:
实验结果分析:
数字滤波,指的是输入、输出均为数字信号,通过一定运算关系改变输入信号所含频率成分的相对比例或者滤除某些频率成分,实验中滤波器将信号中的某些频率成分滤除得到如图波形。
实验三定时中断、外部中断实验
实验目的:
理解FLAG可编程作为输入输出引脚,并且能够利用按键进行相应的FLAG标(FLAG0,FLAG1)的输入来进行相应的FLAG标志(FLAG2,FLAG3)输出来