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

1.算法仿真效果

本文是之前写的文章:

 

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

 

的硬件测试版本。

 

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

 

vio设置SNR=15db

 

 

 

vio设置SNR=25db

 

 

 

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

 

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核心程序

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
`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.开发板使用说明和如何移植不同的开发板

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

 

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

 

 

 

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

 

 

posted @   我爱C编程  阅读(6)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2024-02-25 m基于Yolov2深度学习网络的喝水行为检测系统matlab仿真,带GUI界面
2023-02-25 基于6自由度飞行器的EKF和INS融合算法的MATLAB仿真
2023-02-25 m基于K-means聚类算法和神经网络的模糊控制器设计matlab仿真
2023-02-25 m基于FPGA的NBDP系统ARQ单元模块的verilog实现
2023-02-25 IS-95前向链路系统误码率matlab仿真,包括扩频调制,匹配滤波,RAKE接收
点击右上角即可分享
微信分享提示