【硬件测试】基于FPGA的16QAM软解调+卷积编码Viterbi译码系统开发,包含帧同步,信道,误码统计,可设置SNR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.引言

基于FPGA的16QAM软解调+卷积编码Viterbi译码通信系统开发,包含帧同步,高斯信道,误码统计,可设置SNR。系统包括16QAM调制,16QAM软解调模块,217卷积编码模块,维特比译码模块,AWGN信道模块,误码统计模块,帧同步模块,数据源模块等。

2.FPGA硬件片内测试效果

1

2

3

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

整体系统结构如下所示(其中解调部分为软解调算法实现):

4

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

4.Verilog程序接口

 
 
wire signed[7:0]o_SNR;
wire signed[1:0]o_en;
wire            o_msg;
wire dat_clk;
wire dat_2clk;
signal signal_u(
.i_clk   (i_clk),
.i_rst   (~i_rst),
.o_en    (o_en),
.o_bits  (o_msg),
.dat_clk (dat_clk),
.dat_2clk(dat_2clk)
);
 
 
 
//设置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 [1:0]o_enc;
wire      o_encs;
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 o_dec_enable;
wire o_dec;
wire signed[31:0]o_error_num;
wire signed[31:0]o_total_num;  
 
TOPS_16QAM TOPS_16QAM_u(
.i_clk        (~i_clk),
.i_clkdx      (dat_clk),
.i_clkd2x     (dat_2clk),
.i_rst        (~i_rst),
.i_SNR        (o_SNR),
.i_en         (o_en),
.i_dat        (o_msg),
 
.o_enc        (o_enc),
.o_encs       (o_encs),
.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_dec_enable (o_dec_enable),
.o_dec        (o_dec),
.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_msg,o_SNR,o_enc,o_Nmod_T[15:4],//24
            o_Ifir_R[27:12],o_Qfir_R[27:12],//24
	        o_bits,o_bits_head,o_peak,o_en_data,o_en_pn,//14
	        o_dec_enable,o_dec,//2
	        o_error_num[19:0],o_total_num[23:0]//44
 
	         })
	);	 
endmodule
0sj2_085m

 

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

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

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

5

 

posted @ 2026-01-18 16:55  我爱C编程  阅读(1)  评论(0)    收藏  举报