【硬件测试】基于FPGA的QPSK调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
1.算法仿真效果
本文是之前写的文章:
《基于FPGA的QPSK调制+软解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR》
的硬件测试版本。
在系统在仿真版本基础上增加了ila在线数据采集模块,vio在线SNR设置模块,数据源模块。硬件ila测试结果如下:(完整代码运行后无水印):
VIO设置SNR=6db
VIO设置SNR=12db
硬件测试操作步骤可参考程序配套的操作视频。
2.算法涉及理论知识概要
QPSK是一种常用的调制方式,通过将两个比特映射到一个复平面上的相位点,实现了高效的信号传输。软解调是一种基于接收信号的概率估计进行解调的方法,能够提供更好的性能。本文将逐步介绍QPSK软解调的实现过程,包括信号采样、相位估计、判决和解调等方面。软解调是一种通过概率估计实现解调的方法,能够在信道噪声存在的情况下提供更好的性能。QPSK是一种常用的调制方式,通过将两个比特映射到相位点,实现了高效的信号传输。本文旨在详细介绍QPSK软解调的实现过程,包括信号采样、相位估计、判决和解调等步骤。
软解调是QPSK软解调的关键步骤,它利用判决符号和相位估计的结果进行概率估计,以提高解调的准确性。假设判决符号为d_hat,软解调过程的结果为软解调符号d。常见的软解调公式为: d = d_hat / P(d_hat|r[n])
其中P(d_hat|r[n])表示在接收到信号r[n]的条件下,判决符号d_hat为d_hat的概率。该概率可以通过估计信号点的概率分布函数或使用最大似然估计等方法得到。软解调过程需要进行概率估计,以提高解调的准确性。这涉及到估计信号点的概率分布函数或使用其他概率估计方法,其中噪声的影响需要被适当地考虑。
3.Verilog核心程序
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2024/12/12 22:31:53 // 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 ); wire o_msgI; wire o_msgQ; //产生模拟测试数据 signal signal_u( .i_clk (i_clk), .i_rst (~i_rst), .o_bits1(o_msgI), .o_bits2(o_msgQ) ); //设置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 signed[15:0]o_Ifir_T; wire signed[15:0]o_Qfir_T; wire signed[15:0]o_mod_T; wire signed[15:0]o_Nmod_T; wire signed[31:0]o_modc_R; wire signed[31:0]o_mods_R; wire signed[31:0]o_Ifir_R; wire signed[31:0]o_Qfir_R; wire signed[31:0]o_error_num; wire signed[31:0]o_total_num; wire signed[1:0]o_Ibits; wire signed[1:0]o_Qbits; QPSK_tops QPSK_tops_u( .i_clk (i_clk), .i_rst (~i_rst), .i_Ibits (o_msgI), .i_Qbits (o_msgQ), .i_SNR (o_SNR), .o_Ifir (o_Ifir_T), .o_Qfir (o_Qfir_T), .o_mod_T (o_mod_T), .o_Nmod_T (o_Nmod_T), .o_modc (o_modc_R), .o_mods (o_mods_R), .o_rIfir (o_Ifir_R), .o_rQfir (o_Qfir_R), .o_error_num (o_error_num), .o_total_num (o_total_num), .o_Ibits (o_Ibits), .o_Qbits (o_Qbits) ); //ila篇内测试分析模块 ila_0 ila_u ( .clk(i_clk), // input wire clk .probe0({ o_msgI,o_msgQ,o_SNR,//10 o_Ifir_T[15:6],o_Qfir_T[15:6],o_mod_T[15:6],o_Nmod_T[15:6],//40 o_modc_R[27:12],o_mods_R[27:12],o_Ifir_R[27:12],o_Qfir_R[27:12],//64 o_error_num,o_total_num,//64 o_Ibits,o_Qbits//4 }) ); endmodule