西工大DSRt作业实验1基于CCS的简单的定点DSF程序一、实验要求1、自行安装CCS3.3版本,配置和运行CCS2、熟悉CCS开发环境,访问读写DSP勺寄存器AC0-AC3 AR0-AR7,PC, T0-T33、结合C5510的存储器空间分配,访问DSR的内部RAM4、编写一个最简单的定点DSP程序,计算下面式子y=0.1*1.2+35*20+15*1.65、采用定点DSP进行计算,确定每个操作数的定点表示方法,最后结果的定点表示方法,并验证结果6、对编写的程序进行编译、链接、运行、断点执行、单步抽并给出map映射文件二、实验原理DSP芯片的定点运算---Q格式(转)2008-09-03 15:47 DSP 芯片的定点运算1. 数据的溢出:1>溢出分类:上溢(oveflow ): 下溢(underflow )2>溢出的结果:Max MinMin Max un sig ned char 0 255 sig ned char -128 127 un sig nedint 0 65535 signed int -32768 32767上溢在圆圈上按数据逆时针移动;下溢在圆圈上顺时钟移动。
例:signed int : 32767+1 = —32768 ; -32768-1 = 32767 unsigned char : 255+1 = 0; 0-1 = 2553>为了避免溢出的发生,一般在DSP中可以设置溢出保护功能。
当发生溢出时,自动将结果设置为最大值或最小值。
2. 定点处理器对浮点数的处理:1>定义变量为浮点型(float , double ),用C语言抹平定点处理器和浮点处理器2>放大若干倍表示小数。
比如要表示精度为0.01的变量,放大100倍去运算,3>定标法:Q格式:通过假定小数点位于哪一位的右侧,从而确定小数的精度。
Q0 :小数点在第0位的后面,即我们一般采用的方法Q15 小数点在第15位的后面,0~ 14位都是小数位。
转化公式:Q= (int )(F X pow(2, q)) F =(float ) (Qx pow (2,—q))3. Q格式的运算1>定点加减法:须转换成相同的Q格式才能加减2>定点乘法:不同Q格式的数据相乘,相当于Q值相加3>定点除法:不同Q格式的数据相除,相当于Q值相减4>定点左移:左移相当于Q值增加5>定点右移:右移相当于Q减少4. Q格式的应用格式实际应用中,浮点运算大都时候都是既有整数部分,也有小数部分的。
所以要选择一个适当的定标格式才能更好的处理运算。
一般用如下两种方法:1>用时使用适中的定标,既可以表示一定的整数复位也可以表示小数复位,如对于2812的32位系统,使用Q15格式,可表示—65536.0 〜65535.999969482 区间内的数据。
三、实验步骤启动CCS勺仿真平台的配着选项。
选择C5410 Device Simulator 。
2. 点击project菜单栏的new选项,新建一个LAB的工程注意存储的路径。
3. 把下图中用到的文件拷到工程文件目录的文 件路径下lab^a.RjtMicrosoftVfiUd FoxP 「口 旷可旦ct 1KB4.在ccs 平台中将用到的程序导入到平台中,点 击 project— >add file to project 。
选择多个文件时,可以按住ctrl 键。
5•将程序中的start 改为_main , INT_2改为Winders N r 金令脚吕 1KB^LAB^IAASM:ASM 袁件j hSTM #O,SWWSR软件等待状态寄存器置0,不设等待」nt_2。
然后点击保存。
源程序代码******************************************************************************************************_c_intOO :.title “ example.a sm ”; 为汇编源程序取名 .mmregs;定义存储器映象寄存器STACK .usect “STACK ,10h ;分配10个单元的堆栈空间.bss a,4 ; 为系数a 分配4个单元的空间 .bss x,4 ; 为变量x 分配4个单元的空间 .bss y,1 ; 为结果y 分配1个单元的空间 .def_c_in t00;定义标号_c_in t00.dataJ定义数据代码段table: .word 1,2,3,4 ;在标号table 开始的8个单兀中.word 8,6,4,2为这8个单元赋初值 定义文本代码段.text example.asmy=0.1*x1.2+35*20+15*x1.6STM #STACK+10h,SP ; 设置堆栈指针初值STM #a,AR1 ;AR1 指向a的地址RPT #7 ;从程序存储器向数据存储器MVPD table,*AR1 + ;重复传送8个数据CALL SUM ; 调用SUM实现乘法累加和的子程序end: B end ;循环等待SUM:STM #a,AR3 ;将系数a的地址赋给AR3STM #x,AR4 ;将变量x的地址赋给AR3 RPTZ A,#3 ; 将A清0,并重复执行下条指令4次MAC *AR3+,*AR4+,A ;执行乘法并累加,结果放在A中STL A,@y ;将A的低字内容送结果单元yRET ;结束子程序.end ;结束全部程序Map文件*****************************************************************************TMS320C55X COFF Linker PC Versio n 3.83******************************************************************************>> Lin ked Mon May 31 11:03:33 2010OUTPUT FILE NAME: <lab4a.out>ENTR Y POINT SY MBOL: "_ma in" address: 0000e000MEMORY CONFIGURATIONn ameorig in len gthused attr fill0000001a RWIXPAGE 0: EPROM 0000001d RWIXvecs 00000000 RWIXPAGE 1: SPRAM 0000000b RWIXDARAM0000e000 000001000000ff80 0000000400000060 0000002000000080 00000100SECTION ALLOCATION MAPoutput attributes/secti on page origi n len gth in put sections.text 0OOOOeOOO 0000001dOOOOeOOO0000001d LAB4A.obj(.text).bss 1 00000060 0000000bUNINITIALIZE D四、心得体会经过这次实验,我更加熟悉CCS开发环境,访问读写DSP的寄存器AC0-AC3 ARO-AR7, PC, T0-T3 。
实验2 CCS下的FFT算法程序设计验目的验要求提供一个CCS下的C语言例程,在CCSF,仿照例程,任选雨中FIR滤波、IIR滤波、FFT算法,采用C语言完成代码的编写、编译、链接、下载和运行,输入数据,滤波器系数任选,并给出运算结果。
1)目的2)工程文件的构成,并附图3)打印源代码4)打印编译成功的信息5)打印map文件6)程序下载的截图过程三)行结果三、验步骤1、在ccs平台中将用到的程序导入到平台中,点击project —>addAdd files to Project⑦区2.将所有的程序段中的start改为_main,将fft.Asm 中的K_FFT_SIZE .set 32 ;NK_LOGN .set 5 ;LOG(N)改为K_FFT_SIZE .set 64 ;NK_LOGN .set 6 ;LOG(N)3、对源文件进行编译(注意先对每个.asm文件先进行编译, 以防止程序有错误),没有错误时进行链接閨。
4.点击菜单file load program。
装载.out 文件四、验结果程序代码**********************************************************口XAut o Sn■(ITS. 781, 2195.7J FFT Mag能:对输入的复数组进行快速傅里叶变换(FFT )输入参数:*xin 复数结构体组的首地址指针,struct 型*****************************************************************/ void FFT(struct compx *xin) { int 变址运算,即把自然顺序变成如果i<j,即进行变址求j 的下一个倒位序如果k<=j,表示j 的最高位为1把最高位变成0*******函数原型:void FFT(struct compx *xi n,int N) 函数功f,m, nv2, nm1,i,k,l,j=0; struct compx u,w,t; nv2=FFT_N/2; //倒位序,采用雷德算法 nm1= FFT_N-1; for(i=0;i< nm1;i++) { if(i<j) //{t=xin[j];xi n[j]=x in[ i]; xin[i]=t; } k=n v2; // while(k<=j) //{ j=j-k; // k=k/2;//k/2比较,直到某个位为0 }j=j+k;//把0改为1 },比较次高位,依次类推,逐个计算l 的值,即计算蝶形级//控制蝶形结级表示第m 级蝶//le蝶形结距离,即第m 级蝶形的蝶形结相距le 点lei=le/2;// 运算的两点的距离 u.real=1.0; //u数,初始值为1 u.imag=0.0; w.real 二cos(PI/lei); //w前系数与前一个系数的商 w.imag=-si n( PI/lei); for(j=0;j<=lei-1;j++) // 不同的蝶形结{ int le,lei,ip;核,使用蝶形运算完成 f=FFT_N; 〃FFT运算FFT 运算 for(l=1;(f 二f/2)!=1;l++) //数 ;for(m=1;m<=l;m++) 数 {//m形,l 为蝶形级总数 l=log (2)N le=2<<(m-1); 同一蝶形结中参加 为蝶形结运算系为系数商,即当控制计算不同种蝶形结,即计算系数for(i二j;iv二FFT_N-1;i二i+le)算,即计算系数相同蝶形结{ip=i+lei; 〃i形运算的两个节点t=EE(x in [ip],u); // xin[ ip].real=x in[ i].real-t.real; xin[ ip].imag=xi n[i].imag-t.imag;xin[ i].real二xi n[ i].real+t.real; xin [i].imag=x in[i].imag+t.imag;}u=EE(u,w); // 蝶形运算}}}} // 控制同一蝶形结运,ip分别表示参加蝶蝶形运算,详见公式改变系数,进行下一个Map文件******************************************************************************TMS320C55X COFF Linker PC Versio n 3.3 ********************************************************** ********************>> Li nked Sat May 30 23:48:27 2015OUTPUT FILE NAME: <lab.out>ENTR Y POINT SY MBOL: "_ma in" address: OOOOeOOOMEMORY CONFIGURATIONn ame orig in len gthused attr fillPAGE 0: EPROM 00000019 RWIXPAGE 1: SPRAM 0000e000 00000100 00000060 000000200000000a RWIXDARAM 00000080 00000100 00000000 RWIXSECTION ALLOCATION MAPoutput attributes/secti on page origi n len gth in put secti ons.text 0 0000e000 000000120000e000 00000012 LAB2B.obj(.text).data 0 0000e012 000000050000e012 00000005 LAB2B.obj(.data).vectors 0 0000e017 000000020000e017 00000002 VECTORS.obj (.vectors).bss 1 00000060 0000000a UNINITIALIZEDGLOBAL SY MBOLS: SORTED ALPHABETICALLY BY Name address n ame00000060 .bss0000e012 .data0000e000 .text00000060 bssffffffff cinit0000e012 data0000e017 edata0000006a end0000e012 etextffffffff pinit0000e000 text00000000 __lflagsUNDEFED _c_in t000000e000 _mai nffffffff cinit0000006a end0000e012 etextffffffff pinitGLOBAL SY MBOLS: SORTED BY Symbol Address address n ame00000000 __lflags00000060 bss00000060 .bss0000006a end0000006a end0000e000 .text0000e000 text0000e000 _mai n0000e012 .data0000e012 etext0000e012 data0000e012 etextffffffff pinitffffffff ___pinit__ffffffff ___cinit__ffffffff cinitUNDEFED _c_i ntOO[19 symbols]六、得体会经过这次实验,我更加熟悉CCS开发环境,CCS下的C语言例程下的FFT算法,采用C语言完成代码的编写、编译、链接、下载和运行的方法。