当前位置: 首页 > news >正文

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

目录

1.算法仿真效果

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

2.1 16QAM调制解调原理

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

相关文章:

  • EMS小车技术特点与优势:高效灵活的自动化输送解决方案
  • 后端——AOP异步日志
  • 伊吖学C笔记(2、文件、启动、数学基础)
  • Python——成员变量
  • C语言入门教程100讲(40)文件定位
  • 大文件版本管理git-lfs
  • Zookeeper运维指南:服务端与客户端常用命令详解
  • Chrome Performance 面板完全指南:从卡顿到丝滑的终极调试术
  • 一站式开源AI平台Cherry Studio本地部署与远程调用本地大模型
  • AI知识补全(二):提示工程(Prompting)是什么?
  • 自定义minshell
  • Python----计算机视觉处理(Opencv:模板匹配)
  • 价值流映射(Value Stream Mapping):从流程可视化到敏捷效能革命
  • 【深度学习】【目标检测】【OnnxRuntime】【C++】YOLOV3模型部署
  • 深度解析:打破知识孤岛,降低重复开发成本(5大重点)
  • conda常用指令
  • 【基础】Windows 中通过 VSCode 使用 GCC 编译调试 C++
  • 【QA】为什么gl_Posision必须被赋值?
  • 人工智能笔记
  • 开源模型应用落地-语音转文本-whisper模型-AIGC应用探索(四)
  • 广东省副省长刘红兵跨省任湖南省委常委、宣传部部长
  • 外交部亚洲司司长刘劲松向菲方严肃交涉
  • 这座“蚌埠住了”的城市不仅会接流量,也在努力成为文旅实力派
  • 王毅会见俄罗斯外长拉夫罗夫
  • 借助AI应用,自闭症人群开始有可能真正“读懂他人”
  • 朝鲜证实出兵俄罗斯协助收复库尔斯克