名称:基于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 调制、包络解调的数字实现方法;
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
e) 设计其他波形的基波,绘制基波、载波、AM调制波波形图并标明参数(可选)
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
一、包络检波设计实现(25分)
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
源代码
扫描文章末尾的公众号二维码