DSP课程设计总结
(20##-20##学年第2学期)
题 目 :
专业班级 : 电子1103
学生姓名 :
学 号 :
指导教师 :
设计成绩 :
20## 年 6 月
目 录
一设计目的----------------------------------------------------------------------3
二系统分析----------------------------------------------------------------------3
三硬件设计
3.1 硬件总体结构-----------------------------------------------------------3
3.2 DSP模块设计-----------------------------------------------------------4
3.3 电源模块设计----------------------------------------------------------4
3.4 时钟模块设计----------------------------------------------------------5
3.5 存储器模块设计--------------------------------------------------------6
3.6 复位模块设计----------------------------------------------------------6
3.7 JTAG模块设计--------------------------------------------------------7
四软件设计
4.1 软件总体流程-----------------------------------------------------7
4.2 核心模块及实现代码---------------------------------------8
五课程设计总结-----------------------------------------------------14
一、 设计目的
设计一个功能完备,能够独立运行的精简DSP硬件系统,并设计简单的DSP控制程序。
二、 系统分析
1.1设计要求
硬件要求:
(1)使用TMS320VC5416作为核心芯片。
(2)具有最简单的led控制功能。
(3)具有存放程序的外部Flash芯片。
(4)外部输入+5V电源。
(5)绘制出系统的功能框图。
(6)使用AD(Altium Designer)绘制出系统的原理图和PCB版图。
软件要求:
利用实验箱的模拟信号产生单元产生不同频率的信号,或者产生两个频率的信号的叠加。在DSP中采集信号,并且对信号进行频谱分析,滤波等。通过键盘选择算法的功能,将计算的信号频率或者滤波后信号的频率在LCD上显示。
三、 硬件设计
3.1 硬件总体结构
3.2 DSP总体结构
3.3 电源模块设计
3.4 时钟模块设计
3.5 存储器模块设计
3.6复位模块设计
3.7 JTAG模块设计
四、 硬件设计
4.1 软件总体流程
4.2核心模块及实现代码
1.采集数据去直流
in_x[m] = port8002 & 0x00ff;//读取数据
m++;
intnum = m;
if (intnum == Len) //以256个点为采样周期
{
intnum = 0;
xavg = 0.0;
for (s=0; s
{
xavg = in_x[s] + xavg; //归一化处理
}
xavg = xavg/Len;//采样均值
for (s=0; s
{
x[s] = 1.0*(in_x[s] - xavg);
}
1. FFT变换
void kfft(double pr[Len],double pi[Len],int n,int k,double fr[Len],double fi[Len],int l,int il) //pr为实部,pi为虚部,k为蝶形运算级数
{
int it,m,is,i,j,nv,l0;
double p,q,s,vr,vi,poddr,poddi;
for (it=0; it<=n-1; it++)
{ m=it; is=0;
for (i=0; i<=k-1; i++)
{ j=m/2; is=2*is+(m-2*j); m=j;}
fr[it]=pr[is]; fi[it]=pi[is]; //序数重排
}
pr[0]=1.0; pi[0]=0.0;
p=6.283185306/(1.0*n);
pr[1]=cos(p); pi[1]=-sin(p);
if (l!=0) pi[1]=-pi[1];
for (i=2; i<=n-1; i++)
{ p=pr[i-1]*pr[1]; q=pi[i-1]*pi[1];
s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
pr[i]=p-q; pi[i]=s-p-q;
}
for (it=0; it<=n-2; it=it+2)
{ vr=fr[it]; vi=fi[it];
fr[it]=vr+fr[it+1]; fi[it]=vi+fi[it+1];
fr[it+1]=vr-fr[it+1]; fi[it+1]=vi-fi[it+1];
}
m=n/2; nv=2;
for (l0=k-2; l0>=0; l0--)
{ m=m/2; nv=2*nv;
for (it=0; it<=(m-1)*nv; it=it+nv)
for (j=0; j<=(nv/2)-1; j++)
{ p=pr[m*j]*fr[it+j+nv/2];
q=pi[m*j]*fi[it+j+nv/2];
s=pr[m*j]+pi[m*j];
s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
poddr=p-q; poddi=s-p-q;
fr[it+j+nv/2]=fr[it+j]-poddr;
fi[it+j+nv/2]=fi[it+j]-poddi;
fr[it+j]=fr[it+j]+poddr;
fi[it+j]=fi[it+j]+poddi;
}
}
if (l!=0)
for (i=0; i<=n-1; i++)
{ fr[i]=fr[i]/(1.0*n);
fi[i]=fi[i]/(1.0*n);
}
if (il!=0)
for (i=0; i<=n-1; i++)
{ pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
if (fabs(fr[i])<0.000001*fabs(fi[i]))
{ if ((fi[i]*fr[i])>0) pi[i]=90.0;
else pi[i]=-90.0;
}
else
pi[i]=atan(fi[i]/fr[i])*360.0/6.283185306;//pi为相位
}
}
2. 计算频率
void cf(double f[Len])
{ double max;
int no=0;
max=f[0];
for(i=0;i<128;i++)
{
if(f[i]>max)
{
max=f[i];//max为最大幅值
no=i;//最大幅值处对应序数
}
}
fstop=no*fs/256;
3. FIR滤波
void firdes(double npass //求出窗口函数h
{
int t;
for (t=0; t
{
h[t] = sin((t-(FLen-1)/2.0)*npass*pai)/(pai*(t-(FLen-1)/2.0));
}
if (t == ((FLen-1)/2)) h[t]=npass;
}
//作卷积
for (s=0; s
{
x[s] = 1.0*(in_x[s] - xavg);
pr[s] = x[s]; //输入实部
pi[s] = 0; //输入虚部
for (p=0; p
{
xmid[FLen-p-1] = xmid[FLen-p-2];
}
xmid[0] = x[s];
r = 0;
rm= 0;
for (j=0; j
{
r = xmid[j] * h[j];
rm = rm + r;
}
y[s] = rm;
}
4. LCD显示
SendCMD(CLEAR);
showperson();
Delay(1);
//-----------------------------------------------------------
SendCMD(CLEAR);
SendCMD(0x0080); //设定DDRAM的地址在第一行 80H
delay_100us();
for(i =0;i<16;i++)
{
SendDat(data_buff3[i]);
delay_100us();
asm(" nop ");
}
asm(" nop ");
SendCMD(0x0090);
shownum(f1);
//------------------------------
SendCMD(0x0088); //设定DDRAM的地址在第二行 90H
delay_100us();
for(i =0;i<16;i++)
{
SendDat(data_buff4[i]);
delay_100us();
}
SendCMD(0x0098);
shownum(f2);
4.3 软件实验效果图
1.去直流
2.滤波前fft
3.滤波后fft
4.窗口函数
五课程设计总结
在为期两个多星期的综合设计中,重新熟悉了一下AD和CCS软件的操作。在画原理图时,各元件的连接及封装形式都应参照手册。只有深刻了解各管脚的功能,才能准确快速地画好原理图。画好原理图后,要先编译一下看是否有连接错误。
如果原理图有所改变,可以在PCB中重新导入。如果元器件管脚或IO引脚变绿,可能是间距违反了规定的rule。可以将rule里的间距改小一点。在pcb连线过程中,我发现移动clk时钟器件,其管脚变绿,但rule并无问题。后经查阅资料,取消了Drc功能,才恢复正常。在连接滤波电容时,将滤波电容靠近其滤波元器件。
在软件设计过程中,前两天一直没有搞清楚设计要求,进展缓慢。首先了结了一下各个模块程序的输入输出变量的含义,只有这样才能正确地调用各个函数。在计算频率时,其实我只计算了一个频率。输入是一个混频信号,由于左右对称,在128点内可得到两个最大幅度,0到30(或其他分界点亦可,视滤波效果而言),比较一次,30到128,再比较一次。滤波函数仅仅只是计算了窗口函数,故还需将输入信号函数和窗口函数进行卷积得到最终结果。
在编写LCD显示模块程序时,经常出现乱码。Unsigned char类型的字符串数组,一个汉字相当于两个英文字母,如果地址1没有安排好容易出现乱码。