【硬件测试】基于FPGA的16QAM调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR

13 阅读4分钟

1.算法仿真效果

本文是之前写的文章:

 

《基于FPGA的16QAM调制+软解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR》

 

的硬件测试版本。

 

在系统在仿真版本基础上增加了ila在线数据采集模块,vio在线SNR设置模块,数据源模块。硬件ila测试结果如下:(完整代码运行后无水印):

 

VIO设置SNR=10db

 

1862491217ceb7892940f4a1d2773465_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

 

VIO设置SNR=20db

ef45d20cdea459dddd6727eee2988ede_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

 

硬件测试操作步骤可参考程序配套的操作视频。

 

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

      16QAM软解调是一种常用的数字调制解调技术,用于将接收到的16QAM调制的信号转换为原始数据。该技术结合了16种相位和振幅的调制方式,通过软判决算法对接收信号进行解调,16QAM软解调的系统原理是将接收到的16QAM调制信号转换为软判决结果,从而恢复原始数据。软解调是一种非硬判决的解调方法,它利用接收信号的采样值和相位信息来判断信号所处的调制状态,并对其进行解调。在16QAM软解调中,接收信号经过采样后,通过比较采样值和16个调制点的距离,选择最近的调制点作为解调结果。

 

       16QAM调制将每四个比特映射到一个复数点上,共有16种相位和振幅的调制方式。每个复数点对应一个调制符号,通过软解调,我们可以确定接收到的信号所对应的调制符号,进而推导出原始数据。

 

       设接收信号的采样值为rr,我们需要通过比较rr与16个调制点的距离,选择最近的调制点。

 

以下是16QAM软解调的具体步骤:

 

步骤1:接收信号采样

 

接收信号经过抽样过程,得到采样值rr

 

步骤2:计算距离

 

计算采样值rr与每个调制点的距离did_i,其中i=1,2,...,16i=1,2,...,16。距离可以使用欧氏距离或其他度量方法进行计算。

 

步骤3:选择最近的调制点

 

选择与采样值r距离最近的调制点,记为d,并记录其索引i。

 

步骤4:软判决

 

根据索引i,确定接收信号对应的调制符号。根据调制符号,可以推导出原始数据。

 

       实现16QAM软解调的难点在于选择合适的距离度量方法和判决阈值,以及在存在噪声的情况下进行准确的判决。此外,还需要解决调制点的映射问题,确保软解调能够准确还原原始数据。   

 

       总结而言,16QAM软解调是一种通过比较采样值与调制点的距离,选择最近的调制点来解调接收信号的方法。通过软解调,可以恢复原始数据并实现高效的数据传输。

 

3.Verilog核心程序

``timescale 1ns / 1ps

//

// Company:

// Engineer:

//

// Create Date: 2024/12/09 20:40:47

// Design Name:

// Module Name: tops_hdw

// Project Name:

// Target Devices:

// Tool Versions:

// Description:

//

// Dependencies:

//

// Revision:

// Revision 0.01 - File Created

// Additional Comments:

//

//

 

 

module tops_hdw(

 

input i_clk,

input i_rst,

output reg [3:0] led

);

    

 

 

 

//设置SNR

wire signed[7:0]o_SNR;

vio_0 your_instance_name (

  .clk(i_clk),                // input wire clk

  .probe_out0(o_SNR)  // output wire [7 : 0] probe_out0

);

 

    wire  [3:0] parallel_data;

    wire [15:0]sin;

    wire [15:0]cos;

wire signed[15:0]  I_com;

wire signed[15:0]  Q_com;

    wire  signed[15:0]I_Ncom;

    wire  signed[15:0]Q_Ncom;

    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  [3:0] o_sdout;

    wire signed[31:0]o_error_num;

    wire signed[31:0]o_total_num;

wire[3:0]o_rec2 ;

 

TOPS_16QAM TOPS_16QAM_u(

   .clk(i_clk),

   .rst(i_rst),

   .start(1'b1),

       .i_SNR(o_SNR),

   .parallel_data(parallel_data),

   .sin(sin),

   .cos(cos),

   .I_com(I_com),

   .Q_com(Q_com),

       .I_Ncom(I_Ncom),

       .Q_Ncom(Q_Ncom),

   .I_comcos2(I_comcos2),

   .Q_comsin2(Q_comsin2),

   .o_Ifir(o_Ifir),

   .o_Qfir(o_Qfir),

   .o_sdout(o_sdout),

      .o_error_num(o_error_num),

      .o_total_num(o_total_num),

      .o_rec2(o_rec2)  

);

 

    

//ila篇内测试分析模块

ila_0 ila_u (

.clk(i_clk), // input wire clk

.probe0({

        o_SNR,//8

        I_com[15:6], Q_com[15:6],I_Ncom[15:6],Q_Ncom[15:6],//40

        I_comcos2[23:8],Q_comsin2[23:8],o_Ifir,o_Qfir,//48

        parallel_data,o_sdout,o_rec2,

        o_error_num,o_total_num//64

         })

);

endmodule`

82bfb83acc3f22635dfce98cde96710b_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg