AM调制的FPGA实现
一、说明:
- 功能:AM调制
- 平台:Vivado 2016.4 和 Matlab R2017a
二、原理:
1. AM调制原理
AM已调信号的时域表达式:

已调信号的频域表达式:

本质上AM调制就是频谱的搬移。AM调制的系统框图
将调制信号加上一个直流分量,保证信号的最小值大于零,然后再和载波相乘,得到已调信号。
三、AM调制的FPGA实现
1.产生调制信号和载波信号
调用ROM IP核在FPGA内部产生两路余弦信号,其中一路信号用于模拟外部输入的调制信号,另一路用作载波信号。
在配置ROM IP核之前,需要用Matlab生.coe文件,存放在ROM核里。
- Matlab生成.coe文件:
%---------------------------------%
width=8; %设置rom的位宽
depth=1024; %设置rom的深度
%---------------------------------%
x=linspace(0,2*pi,depth); %在一个周期内产生depth个采样点
y_cos=cos(x); %生成余弦函数
%y_cos=sin(x); %生成正弦函数
%y_cos=round(y_cos*(2^(width-1)-1))+2^(width-1)-1; %将数据转化成整数,生成无符号数
y_cos=round(y_cos*(2^(width-1)-1)); %将数据转化成整数,生成有符号数
plot(x,y_cos); %绘图
fid = fopen('E:\Workspace\DDS\Design\IP_Core\cos.coe','wt');
fprintf(fid,'memory_initialization_radix = 10;\nmemory_initialization_vector = ');
for i = 1 : depth
if mod(i-1,8) == 0
fprintf(fid,'\n');
end
fprintf(fid,'%6d,',y_cos(i));
end
fclose(fid); %关闭文件
生成.coe文件后就可以进行IP核的配置了。
- ROM核具体配置:




配置完IP核后,编写控制模块,产生两路信号。其中,调制信号上叠加的直流分量的大小为调制信号的峰值,这样将得到调制度为100%的已调信号。如果要得到不同的调制度,则需要叠加不同大小的直流分量,同时需要注意定义的数据位宽,防止数据溢出。
- 产生载波和带有直流分量的调制信号:
module cos_make(
input clk,
input rst_n,
output reg [7:0] cos_s,
output reg signed [7:0] cos_c
);
//------------------------------------//
parameter freq_s = 32'd429497; //调制信号频率10k
parameter freq_c = 32'd42949673; //载波频率1M
parameter cnt_width = 8'd32;
//------------------------------------//
//------------------------------------//
reg [cnt_width-1:0] cnt_s = 0;
reg [cnt_width-1:0] cnt_c = 0;
wire [9:0] addr_s;
wire [9:0] addr_c;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cnt_s <= 0;
cnt_c <= 0;
end
else begin
cnt_s <= cnt_s + freq_s;
cnt_c <= cnt_c + freq_c;
end
end
assign addr_s = cnt_s[cnt_width-1:cnt_width-10];
assign addr_c = cnt_c[cnt_width-1:cnt_width-10];
//------------------------------------//
//------------调用ROM核----------------//
wire signed [7:0] cos_s_r;
wire signed [7:0] cos_c_r;
ROM ROM_inst(
.clka (clk),
.addra (addr_s),
.douta (cos_s_r),
.clkb (clk),
.addrb (addr_c),
.doutb (cos_c_r)
);
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cos_s <= 0;
cos_c <= 0;
end
else begin
cos_s <= cos_s_r + 8 'd128; //加上大小为峰值的直流分量
cos_c <= cos_c_r;
end
end
endmodule
2.生成AM调制信号
得到两路信号后就可以用乘法器将两路信号相乘,得到已调信号。
乘法器具体配置:


AM调制的顶层模块:
module modulate(
input clk,
input rst_n,
output signed [15:0] AM_mod
);
wire [7:0] cos_s;
wire signed [7:0] cos_c;
//------------调用出波模块------------//
cos_make cos_make_inst0(
.clk (clk),
.rst_n (rst_n),
.cos_s (cos_s),
.cos_c (cos_c)
);
//-----------------------------------//
//------------调用乘法器--------------//
MULT MULT_inst1(
.CLK (clk),
.A (cos_s),
.B (cos_c),
.P (AM_mod)
);
endmodule
3.仿真调制结果
以上AM调制过程基本完成,但是正确与否还需要通过仿真来确定,接下来编写仿真用的测试模块。
- TestBeach的编写:
`timescale 1ns/1ps
module tb_AM();
//---------接口设置----------//
reg sclk;
reg rst_n;
wire signed [15:0] AM_mod;
//--------------------------//
initial sclk = 1;
always #5 sclk = ~sclk; //100M时钟
initial begin
rst_n = 0;
#500
rst_n = 1;
end
//--------------------------//
modulate modulate_inst0(
.clk (sclk),
.rst_n (rst_n),
.AM_mod (AM_mod)
);
endmodule
在Vivado中将各个文件添加进工程后,运行仿真。
- 仿真结果如下:


已调信号能明显看到包络,并且包络的频率同调制信号一致,表明AM调制正确。
AM调制的FPGA实现的更多相关文章
- AM解调的FPGA实现
一.说明: 功能:AM解调 平台:Vivado 2016.4 和 Matlab R2017a 二.原理: 1.AM解调原理 模拟电路中采用"包络检波"的方法: 数字电路中采用类似的 ...
- 我的 FPGA 学习历程(14)—— PWM 脉冲宽度调制
PWM 是一种调节输出功率的技术(俗称调压),其原理在于改变输出方波的占空比,具体输出见下图: 输出信号为电压值,当负载为恒阻时,上图中的输出功率分别为 25%.50%.75%. 实现方法如下: 设置 ...
- [FPGA]Verilog利用PWM调制巧妙完成RGB三色彩虹呼吸灯(给简约的题目以美妙的解答)
概述 实现彩虹呼吸灯 题目就是这么简短,但这是目前我碰到的最有意思的一道题目,因为他有无数种解决方法,并且每一种都是那么高级或者巧妙,比如 可以利用3路不同初相的PWM调制信号驱动三颗RGB灯重叠呼吸 ...
- 【资讯】天啦鲁,这十余款创客设计居然由FPGA搞定 [转]
按理说‘高大上’的FPGA,多出现在航天航空(如火星探测器).通信(如基站.数据中心).测试测量等高端应用场景.但麦迪却也发现,近期,在很多创客的作品内部都有FPGA的影子.这或许也从侧面看出,打从总 ...
- FPGA串口波特率简析
以前用单片机,一直都是直接用就行,设置波特率时,直接写9600就行,一直没有仔细考虑过,今天打算用FPGA写个串口程序时才知道,原来根本就是没弄明白.一下是我的一些见解.如果诸位看官觉得不对,欢迎指正 ...
- 上海招聘FPGA讲师(专兼职均可)
上海招聘FPGA讲师(专兼职均可) 招聘FPGA培训讲师(专兼职均可) 诚聘FPGA培训讲师_软件无线电方向 ◆精通FPGA设计方法及技巧 ◆精通无线电知识及System View设计方法,有基于Sy ...
- 基于FPGA的红外遥控解码与PC串口通信
基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...
- 基于FPGA的OLED真彩色动态图像显示的实现
源:基于FPGA的OLED真彩色动态图像显示的实现 作为第3代显示器,有机电致发光器件(Organic Light Emitting Diode,OLED)由于其主动发光.响应快.高亮度.全视角.直流 ...
- 【小梅哥FPGA进阶教程】第九章 基于串口猎人软件的串口示波器
九.基于串口猎人软件的串口示波器 1.实验介绍 本实验,为芯航线开发板的综合实验,该实验利用芯航线开发板上的ADC.独立按键.UART等外设,搭建了一个具备丰富功能的数据采集卡,芯航线开发板负责进行数 ...
随机推荐
- Gulp 插件及其使用
前端现在有很多的自动打包工具,各有优缺点,而gulp作为其中的一员,也有着很受人们的青睐,简单粗暴,然而gulp本身并没有提供很多的API,真正的一些工作则是靠着插件完成的,本文简单介绍一些常用的gu ...
- 从Unity中的Attribute到AOP(四)
本篇我们将逐一讲解Unity中经常使用的Attribute(Unity对应的文档版本为2018.1b). 首先是Serializable,SerializeField以及NonSerialized,H ...
- css 两端对齐的多种实现方式
http://www.cnblogs.com/PeunZhang/p/3289493.html
- Django--权限组件
创建组件 需求分析: 创建独立app, rbac ##注意: app创建后需要注册到setting.py中 INSTALLED_APPS = [ 'django.contrib.admin', 'dj ...
- 【Java】synchronized与lock的区别
从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock. 也许有朋友会问,既然都可以通过synchronized来实现同步访问了 ...
- 51Nod 1091 线段的重叠(贪心+区间相关,板子题)
1091 线段的重叠 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 2 ...
- DFS中的奇偶剪枝学习笔记
奇偶剪枝学习笔记 描述 编辑 现假设起点为(sx,sy),终点为(ex,ey),给定t步恰好走到终点, s | | | + — — — e 如图所示(“|”竖走,“—”横走,“+”转弯),易证abs( ...
- Codeforces Round #451 (Div. 2)-898A. Rounding 898B.Proper Nutrition 898C.Phone Numbers(大佬容器套容器) 898D.Alarm Clock(超时了,待补坑)(贪心的思想)
A. Rounding time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...
- BZOJ1304: [CQOI2009]叶子的染色
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1304 树形dp. 可以发现其实根选在哪里都是没有问题的. f[u][0],f[u][1],f[ ...
- c++(非递归排序)
在上面一篇博客当中,我们发现普通查找和排序查找的性能差别很大.作为一个100万的数据,如果使用普通的查找方法,那么每一个数据查找平均下来就要几十万次,那么二分法的查找呢,20多次就可以搞定.这中间的差 ...