一、说明:

  1. 功能:AM解调
  2. 平台: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) beginif(!rst_n)  begindata_tdata <= 0;endelse if(AM_mod[15] == 1)  begindata_tdata <= -{AM_mod};       //如果符号位是1,对数据取反endelse if(AM_mod[15] == 0) begindata_tdata <= AM_mod;          //如果符号位是0,数据不变endelse    begindata_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) beginif(!rst_n)    begindata_out <= 0;endelse  begindata_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) beginif(!rst_n) begindata_tdata <= 0;endelse if(AM_mod[15] == 1)  begindata_tdata <= -{AM_mod};       //如果符号位是1,对数据取反endelse if(AM_mod[15] == 0) begindata_tdata <= AM_mod;          //如果符号位是0,数据不变endelse    begindata_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/1psmodule tb_AM();//===================解调部分====================//
//----------接口设置----------//
reg     sclk;
reg     rst_n;
wire    [7:0]   AM_demod;
//--------------------------//
initial     sclk = 1;
always  #5  sclk = ~sclk;      //100M时钟initial beginrst_n = 0;#500rst_n = 1;
end
//----------解调模块----------//
TOP             TOP_inst(.clk       (sclk),.rst_n       (rst_n),.AM_demod   (AM_demod)
);
//---------------------------//endmodule
  • 仿真结果

    由仿真结果可知,最终输出信号正确还原了已调制信号的包络,表明解调正确。

AM解调的FPGA实现相关推荐

  1. 4fsk调制matlab_数字调制解调技术的MATLAB与FPGA实现

    <数字调制解调技术的MATLAB与FPGA实现>包含2个版本.Xilinx/VHDL版的设计平台为ISE14.7/VHDL,配套开发板为CXD301:Altera/Verilog版的设计平 ...

  2. QPSK调制解调FPGA实现成果展示:

    目录 QPSK调制解调使用参数: 调制: 解调: FPGA工程架构: 仿真参数: 仿真展示: 调制: 解调: MATLAB星座图展示: QPSK调制解调使用参数: 采样率为4M,符号速率为1M,载波速 ...

  3. matlab实现ofdm调制解调,基于ofdm的调制解调原理,ofdm调制解调fpga代码 - 全文

    OFDM介绍 OFDM ( Orthogona lFrequency D iv isionM ulTIplex ing) 即正交频分复用技术, 实际上 OFDM 是 MCM M ult-iC arri ...

  4. msk调制 vhdl_基于FPGA的MSK调制解调器的设计与仿真

    论文编号:JD1172  论文字数:10913,页数:35  附任务书,开题报告,文献综述,外文翻译,中期检查 毕业设计说明书(论文)中文摘要 本文根据数字信号MSK调制和解调的工作原理,采用模块化设 ...

  5. ★教程2:fpga学习教程入门100例目录

    1.订阅本教程用户可以免费获得本博任意2个(包括所有免费专栏和付费专栏)博文对应代码: 2.本FPGA课程的所有案例(部分理论知识点除外)均由博主编写而成,供有兴趣的朋友们自己订阅学习使用.未经本人允 ...

  6. planahead 动态重构_部分动态可重构

    摘要:针对调制样式在不同环境下的变化,采用了FPGA部分动态可重构的新方法,通过对不同调制样式信号的解调模块的动态加载,来实现了不同环境下针对不同调制样式的解调这种方式比传统的设计方式具有更高的灵活性 ...

  7. 【AGC+FPGA】基于FPGA的数字AGC自适应增益设计,应用在BPSK调制解调系统中

    AGC测试,这里我们主要通过产生一个信号,输入到AGC中,来分析AGC的工作效果,其仿真结果如下 图所示: 这里,我们使用测试信号的时候,通过输入一个正弦信号,实现AGC的功能. BPSK解调部分,这 ...

  8. 【混沌加解密调制解调】基于FPGA的混沌自同步混沌数字保密通信系统

    1.软件版本 quartusii12.1 2.本算法理论知识 本系统的基本结构,我们遵循你所提供的结构进行,整个框图如下所示: 各个部分的功能如下: 加密算法模块采用异或运算,它将来自信源编码的二进制 ...

  9. 基于FPGA的AM信号调制与解调详细步骤

    详细程序及原理参考原文: FPGA学习(二)--实现AM信号调制与解调 - 子木的文章 - 知乎 https://zhuanlan.zhihu.com/p/37203478 使用的软件是Vivado ...

最新文章

  1. hbctraining-05_peak_calling_macs2
  2. ssh遇到port 22:No route to host问题的解决方法
  3. python进阶 多线程编程 —— threading和queue库实现多线程编程
  4. 华为手机上的网上邻居怎么用_只要华为手机用上鸿蒙OS2.0,刚买的手机我也马上换!...
  5. 串口与并口有什么区别?
  6. VS自带数据库SqlExpress
  7. 【BZOJ2109/2535】【NOI2010】航空管制(贪心)
  8. ios开发的p12和provision
  9. vuex存储什么数据_Redis除了存储数据以外还能做什么?
  10. 用python画蟒蛇
  11. 净化网络环境 ASP程序实现过滤脏话
  12. C语言实现MD5加密算法
  13. “x = a if b else c“是啥意思?【赋值表达式】【if语句】
  14. 腾讯云数据库 CynosDB应用场景与产品优势有哪些?
  15. 智慧医疗健康领域数字孪生应用框架
  16. Azure虚拟机挂载数据磁盘
  17. 通过postgis将shp格式数据导入postgresql数据库
  18. android经纬度获取行政区,获取当前经纬度、当前位置省市区(工具类)
  19. Java 云原生微服务框架 Quarkus 入门实践
  20. Arcgis的proxy使用

热门文章

  1. (转)搜狗浏览器收藏夹文件恢复
  2. Pencil:免费的手绘风格开源原型图设计工具(转载)
  3. Moto E6 安装Anyview完全手册
  4. word文件的打开密码忘记了怎么办
  5. 如何让DIV相对于body水平和垂直居中
  6. 基于FPGA的数字计数器
  7. 单片机黑屏怎么回事儿_逻辑板损坏后常见的故障现象有黑屏
  8. 计算机二级考试和一建哪个难,一建比二建难很多吗?终于明白了
  9. 为什么使用三维激光扫描技术?
  10. Test-Time Training