1.算法仿真效果
vivado2019.2仿真结果如下(完整代码运行后无水印):
设置SNR=8db
设置SNR=20db
整体波形效果:
仿真操作步骤可参考程序配套的操作视频。
2.算法涉及理论知识概要
2.1 2ASK调制解调
2ASK调制解调是一种数字调制解调技术,它是基于ASK调制的一种数字调制方式。ASK调制是一种模拟调制方式,它是通过改变载波的振幅来传输数字信号。而2ASK调制解调则是将数字信号转换为二进制码,再通过改变载波的振幅来传输数字信号。 2ASK调制的原理是将数字信号转换为二进制码,然后将二进制码与载波信号相乘,得到调制信号。在解调时,将接收到的信号与载波信号相乘,再通过低通滤波器滤波,得到原始的数字信号。
2ASK是一种数字调制方式,其中“2”代表二进制,即调制信号只有两个幅度水平。在2ASK调制中,数字基带信号控制载波的幅度。当发送二进制“1”时,发送全幅度载波;当发送二进制“0”时,不发送信号,即无载波输出。因此,2ASK信号可以看作是基带脉冲序列与一个全幅度正弦波的乘积。2ASK的调制解调系统结构如下图所示:
假设我们的输入二进制序列为an,那么2ASK的调制过程可以用以下数学公式表示:
e2ASK(t) = Σan g(t - nTs) cos(ωct)
其中,g(t)是基带脉冲形状,Ts是基带脉冲间隔,ωc是载波的角频率。解调过程则是对接收到的信号进行包络检波,恢复出原始的二进制序列。
2.2 帧同步
在数字通信中,信息通常是以帧为单位进行组织和传输的。帧同步的目的是确定每一帧的起始位置,以便接收端能够正确地解调出每帧中的数据。
设发送的帧结构为:帧同步码 + 信息码元序列 。帧同步码是具有特定规律的码序列,用于接收端识别帧的起始。
帧同步的过程就是在接收序列中寻找与帧同步码匹配的位置,一旦找到匹配位置,就确定了帧的起始位置,后续的码元就可以按照帧结构进行正确的划分和处理。
3.Verilog核心程序
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2023/10/18 19:57:39 // Design Name: // Module Name: FSK_demod // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // ....................................................... wire signed[15:0]o_cosr1; wire[31:0]m_axis_data_tdatar1; dds_compiler_0 dds_compiler_u5(.aclk (i_clk), // input wire aclk.aresetn (~i_rst), // input wire aresetn.s_axis_config_tvalid(1'b1), // input wire s_axis_config_tvalid.s_axis_config_tdata(32'h03ff_ffff), // input wire [31 : 0] s_axis_config_tdata.m_axis_data_tvalid(), // output wire m_axis_data_tvalid.m_axis_data_tdata(m_axis_data_tdatar1), // output wire [31 : 0] m_axis_data_tdata.m_axis_phase_tvalid(), // output wire m_axis_phase_tvalid.m_axis_phase_tdata() // output wire [31 : 0] m_axis_phase_tdata ); assign o_cosr1=m_axis_data_tdatar1[15:0]; always @(posedge i_clk or posedge i_rst) beginif(i_rst)begino_de_2ask <= 32'd0;end else begino_de_2ask <= $signed(i_2ask)*$signed(o_cosr1);end end fiter1 fiterU1( .i_clk (i_clk), .i_rst (i_rst), .i_din (o_de_2ask[24:9]), .o_dout (o_de_2askf) );................................................ //帧同步,提取数据,去帧头 frame_syn frame_syn_u( .i_clk (dat_clk), .i_rst (i_rst), .i_bits (o_bits), .o_bits_data (o_bits_data), .o_bits_head (o_bits_head), .o_peak (o_peak), .o_en_data (o_en_data), .o_en_pn (o_en_pn), .o_frame_start (o_frame_start) ); endmodule