(开源)搓一个FPGA FM收音机--从仿真到实现
(开源)搓一个FPGA FM收音机--从仿真到实现
本文详细介绍了使用FPGA实现FM收音机的全过程,从硬件设计到软件实现,再到最终的调试和优化。文章内容深入浅出,适合对电子工程、FPGA开发感兴趣的读者。
硬件设计
在进行硬件设计时,作者确立了以下几个目标:
- 射频前端部分使用经典的中频架构,将RF信号下变频到IF,再进行数字化。这一部分主要是为了学习射频前端。
- 数字部分使用IQ架构完成解调,这一部分是学习数字信号处理和FPGA
- 在完成以上任务的前提下,使用的硬件足够便宜(tips:可以上x宝购买拆机芯片),数字部分(FPGA)使用尽量少的资源(LUT)。
下面是作者选用的元器件:
- 天线放大器/中频放大器:BGA2869
- 混频器:IAM81008
- 前端滤波器/中频滤波器:普通的LC滤波
- 本振发生器:ADF4350/ADF4531
- 模数转换器:AD9200
- FPGA:LCMXO2-2000
- 输出DAC:LCMXO2-2000
信号链调试
由于FPGA的资源限制,直接上板调试并不是最佳选择。作者的主要开发流程如下:
- 在matlab中生成量化的CW/FM信号,作为仿真输入
- 编写/修改/复制别人的RTL代码,用modelsim进行仿真
- 将modelsim仿真结果重新导入matlab,进行分析
- 对设计进行适当调整,生成比特流,上板验证
IF混频产生IQ信号
在数字域里,想产生本振有很多方法。这里使用的是查表法,将0~2pi值均匀的分成2的N次方份,然后把这些值输入sin和cos计算,将结果量化为需要的比特数,就得到了一个表。
解决了本振以后就是混频环节。在数字域中我们只需要一个乘法器就可以完成。唯一需要注意,也是最需要注意的问题就是FPGA中的数字符号问题。
CIC滤波
完成混频后,数据速率依然很高(20MHz时钟速度)。此时就可以用CIC滤波器对信号进行滤波和抽样,从而将数据速率降低至可接受范围内。
FM信号的IQ解调
普通的FM IQ解调需要用到除法,而这个除法的除数又是不定的(由I和Q当前值决定),让这种类型的除法运算在小规模FPGA上运转就是奢望。不过好在凡事都可以近似,这一部分主要参考了电子发烧友论坛的一篇文章,里面提到了一种只需要加减乘的FM近似解调算法。
PWM音频输出
理论上这个时候就可以给耳机接上FPGA听声音了,但是为了保护我们的耳朵,以及提升听感,可以加入一个简单的RC低通滤波器,截止频率在3~5KHz左右即可。
硬件调试
混频器测试
这部分的内容在开头提到的文章里已经写过了,这里只做简单的说明,下图的信号幅度只有几百mv是正常的,测试混频器时还没有加入前端和IF的LNA。
加入LNA后接天线测试
在展示结果之前,需要先展示一下整套系统的连接方法以及说明测试目标:
EXT_LO:外部本振输入,连接到信号源上
IF_OUT:中频输出,连接到示波器上。
RF_IN:射频输入,连接到天线,天线如下图
效果测试
最后整套玩意拼起来就像这样,很糙。左边那块板子是我之前做的另一个收音机,不过没成,这里只是借用一下上面的耳机口和PWM滤波器,其余的处理完全由右边的板子承担。
总结
作为作者个人第一次射频板级设计,他对这个结果感到十分满意(它能响!)。但它是一个合格的FM收音机吗?显然不是,噪声巨大,失真严重,而且还不能用旋钮调台(这个实在是无法忍受)。所以第二版的制作已经提上日程了,并且计划做一个有关的完整视频。
开源地址:https://github.com/BellssGit/FPGA-SDR-FM-RADIO
参考链接:
- FPGA 设计FIR滤波器处理MATLAB激励信号
- FPGA + 3 R + 1 C = MW and SW SDR Receiver
- Verilog CIC 滤波器设计
- Matlab FFT
- 简易FM信号解调的FPGA实现过程讲解
- PWM DAC 3 - One-bit DAC