名称:基于FPGA的基础数字 AM 调制/解调系统设计Verilog代码VIVADO仿真
软件:VIVADO
语言:Verilog
代码功能:
? 任务
本课程设计需要搭建一个基础数字?AM?调制/解调系统,该系统在?FPGA?的控制下,实现:
(1)FPGA?内实现数字?DDS?可调频率的正弦波输出。
(2)FPGA?内实现低频正弦 信号对?DDS?中频的?AM?包络调制输出,并?DA?输出得到调制波形。
(3)通过?AD?采集进行包络解调恢复调制波。
(4)拓展综合任务设计,完成正交解调。
?要求
1、理解通信原理中调制、解调技术和实现原理;
2、理解?FPGA?的实现工艺,与?HDL?的关系;
3、掌握?ISE?的?FPGA?开发方法;
4、掌握?DDS?的?FPGA?实现原理及方法;
5、掌握?AM?调制、包络解调的数字实现方法;
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
设计报告
a)关键参数
|
时钟频率: |
100MHz |
|
输出位宽: |
8bit |
|
相位控制字位宽: |
16bit |
|
频率控制字位宽: |
16bit |
|
频率精度: |
1525.88Hz |
输出频率计算: f=100MHz* N/2^16 ? (N为频率控制字)
2、DDS设计实现(5分)
a)输入系统时钟频率为 ?100MHz
b)设计产生 1525.88 Hz正弦波,其频率控制字为 ? 1 ? ,相位控制字为 0
c)设计产生 22888.2 Hz正弦波,其频率控制字为 ?15 ? ,相位控制字为 0
d)设计产生其他波形,绘制波形图并标明波形基本参数(选做)
3、DDS设计仿真记录(8分)
a)DDS输出波形图


b)DDS输出波形频率、振幅、均值
频率=1525.88Hz,
振幅为0~255,
均值为125
1、 AM调制设计实现(8分)
a) 系统时钟频率为 100MHz
b) 设计基波102233.88 Hz正弦波,其频率控制字为 67 ? ?,相位控制字为 0
c) 设计载波6.103 MHz正弦波,其频率控制字为 4000 ?,相位控制字为 0
d) 设计调制深度为 ?0.502
2、 AM调制仿真记录(10分)
a) 输入基波波形图,标明频率、振幅、均值


频率=102233.88Hz,幅值为63~190;均值为126.5
b) 输入载波波形图,标明频率、振幅、均值



频率=6.103MHz,幅值为-126~126;均值为0
c) 输出AM调制波波形图,标明频率、最大最小振幅、均值、调制深度


包络频率:=102233.88Hz
载波频率:=6.103MHz
最大振幅:173
最小振幅:141
信号均值:126
调制深度:
Vmax=173-126=47
Vmim=141-126=15
调制深度Ma=(47-15)/(47+15)=0.516
1、 包络检波设计实现(8分)
a) 系统时钟频率为 ?100MHz
b) 设计中FIR数字低通滤波器截止频率为 1MHz ? ,请介绍滤波器的设计依据。
因为载波频率为6.103MHz,基波频率为102.2KHz,为滤除6.103MHz的频率,可以将截止频率设置为1MHz,即低于1MHz的频率可以通过,高于1MHz的将被滤除。
2、 包络检波仿真记录(10分)
a) 待处理的AM调制波形图,标明频率、最大最小振幅、均值、调制深度

包络频率:=102233.88Hz=102.23KHz
载波频率:=6.103MHz
最大振幅:173
最小振幅:141
信号均值:126
调制深度:
Vmax=173-126=47
Vmim=141-126=15
调制深度Ma=(47-15)/(47+15)=0.516
b) 检波后输出波形图,标明频率、振幅、均值


输出频率:根据周期计算约等于103.09KHz(由于是肉眼观察周期计算均值,故存在一点误差,属于正常现象)
输出振幅:1239~3838
信号均值:1299.5
部分代码展示:
`timescale?1ns?/?1ps
module?AM(
????input?clk_100,
????input?AM_rst,
????input?[7:0]?f,?//am调制基波频率
????output?[7:0]?am_output_data?//am调制输出波形
????);
wire?clk_100;
wire?AM_rst;
wire?DDS_core_rst_n;
wire?[7:0]?f;
reg?[7:0]?am_output_data;
wire?[7:0]?dds1_output_data;
wire?[7:0]?add1_output_data;
wire?[7:0]?dds2_output_data;
wire?[15:0]?mult_output_data;
wire?[15:0]?add2_output_data;
assign?DDS_core_rst_n?=?~AM_rst;
always?@(posedge?clk_100)?
begin
if(AM_rst)?
begin
am_output_data?<=?0;
end?
else?
begin
am_output_data?<=?{1'b0,add2_output_data[15:9]}?+?8'b0011_1111;
end
end
DDS?dds1
(
????.dds_clk_100(clk_100),?//工作时钟100M
????.dds_rst(AM_rst),
????.dds_f({8'b0000_0000,f}),?//频率控制
????.dds_p(16'd0),?//相位控制
????.dds_a(8'd2?),?//幅度控制
????.dds_data_output(dds1_output_data)?//输出
????);
????c_addsub_1?add1?
????(
.A(dds1_output_data),??????//?input?wire?[7?:?0]?A
.B(8'b0011_1111),??????//?input?wire?[7?:?0]?B
.CLK(clk_100),??//?input?wire?CLK
.S(add1_output_data)??????//?output?wire?[7?:?0]?S
);
????dds_compiler_0?dds2?
????(
.aclk(clk_100),????????????????????????????????//?input?wire?aclk
.aresetn(DDS_core_rst_n),
.m_axis_data_tvalid(),????//?output?wire?m_axis_data_tvalid
.m_axis_data_tdata(dds2_output_data),??????//?output?wire?[7?:?0]?m_axis_data_tdata
.m_axis_phase_tvalid(),??//?output?wire?m_axis_phase_tvalid
.m_axis_phase_tdata()????//?output?wire?[15?:?0]?m_axis_phase_tdata
);
mult_gen_0?mult?
(
.CLK(clk_100),??//?input?wire?CLK
.A(dds2_output_data),??????//?input?wire?[7?:?0]?A
.B(add1_output_data),??????//?input?wire?[7?:?0]?B
.P(mult_output_data)??????//?output?wire?[15?:?0]?P
);
c_addsub_0?add2?
(
.A(mult_output_data),??????//?input?wire?[15?:?0]?A
.CLK(clk_100),??//?input?wire?CLK
.S(add2_output_data)??????//?output?wire?[15?:?0]?S
);
endmodule
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=850
695