查看: 2056|回复: 6

每日一练6.18#基于FPGA的AM调制与解调(Verilog语言)

[复制链接]

该用户从未签到

发表于 2020-6-18 11:18:10 | 显示全部楼层 |阅读模式
分享到:
       为鼓励大家动手动脑,早日成为技术大牛。电路城论坛现在推出#每日一练#栏目,由版块版主出题及提供答案,内容涉及电源,射频,单片机等各种技术话题。我们会在周一至周五的早上10:30更新问题和前天问题的解题思路及答案。欢迎大家参与。

本期内容来源于:



       Casper.T,电子与通信工程专业,在读硕士,对模拟通信,智能电子设计以及FPGA图像处理和加速器有丰富的设计经验。现主要从事电子信息技术运营方面的工作。

  通过FPGA实现AM信号的产生与解调。我们最开始手上是有硬件的板卡的,型号是叫Nexys Video。(当然现在被老师收走了,所以下面的程序只能讲解到仿真的层次)要求是通过VIO控制载波频率、调制信号频率、调制深度可调,然后通过ILA观察AM信号和解调后的信号。我记得载波信号的频率要求是1M~10M,调制信号的频率要求是1K~10K,调制深度从0到1、步进0.1。当然他规定了一定的精度。(VIO与ILA只能通过硬件板卡实现,下面的讲解中演示不了)。这个程序虽然说不算难吧,但是我确实忙活了一个星期才搞明白,每天都得超过12点睡觉。最让我崩溃的是:考试验收的那一天,我竟然忘记把昨天晚上最后改好的程序考到U盘上来,又是各种原因不能回去拿电脑。我的那个心凉的。。。从头一点点开始写啊,然后还有各种各样的波折,害的我都以为这门课是要来年重修的节奏。还好,最后一刻顺利完成。好,瞎扯到此为止,下面进入正题。

一、平台

   软件:Vivado 2016.4

    硬件:Nexys Video

二、要求
   为了更好的说明下面一些参数设定的意义,把我们课程的部分要求贴上来
完成AM信号调制和解调功能,具体要求如下:
(1)载波信号频率范围:1M-10MHz,分辨率0.01MHz;
(2)调制信号为单频正弦波信号,频率范围:1kHz-10kHz,分辨率0.01kHz;
(3)调制深度0-1.0,步进0.1,精度优于5%;
(4)调制信号和解调信号位宽为8位,AM信号16位,其他信号位宽自定义。

三、原理

    虽然这部分简单,但却是最最重要的,把这部分看懂,所有的程序也就明白了。

    1.  AM信号:(A+ma*cos(w0t))*cos(wct)

    一步步来嘛,首先肯定要产生两个频率不同的余弦波cos(w0t),cos(wct)。立马想到调用系统自带的DDS IP核来实现嘛,这是最简单的方法。我在网上还看到一个自己通过导coe文件来模拟DDS然后来产生余弦波的,这里就不说了。

    产生两个余弦波后,再来两个乘法器(现在没有彻底想明白“*”这个符号和乘法器的区别,这里就不说了,我还是乖乖的调系统的乘法器吧)、一个加法器(后面程序直接用的“+”号,没有用加法器ip 核),运算一把不就搞定了吗。

    2.AM信号生成中的注意点(这个有点绕)

    首先看一下调制深度的问题。调制深度通常为已调波的最大振幅与最小振幅之差对载波最大振幅与最小振幅之和的比。就是生成AM波包络的最大值与最小值之差除以最大值与最小值之和。包络其实就是(A+ma*cos(w0t))。它的最大值是A+ma,最小值是A-ma。最后可以算出调制深度就是ma/A。A为1时,调制深度就是ma,其实只要A的值和后面的余弦波的最大值是相同的,调制深度就会为ma,为0~1之间。

    但是有一个重要的问题不要忘了,就是在硬件描述语言中表示小数并不像C语言那么简单直接(其实所谓的小数只是我们对每个字节中的0和1的解释方式不同而已,在硬件描述语言中,我们会很自然的会把0和1两种状态直接转换为十进制,比如8'b0000_0011,我们会很自然的把它看做3,那么这样的话,硬件描述语言中是没有小数的)。我们上面生成的余弦信号cos(w0t)并不是在0~1范围内。假如我们让DDS的输出位宽为8位,那么这个余弦信号的幅度大小-128~127。我们就当做是-127~127,那么这里先假设A为127。再来再算一下调制深度。这时包络最大值为127+ma*127,最小值为127-ma*127。最后调制深度还会是ma,这个ma的范围还是0~1。ma是从0~1之间变的话,还是有不能直接表示小数这个问题。有两种解决方法:

    1.让A=1270,也就是包络最大值为1270+ma*127,最小值1270+ma*127。算出调制深度最后应该为ma/10的。这时便可以设定ma为1~10来改变调制深度了。

    2,.下面的程序是用的是以下这种方法。比如说(127*256)>>8(要知道右移一位相等于除2,右移8位的话等于除以256),就相当于127*1。而(127*128)>>8就相当于127*0.5=63。也就是这样产生我们的小数ma的,通过设定一个8位的变量depth_con乘以127,然后将得到的结果右移8位,那么我们就可以通过depth_con来控制调制深度depth了。他们的关系也就是depth=depth_con/256。当然这些推理是在保持A=127的情况下进行的,也就是AM信号包络为127+(depth_con*COS)>>8。(COS是DDS产生的8位信号)

    前面的127+(depth_con*COS)>>8得到后,再经过乘法器乘以8位的载波就行了,这个乘法器的输出的就是我们要的AM信号了。这里还有一点就是127+(depth_con*COS)>>8的结果的范围是0~256。这时可以将乘法器的一个输入改为8无符号数,正好可以满足0~256的范围。乘以8位的载波信号后,得到的AM波正好是我们要求的那样,输出16位的AM波。(主要就是因为这才选的这种方法)

问:给出Matlab与Vivado两种方式实现AM的调制与解调结果?
游客,如果您要查看本帖隐藏内容请回复



参与讨论,即可快速获取以下几本电源书籍(电子版)

想成为论坛版主?想在#每日一练#展现你的技术才华?请联系工程师小助手Q:2740521371或邮箱:yanfen.mo@supplyframe.cncaihong.xiao@supplyframe.cn



回复

使用道具 举报

该用户从未签到

发表于 2021-2-23 23:52:01 来自手机 | 显示全部楼层
hello  world
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2021-9-13 09:03:25 | 显示全部楼层
基于FPGA的AM调制与解调
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2021-9-14 10:19:24 | 显示全部楼层
基于FPGA的AM调制
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2023-5-5 11:17:53 | 显示全部楼层
刚好学习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条



手机版|小黑屋|与非网

GMT+8, 2024-3-29 04:25 , Processed in 0.195221 second(s), 28 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.