名称:基于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
992