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等外设,搭建了一个具备丰富功能的数据采集卡,芯航线开发板负责进行数 ...
随机推荐
- 大白话说Java泛型(一):入门、原理、使用
文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java泛型(一):入门.原理.使用> 远在 JDK 1.4 版本的时候,那时候是没有泛型的概念的.当时 Java 程序员们写集合类的 ...
- 使用筛选器特性标记方法解决webapi 跨域问题
在我的之前随笔 解决api.WebService跨域问题 中有人问到可以用特性来解决跨域问题吗,答案是肯定的,可以的:操作如下: 首先建一个类CrossSiteAttribute:从抽象 Action ...
- Python pandas ERROR 2006 (HY000): MySQL server has gone away
之前在做python pandas大数据分析的时候,在将分析后的数据存入mysql的时候报ERROR 2006 (HY000): MySQL server has gone away 原因分析:在对百 ...
- 【jQuery】(6)---jQuery validate插件
jQuery validate插件 一.导入js库 先导入jQuery库,然后导入Validate插件,如果是中文提示还需要 ...
- Springboot(一):使用Intellij中的Spring Initializr来快速构建Spring Boot工程
使用Intellij中的Spring Initializr来快速构建Spring Boot工程 New---Project 可以看到图所示的创建功能窗口.其中Initial Service Url指向 ...
- 前端 IoC 理念入门
背景 近几年,前端应用(WebApp)正朝着大规模方向发展,在这个过程中我们会对项目拆解成多个模块/组件来组合使用,以此提高我们代码的复用性,最终提高研发效率. 在编写一个复杂组件的时候,总会依赖其他 ...
- CSS的box-sizing属性
box-sizing属性可以为三个值之一:content-box(default),border-box,padding-box. content-box,border和padding不计算入widt ...
- Codeforces Round #345 (Div. 2)【A.模拟,B,暴力,C,STL,容斥原理】
A. Joysticks time limit per test:1 second memory limit per test:256 megabytes input:standard input o ...
- bzoj usaco 金组水题题解(2)
续.....TAT这回不到50题编辑器就崩了.. 这里塞40道吧= = bzoj 1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害 比较经典的最小割?..然而 ...
- UVa 12186 树形dp
题意 分析 白皮书 P282 例题9-12 AC代码 #include <stdio.h> #include <math.h> #include <string. ...