基于FPGA的16QAM+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR

目录

1.算法仿真效果

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

[2.1 16QAM调制解调原理](#2.1 16QAM调制解调原理)

[2.2 帧同步](#2.2 帧同步)

3.Verilog核心程序

4.完整算法代码文件获得


1.算法仿真效果

vivado2019.2仿真结果如下(完整代码运行后无水印):

设置SNR=12db

将FPGA数据导入到MATLAB显示星座图:

设置SNR=16db

将FPGA数据导入到MATLAB显示星座图:

设置SNR=25db

将FPGA数据导入到MATLAB显示星座图:

仿真操作步骤可参考程序配套的操作视频。

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

复制代码
T16QAM T16QAMU(
.i_clk  (dat_clk),
.i_clksample(i_clk),
.i_rst  (i_rst),
.i_en   (i_en),
.i_dat  (i_dat),
.o_ISET (o_ISET),
.o_clk_3div(),
.o_I16QAM(o_I16QAM),
.o_Q16QAM(o_Q16QAM),
.o_I16QAMs (o_I16QAMs),
.o_Q16QAMs (o_Q16QAMs),
.o_cos  (),
.o_sin  (),
.o_modc (),
.o_mods (),
.o_mod  (o_mod_T)
);

//加入信道
awgns awgns_u(
    .i_clk(i_clk), 
    .i_rst(i_rst), 
    .i_SNR(i_SNR), //这个地方可以设置信噪比,数值大小从-10~50,
    .i_din(o_mod_T[28:13]), 
    .o_noise(),
    .o_dout(o_Nmod_T)
    );  

 
16QAM解调
R16QAM R16QAMU(
.i_clk  (dat_clk),
.i_clksample(i_clk),
.i_rst  (i_rst),
.o_clk_3div(),
.i_med  (o_Nmod_T),
.o_cos  (),
.o_sin  (),
.o_modc (o_modc_R),
.o_mods (o_mods_R),
.o_Ifir (o_Ifir_R),
.o_Qfir (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)
);
    
    
Error_Chech Error_Chech_u1(
    .i_clk(dat_clk), 
    .i_rst(i_rst), 
    .i_trans({~i_dat,1'b1}), 
    .i_en_data(o_en_data),
    .i_rec({~o_bits,1'b1}), 
    .o_error_num(o_error_num), 
    .o_total_num(o_total_num)
    );  
    

0sj2_068m

4.完整算法代码文件获得

V

相关推荐
dai89101112 小时前
使用紫光同创FPGA实现HSSTLP IP支持的线速率
fpga开发
s090713613 小时前
XIlinx FPGA使用LVDS的电源与电平关键指南
fpga开发·xilinx·lvds
Joshua-a1 天前
FPGA基于计数器的分频器时序违例的解决方法
嵌入式硬件·fpga开发·fpga
尤老师FPGA1 天前
LVDS系列38:Xilinx 7系 AD9253 LVDS接口设计仿真(五)
fpga开发
史蒂芬_丁1 天前
PG分频_CLB
fpga开发
北方孤寂的灵魂1 天前
systemverilog中随机std::randomize的用法
verilog·systemverilog·sv·数字验证
博览鸿蒙1 天前
嵌入式是否如传说中那么简单?
fpga开发
Aaron15881 天前
全频段SDR干扰源模块设计
人工智能·嵌入式硬件·算法·fpga开发·硬件架构·信息与通信·基带工程
洋洋Young2 天前
【Xilinx FPGA】DDR3 SDRAM 控制器
fpga开发·xilinx
碎碎思2 天前
在 FPGA 里跑 SDR 和 FT8:一个 32 MHz 全频谱无线电的硬核实现
fpga开发