问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

(开源)搓一个FPGA FM收音机--从仿真到实现

创作时间:
作者:
@小白创作中心

(开源)搓一个FPGA FM收音机--从仿真到实现

引用
1
来源
1.
https://www.bilibili.com/read/cv39248607

本文详细介绍了使用FPGA实现FM收音机的全过程,从硬件设计到软件实现,再到最终的调试和优化。文章内容深入浅出,适合对电子工程、FPGA开发感兴趣的读者。

硬件设计

在进行硬件设计时,作者确立了以下几个目标:

  1. 射频前端部分使用经典的中频架构,将RF信号下变频到IF,再进行数字化。这一部分主要是为了学习射频前端。
  2. 数字部分使用IQ架构完成解调,这一部分是学习数字信号处理和FPGA
  3. 在完成以上任务的前提下,使用的硬件足够便宜(tips:可以上x宝购买拆机芯片),数字部分(FPGA)使用尽量少的资源(LUT)。

下面是作者选用的元器件:

  • 天线放大器/中频放大器:BGA2869
  • 混频器:IAM81008
  • 前端滤波器/中频滤波器:普通的LC滤波
  • 本振发生器:ADF4350/ADF4531
  • 模数转换器:AD9200
  • FPGA:LCMXO2-2000
  • 输出DAC:LCMXO2-2000

信号链调试

由于FPGA的资源限制,直接上板调试并不是最佳选择。作者的主要开发流程如下:

  1. 在matlab中生成量化的CW/FM信号,作为仿真输入
  2. 编写/修改/复制别人的RTL代码,用modelsim进行仿真
  3. 将modelsim仿真结果重新导入matlab,进行分析
  4. 对设计进行适当调整,生成比特流,上板验证

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

参考链接:

  1. FPGA 设计FIR滤波器处理MATLAB激励信号
  2. FPGA + 3 R + 1 C = MW and SW SDR Receiver
  3. Verilog CIC 滤波器设计
  4. Matlab FFT
  5. 简易FM信号解调的FPGA实现过程讲解
  6. PWM DAC 3 - One-bit DAC
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号