目錄
1.算法硬件測試效果
2.算法涉及理論知識概要
2.1 16QAM調制解調原理
2.2 幀同步
3.Verilog核心程序
4.開發板使用說明和如何移植不同的開發板
5.完整算法代碼文件獲得
1.算法硬件測試效果
本文是之前寫的文章:
《基于FPGA的16QAM+幀同步系統verilog開發,包含testbench,高斯信道,誤碼統計,可設置SNR》
的硬件測試版本。
在系統在仿真版本基礎上增加了ila在線數據采集模塊,vio在線SNR設置模塊,數據源模塊。硬件ila測試結果如下:(完整代碼運行后無水印):
vio設置SNR=20db
vio設置SNR=15db
硬件測試操作步驟可參考程序配套的操作視頻。
2.算法涉及理論知識概要
? ? ? 16QAM全稱正交幅度調制是英文Quadrature Amplitude Modulation的縮略語簡稱,意思是正交幅度調制,是一種數字調制方式。產生的方法有正交調幅法和復合相移法。16QAM是指包含16種符號的QAM調制方式。
2.1 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 信號進行正交相干解調,一路與cosωct 相乘,一路與sinωct相乘。然后經過低通濾波器,低通濾波器LPF濾除乘法器產生的高頻分量,獲得有用信號,低通濾波器LPF 輸出經抽樣判決可恢復出電平信號。
2.2 幀同步
? ? ? ? 在數字通信中,信息通常是以幀為單位進行組織和傳輸的。幀同步的目的是確定每一幀的起始位置,以便接收端能夠正確地解調出每幀中的數據。
? ? ? ?設發送的幀結構為:幀同步碼 + 信息碼元序列 。幀同步碼是具有特定規律的碼序列,用于接收端識別幀的起始。
? ? ? ?幀同步的過程就是在接收序列中尋找與幀同步碼匹配的位置,一旦找到匹配位置,就確定了幀的起始位置,后續的碼元就可以按照幀結構進行正確的劃分和處理。
3.Verilog核心程序
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2025/03/23 12:49:36
// 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
);wire o_msg;
wire[1:0]o_en;
signal signal_u(
.i_clk (i_clk),
.i_rst (~i_rst),
.o_bits(o_msg),
.o_en (o_en)
);//設置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]o_ISET;
wire signed[15:0]o_I16QAM;
wire signed[15:0]o_Q16QAM;
wire signed[15:0]o_I16QAMs;
wire signed[15:0]o_Q16QAMs;
wire signed[31:0]o_mod_T;
wire signed[15:0]o_Nmod_T;
wire signed[31:0]o_modc_R;
wire signed[31:0]o_mods_R;
wire signed[31:0]o_Ifir_R;
wire signed[31:0]o_Qfir_R;
wire [3:0]o_wbits;
wire o_bits;
wire [1:0]o_bits_head;
wire [7:0]o_peak;
wire o_en_data;
wire o_en_pn;
wire o_frame_start;
wire signed[31:0]o_error_num;
wire signed[31:0]o_total_num;
TOPS_16QAM TOPS_16QAM_u(
.i_clk (i_clk),
.i_rst (~i_rst),
.i_SNR (o_SNR),
.i_en (o_en),
.i_dat (o_msg),
.o_ISET (o_ISET),
.o_I16QAM (o_I16QAM),
.o_Q16QAM (o_Q16QAM),
.o_I16QAMs (o_I16QAMs),
.o_Q16QAMs (o_Q16QAMs),
.o_mod_T (o_mod_T),
.o_Nmod_T (o_Nmod_T),.o_modc_R (o_modc_R),
.o_mods_R (o_mods_R),
.o_Ifir_R (o_Ifir_R),
.o_Qfir_R (o_Qfir_R),
.o_wbits (o_wbits),
.o_bits (o_bits),
.o_bits_head (o_bits_head),
.o_peak (o_peak),
.o_en_data (o_en_data),
.o_en_pn (o_en_pn),
.o_frame_start(o_frame_start),
.o_error_num (o_error_num),
.o_total_num (o_total_num)
);//ila篇內測試分析模塊140
//ila篇內測試分析模塊140
ila_0 ila_u (.clk(i_clk), // input wire clk.probe0({ o_msg,o_SNR,o_I16QAMs[9:0],o_Q16QAMs[9:0],//30o_Nmod_T,o_Ifir_R[27:14],o_Qfir_R[27:14],o_wbits,//48o_error_num[15:0],o_total_num[23:0],//40//28o_en_pn,o_en_data,o_peak,o_bits_head,o_bits})); endmodule
0sj2_069m
4.開發板使用說明和如何移植不同的開發板
注意:硬件片內測試是指發射接收均在一個板子內完成,因此不需要定時同步模塊。
在本課題中,使用的開發板是:
如果你的開發板和我的不一樣,可以參考代碼包中的程序移植方法進行移植:
5.完整算法代碼文件獲得
V