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

100 阅读4分钟

1.算法仿真效果

本文是之前写的文章:

 

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

 

的硬件测试版本。

 

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

 

vio设置SNR=15db

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

vio设置SNR=25db

 

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

 

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

 

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

      16QAM全称正交幅度调制是英文Quadrature Amplitude Modulation的缩略语简称,意思是正交幅度调制,是一种数字调制方式。产生的方法有正交调幅法和复合相移法。16QAM是指包含16种符号的QAM调制方式。

 

16QAM 调制原理

 

       16QAM 是用两路独立的正交 4ASK 信号叠加而成,4ASK 是用多电平信号去键控载波而得到的信号。它是 2ASK 调制的推广,和 2ASK 相比,这种调制的优点在于信息传输速率高。正交幅度调制是利用多进制振幅键控(MASK)和正交载波调制相结合产生的。

 

16 进制的正交振幅调制是一种振幅相位联合键控信号。16QAM 的产生有 2 种方法:

(1)正交调幅法,它是有 2 路正交的四电平振幅键控信号叠加而成;

(2)复合相移法:它是用 2 路独立的四相位移相键控信号叠加而成。

 

这里采用正交调幅法。       

 

       数字信号是通过FPGA的输出端口生成的。在16QAM调制中,每个符号包含4个比特,因此需要一个4位二进制计数器来生成数字信号。计数器的输出被映射到星座图上的一个点,然后通过数字到模拟转换器(DAC)转换为模拟信号。串/并变换器将速率为Rb的二进制码元序列分为两路,速率为Rb/2.2-4电平变换为Rb/2 的二进制码元序列变成速率为RS=Rb/log216 的 4 个电平信号,4 电平信号与正交载波相乘,完成正交调制,两路信号叠加后产生 16QAM信号.在两路速率为Rb/2 的二进制码元序列中,经 2-4 电平变换器输出为 4 电平信号,即M=16.经 4 电平正交幅度调制和叠加后,输出 16 个信号状态,即 16QAM.

 

16QAM 解调原理

 

       16QAM 信号采取正交相干解调的方法解调,解调器首先对收到的 16QAM 信号进行正交相干解调,一路与 cos ω c t 相乘,一路与 sin ω c t 相乘。然后经过低通滤波器,低通滤波器 LPF 滤除乘法器产生的高频分量,获得有用信号,低通滤波器LPF 输出经抽样判决可恢复出电平信号。

 

3.Verilog核心程序

  ``timescale 1ns / 1ps

//

// Company:

// Engineer:

//

// Create Date: 2024/11/25 03:23:02

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

wire signed[31:0]o_error_num;

wire signed[31:0]o_total_num;

  

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)  

);

 

    

//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`

 

4.开发板使用说明和如何移植不同的开发板

注意:硬件片内测试是指发射接收均在一个板子内完成,因此不需要定时同步模块。

 

在本课题中,使用的开发板是:

 

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

如果你的开发板和我的不一样,可以参考代码包中的程序移植方法进行移植:

612f7e04ad03f0e88b629fcc14fd21f0_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png