AM解调的FPGA实现
一、说明:
- 功能:AM解调
- 平台:Vivado 2016.4 和 Matlab R2017a
二、原理:
1.AM解调原理
- 模拟电路中采用“包络检波”的方法:

- **数字电路中采用类似的方法: **
先将已调信号取绝对值,再经过低通滤波器,滤除高频分量(经AM调制的信号包含两个高频分量:载波频率+/-调制信号频率,因此低通滤波器的截止频率小于两个高频分量就可以),得到的就是叠加了直流分量的调制信号,去直流后便可以得到调制信号。
三、AM解调的FPGA实现
1.将已调制的AM信号取绝对值
关于AM信号的产生,参见上一篇博客:AM调制的FPGA实现
简单说明一下对数据取反的思路:如果是无符号数,则不存在符号位,也就是说数据都是正数,不需要取绝对值;如果是有符号数,通过检测最高位的符号位,如果符号位是1,则表示数据是负数,对数据取反,如果符号位是0,则表示数据是正数,不需要取反操作。
- 取绝对值的Verilog实现:
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
data_tdata <= 0;
end
else if(AM_mod[15] == 1) begin
data_tdata <= -{AM_mod}; //如果符号位是1,对数据取反
end
else if(AM_mod[15] == 0) begin
data_tdata <= AM_mod; //如果符号位是0,数据不变
end
else begin
data_tdata <= data_tdata;
end
end
2.使用FIR滤波器滤除高频分量
关于Vivado的FIR IP核可以说是功能很强大的,但这里不需要其他复杂的功能,只需要简单的生成一个的低通滤波器就行了。
类似于ROM核的生成,配置FIR同样需要Matlab配合。可见,Matlab的功能是多么强大。这里Matlab的主要作用是对滤波器的性能进行仿真并生成相应的抽头系数。
使用Matlab生成FIR的抽头系数
在Matlab的命令行窗口输入:filterDesigner(以前是用fdatool命令,不过输入fdatool也可以,只是会提醒你改用新的命令)弹出滤波器设计窗口:

接下来,对滤波器的一些参数进行设置:

参数设置好后,点击Design Filter 按钮查看生成滤波器的幅频响应图,通过幅频响应等图来判断滤波器是否达到设计要求:

设计的滤波器满足性能指标后需要将抽头系数导出,保存为.coe文件。在导出前需要对系数进行量化。因为需要解调的AM信号也是16位宽,所以这里的位宽设置保持默认值,这些可以根据实际情况自行修改。

量化过后就能将抽头系数导出为.coe文件了:

生成FIR IP核
IP核的具体配置如下:



其他保持默认即可:


同样,在IP核配置界面也可以查看滤波器的幅频特性:

IP核生成完毕后,就可以编写IP核的调用模块了。
- FIR IP核调用模块:
module FIR_Control(
input clk,
input rst_n,
input signed [15:0] s_axis_data_tdata,
output reg [7:0] data_out
);
wire s_axis_data_tready;
wire m_axis_data_tvalid;
wire [39:0] m_axis_data_tdata; //滤波器输出信号
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
data_out <= 0;
end
else begin
data_out <= m_axis_data_tdata[33:26]; //根据仿真结果进行截位
end
end
//--------------调用FIR核----------------//
FIR FIR_inst0(
.aclk (clk),
.s_axis_data_tvalid (1), //拉高时IP核开始工作
.s_axis_data_tready (s_axis_data_tready),
.s_axis_data_tdata (s_axis_data_tdata), //输入信号
.m_axis_data_tvalid (m_axis_data_tvalid), //拉高时表明数据输出有效
.m_axis_data_tdata (m_axis_data_tdata) //输出信号
);
//---------------------------------------//
endmodule
需要注意的是:
m_axis_data_tdata 信号是滤波器的数据输出信号,我们在使用时一般都要对此数据进行截位操作,如何进行截位需要根据仿真结果来确定。比如,在这个工程中,我需要的滤波器的输出数据是8位,但不能一下子截取高8位,而且m_axis_data_tdata是个40位的数据,从仿真波形来看m_axis_data_tdata[39:34]都是符号位,因此从33位开始往下截取8位数据(当然也可以从34位开始截,这样的话就多了一位符号位,相应的数据位就变少了一位)。
3.去直流处理
经过FIR滤波后的波形其实就是一个叠加了直流分量的调制信号。在本工程中,AM调制是100%调制,也就是说解调时经过FIR后的信号的最小值为0,可以把它看作是无符号的数,直接经DA输出就行了。
如果不是100%调制呢?也就是说解调时经过FIR后的信号的最小值是大于0的,那么这个大于0的量就相当于直流,需要去掉后再经DA输出。
因此,在这个工程中,不需要去直流处理。下面给出顶层文件的代码。
- 顶层模块编写:
module TOP(
input clk,
input rst_n,
output [7:0] AM_demod
);
//--------------------------------//
reg signed [15:0] data_tdata;
wire signed [15:0] AM_mod;
//--------------------------------//
//-----------取绝对值-------------//
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
data_tdata <= 0;
end
else if(AM_mod[15] == 1) begin
data_tdata <= -{AM_mod}; //如果符号位是1,对数据取反
end
else if(AM_mod[15] == 0) begin
data_tdata <= AM_mod; //如果符号位是0,数据不变
end
else begin
data_tdata <= data_tdata;
end
end
//--------------------------------//
//-----------AM已调信号------------//
modulate modulate_inst0(
.clk (clk),
.rst_n (rst_n),
.AM_mod (AM_mod)
);
//--------------------------------//
//----------滤波器控制模块---------//
FIR_Control FIR_Control_inst2(
.clk (clk),
.rst_n (rst_n),
.s_axis_data_tdata (data_tdata),
.data_out (AM_demod)
);
//--------------------------------//
endmodule
4.解调仿真
- 编写TestBeach:
`timescale 1ns/1ps
module tb_AM();
//===================解调部分====================//
//----------接口设置----------//
reg sclk;
reg rst_n;
wire [7:0] AM_demod;
//--------------------------//
initial sclk = 1;
always #5 sclk = ~sclk; //100M时钟
initial begin
rst_n = 0;
#500
rst_n = 1;
end
//----------解调模块----------//
TOP TOP_inst(
.clk (sclk),
.rst_n (rst_n),
.AM_demod (AM_demod)
);
//---------------------------//
endmodule
- 仿真结果

由仿真结果可知,最终输出信号正确还原了已调制信号的包络,表明解调正确。
AM解调的FPGA实现的更多相关文章
- 【资讯】天啦鲁,这十余款创客设计居然由FPGA搞定 [转]
按理说‘高大上’的FPGA,多出现在航天航空(如火星探测器).通信(如基站.数据中心).测试测量等高端应用场景.但麦迪却也发现,近期,在很多创客的作品内部都有FPGA的影子.这或许也从侧面看出,打从总 ...
- 基于FPGA的红外遥控解码与PC串口通信
基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...
- FPGA与数字信号处理
过去十几年,通信与多媒体技术的快速发展极大地扩展了数字信号处理(DSP)的应用范围.眼下正在发生的是,以更高的速度和更低的成本实现越来越复杂的算法,这是针对高级信息服更高带宽以及增强的多媒体处理能力等 ...
- 如何学习FPGA
如何学习FPGA 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/k331922164/article/details/44626989 PS:笔者强 ...
- 基于FPGA的DDS设计(一)
最近在学习基于FPGA的DDS设计,借此机会把学习过程记录下来,当作自己的学习笔记也希望能够帮助到学习DDS的小伙伴. DDS(Direct Digital Synthesizer)直接数字合成器,这 ...
- DSP已经英雄迟暮了吗?FPGA才是未来的大杀器?
DSP技术,在某些人看来,或者已经面临着英雄迟暮的感觉,就我们当前所知道的.Freesacle.ADI.NXP早就停掉了新技术发展,而当前从大的方面说只剩下TI一家扛着Digital Si ...
- FPGA+ARM or FPGA+DSP?
网上有人说.现在的FPGA,ARM功能已经强大到无需DSP协助处理了,未来DSP会不会消声灭迹?是DSP取代FPGA和ARM,还是ARM,FPGA取代DSP呢?担心好不容易学精了DSP,结果DSP变成 ...
- 如何学好FPGA
http://bbs.elecfans.com/jishu_278578_1_1.html 掌握FPGA可以找到一份很好的工作,对于有经验的工作人员,使用FPGA可以让设计变得非常有灵活性.掌握了FP ...
- ARM、DSP、FPGA的技术特点和区别
在嵌入式开发领域,ARM是一款非常受欢迎的微处理器,其市场覆盖率极高,DSP和FPGA则是作为嵌入式开发的协处理器,协助微处理器更好的实现产品功能. 那三者的技术特点以及区别是什么呢?下文就此问题略做 ...
随机推荐
- js 跨域问题 汇总
前言 相信每一个前端er对于跨域这两个字都不会陌生,在实际项目中应用也是比较多的.但跨域方法的多种多样实在让人目不暇接.老规矩,碰到这种情况,就只能自己总结一篇博客,作为记录. 正文 1. 什么是跨域 ...
- html的布局demo
header section footer 都是水平,垂直居中,文本内容居中 section的高度是根据文本内容自适应的,footer会一直在最下面 <!DOCTYPE html> < ...
- vue中的checkbox全选和反选
前几天有个博客园的朋友问小颖,小颖之前写的vue2.0在table中实现全选和反选 .Vue.js实现checkbox的全选和反选,为什么他将里面的js复制下来,但是实现不了全选和反选.小颖当时看他 ...
- python 列表(list)常用操作
a = [1,2,3,4,1,1,1,1] 删除操作 删除元素1 a.remove(1) 删除第二个元素 del a[1] 默认删除最后一个,给脚标就会删除指定脚标元素 pop() 方法 a.pop( ...
- 错误:'dict' object is not callable
在晚上学习别人的代码,偶然爆出错误:'dict' object is not callable 找了半天没发现错误.后来还想上文已经有变量名为dict. 因此dict在下面程序中被认为是一个变量不是内 ...
- [linux] C语言Linux系统编程-TCP通信的11种状态
三次握手由client主动发出SYN请求, 此时client处于SYN_SENT状态(第一次握手)当server收到之后会由LISTEN转变为SYN_REVD状态, 并回复client, client ...
- JavaScript基础知识(JSON、Function对象、原型、引用类型)
19.JSON 概念:JavaScript 对象表示法(JavaScript Object Notation),是一种轻量级的数据交换格式 特点:易于程序员编写和查看:易于计算机解析和生成 数据结构 ...
- ajax跨站请求伪造
用ajax提交数据到后台: {#<!DOCTYPE html>#} <html lang="en"> <head> <meta chars ...
- Gym 100952H&&2015 HIAST Collegiate Programming Contest H. Special Palindrome【dp预处理+矩阵快速幂/打表解法】
H. Special Palindrome time limit per test:1 second memory limit per test:64 megabytes input:standard ...
- BC#65 T5 ZYB's Prime
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5594 完全不会啊TAT.. 其实官方题解已经说的很清楚了.. #include <cstdio> ...