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

23 阅读4分钟

1.算法仿真效果

本文是之前写的文章:

 

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

 

的硬件测试版本。

 

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

 

vio设置SNR=25db

 

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

 

vio设置SNR=30db

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

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

 

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

        随着无线通信技术的不断发展,越来越多的应用需要高速、高可靠性的通信系统来传输数据。调制解调是一种常用的数字通信技术,它可以将数字信号转换成模拟信号进行传输,同时也可以将接收到的模拟信号转换成数字信号进行处理。在数字调制解调中,QAM是一种常用的调制方式,它可以将数字信号分为实部和虚部两个部分进行编码,从而实现高效的数据传输。本文旨在介绍基于FPGA的64QAM调制解调通信系统的设计和实现,包括信号生成、信号调制、信号解调和误码率测试等环节,以验证系统的可行性和性能。

 

2.1 64QAM调制解调系统的设计

       在64QAM调制解调系统中,需要生成一定数量的数字信号,作为调制信号和参考信号。数字信号可以使用随机数生成器产生,也可以使用特定的算法生成。在本文中,我们采用了带噪声的随机数生成器产生数字信号,其中噪声是为了模拟实际通信中的信道噪声。

 

      在64QAM调制解调系统中,需要将数字信号转换成模拟信号进行传输,这个过程称为信号调制。在QAM调制中,数字信号分为实部和虚部两个部分进行编码,然后将它们分别调制到不同的载波上,最后将两个载波叠加在一起。具体来说,假设数字信号为s(n),其中n表示信号的采样点,QAM调制可以表示为:

 

27f0577e42b1c9da6ad8971bef24a7ea_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

      其中,s_I(n)表示实部信号,s_Q(n)表示虚部信号,A_I和A_Q分别表示实部和虚部的调制系数,f_c表示载波频率,t(n)表示采样时间。在64QAM调制中,实部和虚部分别采用8QAM调制,然后叠加在一起,最终得到64QAM调制信号。

 

2.2 信号解调

        在接收端,需要将接收到的模拟信号转换成数字信号进行处理,这个过程称为信号解调。在64QAM解调中,首先需要将接收到的实部和虚部,进行8QAM解调,最后将解调后的实部和虚部重新组合成数字信号。

 

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

//

// Company:

// Engineer:

//

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

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

wire  signed[7:0]o_Qfir;

wire  [5:0] o_sdout;

wire signed[31:0]o_error_num;

wire signed[31:0]o_total_num;

  

TOPS_64QAM TOPS_64QAM_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)  

);

 

    

//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_error_num,o_total_num//64

     

         })

);

endmodule`

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