FPGA数字信号处理(1)- AM调制的FPGA实现

2019/04/14 21:16
阅读数 79

FPGA数字信号处理(1)-AM调制的实现

一:前言

  • 本内容分享为本人自学经历。受限于作者水平可能有不准确的地方。欢迎诸位批评指正。
  • 分享的文章需要一些基本的FPGA开发基础

二:概述

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

1. AM信号:

(A+ma*cos(w0t))*cos(wct)

看到这个式子,首先肯定要产生两个频率不同的余弦波cos(w0t),cos(wct)。立马想到调用系统自带的DDS IP核来实现,这是最简单的方法。当然你也可以利用ROM配合加法器自己写一个。这里就不讲了。
产生两个余弦波后,再来两个乘法器(虽然可以直接使用 * 这个符号。但是关于这种方式实现和IP核实现有什么区别。各位读者自行百度)

2.AM信号生成中的注意点

首先看一下调制深度的问题。关于本部分的叙述。大家可以找找教材。调制深度通常为已调波的最大振幅与最小振幅之差对载波最大振幅与最小振幅之和的比。可以算出调制深度就是ma/A。本设计中A为1,调制深度就是ma,其实只要A的值和后面的余弦波的最大值是相同的,调制深度就会为ma,为0~1之间。但是问题在于在FPGA上实现就有一些问题了。关于浮点和定点我在这里就不献丑了大家自行百度。
在本设计中DDS生成的信号是有符号的8bit数据。那么这里先假设A为127。再来再算一下调制深度。这时包络最大值为127+ma127,最小值为127-ma127。最后调制深度还会是ma,这个ma的范围还是01。ma是从01之间变的话,还是有不能直接表示小数这个问题。为了解决这个问题我们这样做:
让A=1270,也就是包络最大值为1270+ma127,最小1270+ma127。算出调制深度最后应该为ma/10的。这时便可以设定ma为1~10来改变调制深度了。
当然有很多方式可以实现。这里只列举了简单的一种。

三:设计输入

为了加速设计 我们推荐一种更方便的设计输入方式bd(block_design)。这种设计方式大概就是加价IP核 连连线。
创建一个DB
创建DB首先添加一个DDS核.然后开始配置它
在这里插入图片描述
这里有一个SDR(动态范围)
一般意义上1bit ≈ 6.02bit。具体计算过程大家可以百度。
输出一个COS 不输出相位
一个数据有效位 八个数据位。输出频率设置为1Mhz
DDS设置
然后添加一个乘法器IP。我们要将这个信号乘以调制深度。
乘法器IP
注意符号位,DDS IP核输出是有符号的。调制深度为无符号数,选择0延时输出即可
然后我们添加一个加法器IP用以添加增加直流分量。加法器IP为乘法器输出加一个定值。按图设置
加法器IP
这个首先需要指定B的类型和位宽然后输入二进制的数据
接下来将以上的IP链接起来。并且添加对外的端口(快捷键Ctrl+T)。
DB链接完成图
然后生成HDLwrapper(这个单词意思是包装,但是我没有能力恰当的翻译索性就直接这样称呼)
创建顶层文件
接下来我们写个testbench代码测试下 。看起来我们只要给一个时钟信号,给一个调制深度就OK。这里就不贴代码了。非常简单的
这样我们就完成了调制前的波形产生。
调制前的波形
可以看到波形已经产生。且均为有符号数。
接下来如法炮制。添加一个载波DDS 频率设置为10M。添加一个乘法器IP。最终的BD图如所示。
最终DB图
以看到输出有20bit
我们进行一个简单的计算(1270*10+1270)*127 =325120
在这里插入图片描述
可以看到第20bit无用
所以我们选取[18:3]这16bit。作为输出。
刚刚哪个testbench 改改还能用。最终效果如下。
效果图

展开阅读全文
cos
打赏
0
0 收藏
分享
加载中
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部