欢迎来到天天文库
浏览记录
ID:37583788
大小:954.73 KB
页数:24页
时间:2019-05-25
《xilinx Spartan 6 DFT 设计笔记》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、xilinxSpartan6DFT设计笔记系统工作环境:芯片为:xilinxSpartan6软件:ise12.2目标:对采集到的时间序列做DFT或者FFT作者:calm_yiQQ:429665786刚开始学习FPGA,很多东西都没有成型,而且是自学的,没有老师,交流甚少!期待你的意见与交流!如果有经验的大神发现我的设计中有致命的错误,请告诉我,感激不尽!(包括语言风格、设计风格、还有思想、整体的架构)^_^一、设计说明最初的思路是对采集的数据做FFT,因为FFT快,存储空间小啊,而且xilinxISE中自带了FFT的IP核,自己调用就行了,当时感觉挺美的,但是在设计中过程
2、中发现FFT的致命伤,至少是对我来说,因为FFT是基于基2算法的,只能对序列长度为2的幂的序列做变换,如只能对长度为2、4、16、……1024序列进行FFT变换,但是设计中不能保证序列长度就是2的幂啊!!!尴尬!!!!!为什么这么说呢,举个例子,要对一个3Hz的方波做FFT,采样率为15Hz,那么你采集6秒钟,也就是采集了90个点吧!这时你会尴尬的发现他不是2的幂啊,那么怎么解决这个问题呢!第一:为什么不采集128个点啊,非要采集90个点呢,这个问题我也想过,为什么不啊,原因:在采集中,要对信号进行整周期采样,否则会发生频谱泄露,比如采集了2.5周期的信号,频谱就会泄露了
3、,有matlab做的实验结果为证。采样的对象:x=3*sin(2*pi*t)非整周期采样整周期采样第二:对信号进行整周期采样,比如还是3Hz的方波,采集90个点,这时,对其做128个点的DFT,90个点怎么做呢,补零。(90个点+38个零),但是因为对序列进行了补零的操作,频谱结构是不会发生变化的,但是能量会损失。也就是说计算出来的频率对应的幅值是不对的,有一定的衰减。有matlab实验结果为证。补零的结果没有补零的结果鱼与熊掌,整周与补零,两者不可兼得啊!!!!!!补零、整周、补零、整周、补零、整周、补零、整周、补零、整周、补零、整周、哎,放弃!!!!!!!!在没有办法
4、好偷懒的情况下,把目光转向了DFT,查看了xilinxDFT的IP核,发现其只能最高对18位的数据进行DFT的计算,而我们的AD为24位,在对精度要求苛刻的设计中,不可行啊,pass!!!!毛主席说:自力更生!!!!!!自己写吧!二、DFT的理论基础IDFT的公式:NN/2/2xi[]Re[]cos(2XkkiN/)Im[]sin(2XkkiN/)01kNkk00其中:Re[]XkRe[]XkN/2Im[]XkIm[]XkN/2DFT为:NN11Xk[]xi()cos(2kiN/)jxi()sin(2kiN/)01nNii
5、00其中:N1Re[]Xkxi()cos(2kiN/)i0N1Im[]Xkxi()sin(2kiN/)i0设计的关键在于一个乘法器,和怎么计算sin()的值,还有一个存储数据的ram。对于理论知识的介绍就不多进行了,设计中最多做1000个点的DFT,而且对时间的要求比较宽松,所以没有对DFT的算法进行改进。三、设计的框图如下:AD_data[11:0]乘法器1cos(2kiN/)实部输出累加器AD_data[23:12]乘法器2左移12kiNcos(2/)相位输入RAMDDSkiNsin(2/)乘法器3左移12AD_data[23:12]虚
6、部输出累加器sin(2kiN/)乘法器4AD_data[11:0]、图3.1总体的说明:1、RAM为一个双口的,一端为AD的数据输入,另一端如上图,给了乘法器做运算。2、乘法器用了四个,spartan6的最大可以乘法位数为18位,而AD的数据位24的,无奈之下只能用两个乘法器,把24位的数据拆成2个12位的数据然后做乘法,最后再组合到一起!3、DDS模块,输入sin的相位值,直接输出对应的幅值。各个IP核的测试:DDS:DDS的测试目的:在相位值输入后,需要多少个转换的时钟周期。图3.2图3.3图3.4在做测试的时候发现,DDS的输出延时是可以设置的,如图3.3.为了开
7、足马力,把延时周期设为:1图3.4的仿真也是针对延时为1的情况做的。乘法器测试:乘法器是spartan6自带的硬核,DSP48A测试的目的:12bit*16bit的乘法需要的时钟周期。图3.4图3.5图中:P=c+b*a,速度上没话说。只用了4个周期就完成了一次乘加运算!但后来测试时发现只要2个周期!Ram:测试目的:测试数据的输出延时,即取数据的操作周期。在测试中,对ram中地址为0、1、2、3的内存加入0、1、2、3的数据。然后再读出。Addra:为输入地址Dina:为写入的数据Addrb:为读数据的地址Doubt:为读去
此文档下载收益归作者所有