自从我在网上贴出来了我本科的毕业设计以后,有许多网友跟我联系过,也问了不少问题,我在此对大家的关注表示感谢。
在交流的过程中,我发现问的最多的问题就是问我能不能发一份可运行的工程过去,或者是如何还原那个工程之类的。很多人在看完我写的毕设报告之后,都想进一步把工程运行起来看看。其实,在我毕业的时候,就已经把原来的工程删了,只留下了原代码。一个是因为我觉得自己做的并不好,没有留的价值。另外,VHDL代码都有了,如果真的熟悉VHDL语言和ALTERA的这一套东西的话,再生成一个新的工程是很容易的。但是现在看来,很多人即使下载了我主页上的代码,自己也懒得做或者不会还原我原来的工程。所以后来我仔细想了想,决定把原来的工程重新还原出来再传到主页上。
关于这个还原出来的工程,下面有一些说明:
软件方面,我使用的是从ALTERA网站上下载下来的7.1sp1的网络版。
关于IP,在工程中我使用了两个ALTERA出的IP,分别是Reed-Solomon和FFT。在我当时做这个工程的时候,用的两个IP的版本分别RS 4.0.1和FFT 2.2.x。x具体是0还是1我记不清了。现在随着Quartus软件的升级,好像是从6.0版开始,所有的IP的版本号就都和Quartus统一起来了,而且下载的时候也都是一次下载一个完整MegaCore IP的包,里面包含了所有的IP,不能再分开下载了。所以这次我在7.1sp1下面重做工程的时候,也下了最新的IP包,试图用最新版本的IP。其中RS的7.1版没有问题,但是新的FFT的7.1版真是垃圾,谁如果不信的话比较一下7.1版和2.2.x版的勘误表就能看出来了,真不明白为什么有那么多要命的bug还能把这个IP推出来。一模一样的工程只是换了新IP就不能工作了,害我花了三天时间也没完全调好。后来一想算了,为这事花太多时间不值得,于是我又装了一个早期的2.1.1版的FFT核,因为2.2.x在网上找不到了,如果有2.2.x的话,用这个更好。最后,现在的这个工程中,只有FFT是2.1.1版,这个其实没什么影响,不影响编译和仿真,只要记得在工程设置中把FFT的库的路径设置好就行了。
工程中指定了FPGA的芯片,但是没有分配管脚。芯片就是Cyclone的EP1C12F256C6,这也是我毕设时候板子上用的FPGA。如果想要下载的板子上验证的话还需要自己再指定芯片和管脚,并重新编译。
工程中包含了一个波形仿真文件,ofdm_sch.vwf,就是顶层实体在Quartus中的仿真。只接仿真就能看到最终结果,另外我同时也把FFT,IFFT等几个中间过程的重要输出接了出来,可以看到数据处理的具体过程。
仿真文件中指定网格大小(Grid size)为100ns,并依照这个大小生成了时钟,相当于在仿真中使用10MHz。我做毕设的时候,板子上的晶振分别用了一个10兆的和一个30兆的,运行起来都没有问题。但是再高的频率就没有实际试验过。不过工程应该还能运行在更高的频率下面的,用ALTERA的时序分析自己看下就知道了。
再一步步教下使用步骤,熟悉Quartus的可以跳过:
1、设置好Quartus的软件环境,把该装的IP都装好。如果找不到早期的FFT核,我在下面提供了2.1.1版的下载。
2、把ofdm_sch文件下载下来。rar文件。解压之后是一个qar文件,也就是Quartus工程的打包。
3、在Quartus里把这个qar当做一个新的工程打开。打开之后会自动生成新工程目录并包括了所有的原文件。
4、工程的顶层实体就是ofdm_sch.bdf,原理图文件。在原来的代码中我是用的vhdl写的顶层的连接,这次为了直观我用bdf文件画了一个顶层的连接。
5、编译工程(Ctrl+L),会报一堆warning,不过都没关系。
6、把那个vwf文件打开,用simulator tool仿真就行了。可以看到波形上的结果。
最后再重复声明一遍:
1、其实我这个ofdm的工程做的并不好,很多VHDL代码写的都不是很规范,所以不值得花太多时间在工程上面。真正想研究的话,看看我写的报告就行了,我毕设的精华都在报告上。
2、在跟我联系想要下载工程回去运行的兄弟们中,有不少都是想参考这个工程混毕设的。我不反对你这么做,但是我可以很负责地说,如果你只是简单地运行这个工程并看下仿真结果,是学不到东西的。真正做研究是需要花精力的。
3、如果对我做的工程感兴趣,非常欢迎跟我交流。或者有什么地方不明白也都可以问。
4、但是在提问之前,我拜托大家自己先尽量想一想,或者上网站查一查,不行了再提问。而不要一上来就不管不顾地把问题都堆给别人。之前有一些问题搞得我很头痛,要么太宽泛,没法回答;要么太简单,比如要我一步步教如何用Quartus。所以在这里说一下,也希望能相互体谅,大家的时间都是有限的,如果要是有的问题我没有回答请不要介意。
下载:
OFDM通信系统基带数据处理部分的FPGA实现,工程文件ofdm_sch.rar,约2m。下载
ALTERA FFT MegaCore V2.1.1,约7m。下载 (2008.10.23 此下载文件已经被删除)
2008.4.24 关于FFTScale模块问题的集中解答
在OFDM中,要做IFFT+FFT变换并最终得到变换之前的原始数据。ALTERA的FFT模块采用的是block-floating-point模式,所以需要进行指数变换。具体的变换方法请参考文档FFT/IFFT Block Floating Point Scaling (ALTERA主页上搜AN404)。我其实就是参考的图2中的那个式子。
问我最多的问题是为什么FFTScale并没有依据exp1和exp2的值进行移位?原因是我当时的测试输入数据都是10以内的整数,所以仿真出来的FFT的exp总是一个常数。因此我就偷了个懒直接在FFTScale中根据经验的exp数据进行了移位,而不是每个时刻的exp1和exp2的值。还有人问为什么不在IFFT之后立刻先变换一次?这个当然是可以的。但是我因为当时的编码和解码都在一个FPGA上面,在加上我其实不需要exp的值,所以就不用变换了。
另一个问题是FFTScale到底移位了多少?为什么VHDL文件说明中要移3位但是实际只移了2位。这个我也记不清楚了。反正VHDL中的左移2位应该是不会错。其实具体应该移多少仿真一下看看IFFT和FFT的指数再根据64点FFT用公式算一下就知道了。另外顺带一提,shift_left是numeric_std包中的函数,这个库文件在altera的安装目录下面就有。
2008.10.23 结语
今天决定把这个贴子封了。从我大学毕业到现在两年多了,这么旧的东西该关了。我删除了不少网友的留言,不过都是跟实际内容并无太大关系的,基本上所有提问和解答的贴子都保留了下来,这样应该更易于阅读。
最后再说几点:(1)我把论文贴到网上的初衷是想让大家拍砖提意见的。我本科的论文做得并不好,HDL代码现在看起来也很恶心。所以如果有网友不小心看到了我的论文,不用认真研究,扫一眼过了就行了。(2)自从8.0版本的Quartus和IP包出来以后,现在ALTERA的FFT/IFFT核已经很好用了,而且用网络版license也可以下载FPGA验证,实验室里足够用了。所以没有必要纠缠于旧版本的问题,直接升级到最新版本的软件再用就好了。p.s. 这两天发现ALTERA在自己网站上又发了许多中文教程,还是免费的。他们为争取国内用户真是没少下本钱啊。
(本文章于2008年10月23日被锁定)