基于FPGA的基础数字 AM 调制/解调系统设计Verilog代码VIVADO仿真

名称:基于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
源代码

 扫描文章末尾的公众号二维码

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值