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

可编程逻辑

1358人已加入

描述

1.AM信号:(A+macos(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+ma
127,最小值为127-ma
127。最后调制深度还会是ma,这个ma的范围还是01。ma是从01之间变的话,还是有不能直接表示小数这个问题。为了解决这个问题我们这样做:
让A=1270,也就是包络最大值为1270+ma127,最小1270+ma127。算出调制深度最后应该为ma/10的。这时便可以设定ma为1~10来改变调制深度了。
当然有很多方式可以实现。这里只列举了简单的一种。

三:设计输入

为了加速设计 我们推荐一种更方便的设计输入方式bd(block_design)。这种设计方式大概就是加价IP核 连连线。

创建一个DB

乘法器

首先添加一个DDS核.然后开始配置它

乘法器

这里有一个SFDR(动态范围)

一般意义上1bit ≈ 6.02bit。具体计算过程大家可以百度。

输出一个COS 不输出相位

一个数据有效位 八个数据位。输出频率设置为1Mhz

乘法器

然后添加一个乘法器IP。我们要将这个信号乘以调制深度。

注意符号位,DDS IP核输出是有符号的。调制深度为无符号数,选择0延时输出即可

乘法器

然后我们添加一个加法器IP用以添加增加直流分量。加法器IP为乘法器输出加一个定值。按图设置

乘法器

这个首先需要指定B的类型和位宽然后输入二进制的数据

接下来将以上的IP链接起来。并且添加对外的端口(快捷键Ctrl+T)。

乘法器

然后生成HDLwrapper(这个单词意思是包装,但是我没有能力恰当的翻译索性就直接这样称呼)

乘法器

接下来我们写个testbench代码测试下 。看起来我们只要给一个时钟信号,给一个调制深度就OK。这里就不贴代码了。非常简单的

这样我们就完成了调制前的波形产生。

乘法器

可以看到波形已经产生。且均为有符号数。

接下来如法炮制。添加一个载波DDS 频率设置为10M。添加一个乘法器IP。最终的BD图如所示。

乘法器

以看到输出有20bit
我们进行一个简单的计算(1270*10+1270)*127 =325120

乘法器

可以看到第20bit无用

所以我们选取[18:3]这16bit。作为输出。

刚刚哪个testbench 改改还能用。最终效果如下。

乘法器

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分