【硬件测试】基于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.开发板使用说明和如何移植不同的开发板
注意:硬件片内测试是指发射接收均在一个板子内完成,因此不需要定时同步模块。
在本课题中,使用的开发板是:
如果你的开发板和我的不一样,可以参考代码包中的程序移植方法进行移植:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!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接收