【硬件测试】基于FPGA的256QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR

27 阅读4分钟

1.算法仿真效果

本文是之前写的文章:

 

《基于FPGA的256QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR》

 

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

 

vio设置SNR=40db

 

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

 

vio设置SNR=30db

 

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

 

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

 

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

        256QAM(Quadrature Amplitude Modulation,正交幅度调制)是一种高级调制方案,能够在给定带宽内传输更多的信息比特。256QAM意味着每个符号可以携带8个比特的信息,因为 log⁡2(256)=8log2​(256)=8。

 

       在调制过程中,输入比特流首先被映射到复数值星座图上的特定点。对于256QAM,每个符号代表8个比特信息。调制器根据输入比特选择对应的星座点,并将这些星座点转换成相应的复数形式。例如,在理想情况下,256QAM星座图包含256个不同的点。

 

      256QAM的星座图是一个二维平面内的点阵,每个点代表一个独特的调制状态。在理想情况下,星座图中的每个点都对应于一个特定的复数值,该值由相位和幅度共同决定。由于256QAM有256个可能的状态,因此其星座图包含256个点。

 

256QAM映射过程如下:

 

数据编码:首先,输入的一组8比特数据需要被编码成一个复数形式的符号。这意味着每个256QAM符号实际上是由8比特信息组成的。

 

星座图映射:接下来,这8比特被映射到星座图上的一个特定位置。通常,这些比特会按照一定的规则分配给星座图的不同维度。例如,前4比特可以确定星座图上的一维坐标(实部),而后4比特确定另一维坐标(虚部)。

 

星座点分配:具体来说,星座图上的每个点都有一个特定的坐标(I,Q),其中I 表示同相分量,Q 表示正交分量。在256QAM中,这些坐标可以从一系列预定义的值中选取。在标准化的256QAM星座图中,I 和 Q 的取值范围通常是−7,−5,−3,−1,1,3,5,7−7,−5,−3,−1,1,3,5,7 或者类似的比例因子乘以这些值。

 

星座图结构:256QAM星座图通常呈格状排列,每个点在I-Q 平面上的位置决定了其代表的比特组合。例如,如果使用灰度编码(Gray coding)来减少相邻星座点之间的比特翻转数,那么每个点周围的8个邻居将与其仅有一个比特的不同。       

 

在接收端,接收到的复数信号经过解调处理,将其映射回最接近的星座点,然后恢复出原始比特序列。这个过程可能会受到信道引入的噪声和失真的影响,导致错误的发生。

 

3.Verilog核心程序 ``timescale 1ns / 1ps

//

// Company:

// Engineer:

//

// Create Date: 2024/12/04 15:36:34

// 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  [7:0] parallel_data;

wire signed[15:0]sin;

wire signed[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[15:0]o_Ifir;

wire  signed[15:0]o_Qfir;

wire  [7:0] o_sdout;

wire signed[31:0]o_error_num;

wire signed[31:0]o_total_num;

  

TOPS_256QAM TOPS_256QAM_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),

.flag_reg      (),

.o_error_num   (o_error_num),

.o_total_num   (o_total_num)  

);

 

//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[15:4],o_Qfir[15:4],//48

        parallel_data,o_sdout,

        o_error_num,o_total_num//64

     

         })

);

endmodule

0sj_036m`

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