DDS产生波形及AM FM调制解调原理
原视频链接:https://www.bilibili.com/video/BV17W411i7zQ?t=1469
该博客主要是观看完上述视频链接后做的笔记:
如有侵权,请联系我删除,谢谢。
一、FPGA工程搭建
1.采用的是Basys3开发板,芯片型号为:xc7a35tcpg236-1
2.调用block ram,生成IP,ram位宽为8bit,深度为1024.
3.采用matlab生成波形文件:
SIN_COS_MAKER.M
%---------------------------------%
width = 8; %设置bram的位宽
depth = 1024; %设置bram的深度
%---------------------------------%
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('C:\Users\10242\Desktop\2018_1_21_DDS\cos_8_1024_signed.coe','wt');
fprintf(fid,'memory_initialization_radix = 10;\n');
fprintf(fid,'memory_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); %关闭文件
4.正弦波代码生成编写
module dds_cos(
input clk,
input rst_n,
output reg [7:0] cos_a,
output reg signed [7:0] cos_b
);
//---------------------------------------//
//FreqWord = 2^32 * freq / sysclk
parameter freq_a = 32'd4294967; //----->100k
parameter freq_b = 32'd42949673; //----->1M
parameter cnt_width = 8'd32;
parameter rom_addr_width = 10;
//---------------------------------------//
//---------------------------------------//
reg [cnt_width-1:0] cnt_a;
reg [cnt_width-1:0] cnt_b;
wire [rom_addr_width-1:0] addr_a;
wire [rom_addr_width-1:0] addr_b;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cnt_a <= 0;
cnt_b <= 0;
end
else begin
cnt_a <= cnt_a + freq_a;
cnt_b <= cnt_b + freq_b;
end
end
assign addr_a = cnt_a[cnt_width-1:cnt_width-rom_addr_width];
assign addr_b = cnt_b[cnt_width-1:cnt_width-rom_addr_width];
//------------------------------------------//
//-------------调用ROM核---------------------//
wire signed [7:0] cos_a_r;
wire signed [7:0] cos_b_r;
ROM ROM_inst(
.clka (clk),
.addra (addr_a),
.douta (cos_a_r),
.clkb (clk),
.addrb (addr_b),
.doutb (cos_b_r)
);
//-------------------------------------------//
//-------------------------------------------//
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cos_a <= 0;
cos_b <= 0;
end
else begin
//加128会将有符号数据变为无符号数据;
//正常ILA看波形数据时都是看有符号数据才是正弦波,DA识别的也是有符号数据;
//但是有时候数据在进行处理时是进行无符号数据的处理,此时就需要加128
cos_a <= cos_a_r + 8'd128;
cos_b <= cos_b_r;
end
end
endmodule
二、AM调制原理
1.A0是一个直流分量,m(t)是需要调制的信号(AD采样进来的信号),cos(wt)是载频(10M、50M的那种,FPGA内部产生的正弦波),载频是一个有符号型的
2.直流分量是有要求的,要求必须大于信号的1/2峰峰值,使得加入直流分量后整个信号都在x轴上方。否则解调出来的会不对,造成失真。
3.包络解波:
模拟电路的方法是:一个二极管加一个电阻、电容实现的包络解波。
数字电路的方法是:接收到信号进行取绝对值,将负信号转为正信号,然后经过低通滤波器将载频滤掉。
4.频域分量有一个w+wc和一个w-wc,解调的时候滤波器的截至频率要低于w-wc
三、FM调制原理
FM与AM的非官方定义:
AM:载波 幅度 随着调制信号 频率 的变化而变化;
FM:载波 频率 随着调制信号 幅度 的变化而变化;
1.
2.FM:载波 频率 随着调制信号 幅度 的变化而变化…过程解析:
当调制信号的幅值为0时,载波的频率等于原载波的频率;
当调制信号的幅值为+1/2峰峰值时,载波的频率小于原载波的频率;
当调制信号的幅值为正峰值时,载波的频率达到最小;
当调制信号的幅值为负峰值时,载波的频率达到最大;
3.例子:
(图片中2的14次方与2的n次方,需要注意),下图可以理解为一个14bit的AD,采集一个50khz的正弦波数据。最终得出来得N为在任意时刻得频率控制字
FreqWord = 2^32 * freq / sysclk
所以:freq_word为载波的频率控制字,N为任意时刻的频率控制字
4.解调