m基于FPGA的带相位偏差64QAM调制信号相位估计和补偿算法verilog实现,包含testbench

209 阅读1分钟

1.算法仿真效果

 

本系统进行了Vivado2019.2平台的开发,其中Vivado2019.2仿真结果如下:

859dc20a66e286a86822012e98b72640_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

将FPGA的仿真结果导入到matlab中,显示星座图,结果如下所示:

ba9b1b374b2bdb392bcbaf22239bcdb1_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png   5fbc05f0e17023a3452bd37d854f104f_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

2.算法涉及理论知识概要

 

        在现代通信系统中,调制技术是实现高速数据传输和频谱效率优化的重要手段。其中,64QAM调制技术是一种常见的高阶调制技术,可以实现每个符号传输6个比特的信息,从而提高数据传输速率。然而,在实际应用中,调制信号往往会受到各种干扰和失真的影响,导致传输错误率增加。因此,相位估计和补偿技术是调制信号解调和恢复的关键环节之一。介绍一种用于带相位偏差64QAM调制信号相位估计和补偿的VV算法,并详细阐述其实现步骤和数学原理。

4.png

5.png

6.png

7.png

8.png

3.Verilog核心程序 `module TEST;

 

reg clk;

reg rst;

reg start;

 

    wire  [5:0] parallel_data;

    wire [15:0]sin;

    wire [15:0]cos;

wire signed[19:0]  I_com;

wire signed[19:0]  Q_com;

wire signed[19:0]  I_com2;

wire signed[19:0]  Q_com2;

    wire signed[15:0]I_comcos;

    wire signed[15:0]Q_comsin;

 

 

// DUT

tops_64QAM_mod  top(

   .clk(clk),

   .rst(rst),

   .start(start),

   .parallel_data(parallel_data),

   .sin(sin),

   .cos(cos),

   .I_com(I_com),

   .Q_com(Q_com),

   .I_com2(I_com2),

   .Q_com2(Q_com2),

   .I_comcos(I_comcos),

   .Q_comsin(Q_comsin)

   );

   

   

wire signed[23:0]I_comcos2;

wire signed[23:0]Q_comsin2;

wire signed[7:0]o_Ifir;

wire signed[7:0]o_Qfir;

wire signed[15:0]o_Ifir_phase;

wire signed[15:0]o_Qfir_phase;

wire signed[31:0]o_phase;

tops_64QAM_phase_est  top2(

   .clk(clk),

   .rst(rst),

   .start(start),

   .I_comcos(I_comcos),

   .Q_comsin(Q_comsin),

   .I_comcos2(I_comcos2),

   .Q_comsin2(Q_comsin2),

   .o_Ifir(o_Ifir),

   .o_Qfir(o_Qfir),

   .o_I_phase(o_Ifir_phase),

   .o_Q_phase(o_Qfir_phase),

   .o_phase(o_phase)

   );  

   

 

initial begin

clk = 0;

rst = 0;

start = 1;

#10;

rst = 1;

end

always #5

clk <= ~clk;

reg writeen;

initial

begin

    writeen = 1'b0;

    #150000

    writeen = 1'b1;

end`