一、说明:

  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) 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实现的更多相关文章

  1. 【资讯】天啦鲁,这十余款创客设计居然由FPGA搞定 [转]

    按理说‘高大上’的FPGA,多出现在航天航空(如火星探测器).通信(如基站.数据中心).测试测量等高端应用场景.但麦迪却也发现,近期,在很多创客的作品内部都有FPGA的影子.这或许也从侧面看出,打从总 ...

  2. 基于FPGA的红外遥控解码与PC串口通信

    基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...

  3. FPGA与数字信号处理

    过去十几年,通信与多媒体技术的快速发展极大地扩展了数字信号处理(DSP)的应用范围.眼下正在发生的是,以更高的速度和更低的成本实现越来越复杂的算法,这是针对高级信息服更高带宽以及增强的多媒体处理能力等 ...

  4. 如何学习FPGA

    如何学习FPGA 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/k331922164/article/details/44626989 PS:笔者强 ...

  5. 基于FPGA的DDS设计(一)

    最近在学习基于FPGA的DDS设计,借此机会把学习过程记录下来,当作自己的学习笔记也希望能够帮助到学习DDS的小伙伴. DDS(Direct Digital Synthesizer)直接数字合成器,这 ...

  6. DSP已经英雄迟暮了吗?FPGA才是未来的大杀器?

          DSP技术,在某些人看来,或者已经面临着英雄迟暮的感觉,就我们当前所知道的.Freesacle.ADI.NXP早就停掉了新技术发展,而当前从大的方面说只剩下TI一家扛着Digital Si ...

  7. FPGA+ARM or FPGA+DSP?

    网上有人说.现在的FPGA,ARM功能已经强大到无需DSP协助处理了,未来DSP会不会消声灭迹?是DSP取代FPGA和ARM,还是ARM,FPGA取代DSP呢?担心好不容易学精了DSP,结果DSP变成 ...

  8. 如何学好FPGA

    http://bbs.elecfans.com/jishu_278578_1_1.html 掌握FPGA可以找到一份很好的工作,对于有经验的工作人员,使用FPGA可以让设计变得非常有灵活性.掌握了FP ...

  9. ARM、DSP、FPGA的技术特点和区别

    在嵌入式开发领域,ARM是一款非常受欢迎的微处理器,其市场覆盖率极高,DSP和FPGA则是作为嵌入式开发的协处理器,协助微处理器更好的实现产品功能. 那三者的技术特点以及区别是什么呢?下文就此问题略做 ...

随机推荐

  1. dm-verity

    一.Device Mapper: dm-verity是内核子系统的Device Mapper中的一个子模块,所以在介绍dm-verity之前先要介绍一下Device  Mapper的基础知识. Dev ...

  2. CSS基础知识(颜色、伪类、盒子模型)

    6.设置颜色单位 L    普通英文单词 {color : 属性值red;} 此方法简单,便捷.但设置的颜色在不同浏览器中,可能显示的颜色出现差异 * 三原色 - 红.绿.蓝 L   颜色的八进制方式 ...

  3. [51nod1357]密码锁

    有一个密码锁,其有N位,每一位可以是一个0~9的数字,开启密码锁需要将锁上每一位数字转到解锁密码一致.这个类似你旅行用的行李箱上的密码锁,密码锁的每一位其实是一个圆形转盘,上面依次标了0,1,...9 ...

  4. 2017广东工业大学程序设竞赛E题(倒水)

    Description 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水量相同的瓶子,把一个 ...

  5. Redis介绍及Jedis测试

    1.Redis简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes ...

  6. GO开发[四]:golang函数

    函数 1.声明语法:func 函数名 (参数列表) [(返回值列表)] {} 2.golang函数特点: a. 不支持重载,一个包不能有两个名字一样的函数 b. 函数是一等公民,函数也是一种类型,一个 ...

  7. C# 构造器总结

    在C#中,构造器分为实例构造器和类型构造器, 一.实例构造器 构造引用类型的对象时,在调用实例 构造器之前,为对象分配的内存总是归0,没有被构造器显示重写的字段都保证获得0或null的值 在一个类中, ...

  8. 在.Net中将RocketMQ跑起来_入门篇【2】

    上一篇讲了如何再控制台将RocketMQ跑起来,本篇讲解,在asp.net mvc种跑起来,含(发布.订阅). 本次将不挨个贴源码,直接展示目录,根据上一篇文章,进行相应的调整即可. 1.新建一个类库 ...

  9. [随笔] 简单操作解决Google chrome颜色显示不正常的情况

    最近在用Linuxmint 真的是极友好的桌面Linux啊,然后用最新的Linuxmint自带的Firefox浏览器上网,发现颜色都变成了红色黄色变绿色,以为是显卡的问题,搞了一阵,无果.果断换Goo ...

  10. SpringMVC Hello(IDEA)

    以前一想要学习Java相关知识的时候,就会认为.NET FrameWork的相关技术还没学个通透还夹生饭.现在感觉只会.NET有些单一,需要多掌握几种开发技术,尽管.NET还没达到精通.貌似Hello ...