概述
基于PYNQ-z2的OFDM调制解调
- PYNQ-z2实现OFDM
- OFDM系统
- IFFT/FFT的IP核设计
- 基于overlay的测试
- 基于PYNQ-z2的OFDM调制解调的测试
PYNQ-z2实现OFDM
最近学校开设了实践课,提供了PYNQ-z2开发板并要求实现一些功能。由于我们组是做语音和通信的,我们选择了实现OFDM调制解调作为选题。当然这块板子也很适合图像识别神经网络搭建,具体案例也可在指导手册中找到。
OFDM系统
关于OFDM的原理在此处就不具体介绍了,可以参考一下博文,介绍地非常详细:
链接: https://blog.csdn.net/madongchunqiu/article/details/18614233.
我们基于802.11a的OFDM标准,要求IFFT/FFT均为64点,802.11a标准的介绍:
链接: https://blog.csdn.net/rs_network/article/details/49162455.
OFDM调制、解调的过程如下图所示,其中只有IFFT/FFT是需要设计IP核的。
IFFT/FFT的IP核设计
IFFT/FFT的IP核建立完全一样,区别只在于代码,接下来详细介绍一下FFT的IP核创建。
- 写完FFT的C++程序后,使用vivado HLS工具生成IP核。首先是添加c程序,Top function就是主要实现的函数,我们fft函数的的名字叫做kfft64。
TestBench就是测试文件,也提前导入。
HLS内没有PYNQ-z2的板子信息,因此只能选择芯片,输入xc7z020clg400-1,如图所示
完成之后分别点击Run C Synthesis、Run C Simulation、Export RTL,完成IP核测试和生成。
在TestBench内采用相同一段比特流2PSK调制后作为输入,拿IP核输出结果对比matlab输出结果(左为IP核,右为matlab):
在HLS左侧区域找到IP核调用地址,例如INR代表输入的实部,其为整型,存储在从0x100开始,以4个字节为存储空间的内存中。这里讲一下为什么采用整型变量来进行存储的原因:按照理论,输入输出应该为浮点型,但是我在调用IP核的过程中总是出现浮点型数据写入、读取困难的问题。由于问题一直没有解决,最后选择在数据输入IP核前先进行放大,将数据放大为10万倍后强制转成整型,然后在输出端再除以10万倍。整型的写入、读取没有遇到过困难,由补码到原码的转换也比较顺利。由于采用了16QAM的调制方式,数据的大小最大为3,乘上10万倍相对于采用32位存储的整型来说也完全没有问题。如果有人解决了浮点数读取这个问题,希望能告诉一下我方法,非常感谢。
2.IP核创建完成后,使用vivado连接到AXI总线上,这里比较简单,推荐一个博客,照做就行:
链接: https://blog.csdn.net/weixin_38438451/article/details/84778938.
在vivado里新建工程是可以找到板子信息的,如果找不到的话,需要去下载并存放在vivado安装目录下。
基于overlay的测试
调用板子内的jupyter,并写代码测试:
调用IP核的程序
from pynq import Overlay
overlay =Overlay('/home/xilinx/pynq/overlays/base/kfft.bit')
overlay?
kfft = overlay.kfft64_0
测试的例子不是很形象(可以不看)。为了比较性能,在使用IP核解调的同时也调用python内的fft函数来进行解调。下图中左边的是用ip核解调后的实部,右边的是用python的fft函数解调后的复数,只看实部的话,二者的差距还是比较小的。
基于PYNQ-z2的OFDM调制解调的测试
为了测试IP核性能,实验采用PYNQ开发板进行OFDM调制,matlab设计算法进行解调。
采用16QAM的调制方法,星座图如图:
如果有意见、建议或者需要代码,可以联系1025805741@qq.com,祝大家新年快乐。
最后
以上就是感动路灯为你收集整理的基于PYNQ-z2的OFDM调制解调PYNQ-z2实现OFDM的全部内容,希望文章能够帮你解决基于PYNQ-z2的OFDM调制解调PYNQ-z2实现OFDM所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复