基于FPGA的8PSK+卷积编码Viterbi译码通信系统,包含帧同步,信道,误码统计,可设置SNR

目录

1.引言

2.算法仿真效果

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

[3.1 8PSK调制原理](#3.1 8PSK调制原理)

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

[3.3 卷积编码,维特比译码](#3.3 卷积编码,维特比译码)

4.Verilog程序接口

5.参考文献

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


1.引言

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

2.算法仿真效果

本系统是在

基于FPGA的8PSK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR_通过ad9914实现8psk调制信号的fpga代码-CSDN博客

基础上,增加了217卷积编码,维特比译码(不使用编译码IP核),从而提升系统性能。

vivado2022.2测试

设置SNR=15db

将数据导出到matlab中显示星座图:

设置SNR=10db

将数据导出到matlab中显示星座图:

设置SNR=7db

将数据导出到matlab中显示星座图:

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

整体系统结构如下所示:

3.1 8PSK调制原理

8PSK调制是一种相位调制方式,其基本原理是通过改变载波的相位来传递信息。在8PSK中,一个符号周期内的相位变化有8种可能的状态,分别对应3个比特的信息。因此,8PSK调制可以看作是一种将3个比特映射到一个符号的映射方式。具体地,假设输入的比特序列为b2b1b0,则对应的8PSK符号可以表示为:

S(t)=Acos(2πfct+θk) (1)

其中,A是载波的振幅,fc是载波的频率,θk是第k个符号的相位,k=0,1,...,7。θk的取值由输入的比特序列b2b1b0决定,具体的映射关系如表1所示。

表1:8PSK映射关系

其星座图如下所示:

3.2 帧同步

在数字通信中,信息通常是以帧为单位进行组织和传输的。帧同步的目的是确定每一帧的起始位置,以便接收端能够正确地解调出每帧中的数据。

设发送的帧结构为:帧同步码 + 信息码元序列 。帧同步码是具有特定规律的码序列,用于接收端识别帧的起始。

帧同步的过程就是在接收序列中寻找与帧同步码匹配的位置,一旦找到匹配位置,就确定了帧的起始位置,后续的码元就可以按照帧结构进行正确的划分和处理。

3.3 卷积编码,维特比译码

卷积编码是一种前向纠错编码方式,特别适用于无线通信和其他信道条件恶劣的应用场景。它主要通过卷积算子将信息序列映射成冗余度更高的码字序列。典型的卷积编码器由两个移位寄存器和一个加法器构成,遵循一定的生成多项式进行编码。

设信息序列是 u(n),卷积编码器的两个生成多项式为 G1​(D) 和 G2​(D),则编码输出v(n) 可以表示为:

v(n)=u(n)G1​(D)+u(n−1)G2​(D)+...

此处D 是延迟算子,实际表达形式取决于具体选择的生成多项式阶数及系数。

维特比译码是用于最大似然序列估计的一种动态规划算法,广泛应用于卷积编码以及其他序列编码的译码过程中。在卷积编码中,维特比译码器通过构造一棵称为"状态转移图"或"trellis"的树状结构来寻找最有可能的原始信息序列路径。

4.Verilog程序接口

复制代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2023/05/03 06:21:37
// Design Name: 
// Module Name: TEST
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////
X
module TEST();


 
reg i_clk;
reg i_rst;
reg signed[7:0]i_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)
);


reg signed[7:0]i_SNR;

wire [1:0]o_enc;
wire      o_encs;
wire[2:0]o_ISET;
wire signed[15:0]o_I8PSK;
wire signed[15:0]o_Q8PSK;
wire signed[15:0]o_I8PSKs;
wire signed[15:0]o_Q8PSKs;
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  [2: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_8PSK TOPS_8PSK_u(
.i_clk        (i_clk),
.i_clkdx      (dat_clk),
.i_clkd2x     (dat_2clk),
.i_rst        (i_rst),
.i_SNR        (i_SNR),
.i_en         (o_en),
.i_dat        (o_msg),
.o_enc        (o_enc),
.o_encs       (o_encs),
.o_ISET       (o_ISET),
.o_I8PSK      (o_I8PSK),
.o_Q8PSK      (o_Q8PSK),
.o_I8PSKs     (o_I8PSKs),
.o_Q8PSKs     (o_Q8PSKs),
.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)
);
 

initial
begin
    i_clk = 1'b1;
    i_rst = 1'b1;
    i_SNR =7;//这个地方可以设置信噪比,数值大小从0~50,
    #1200
    i_rst = 1'b0;
end

always #5 i_clk=~i_clk;

 

 //显示发射端带相位旋转的星座图
integer fout1;
integer fout2;
integer fout0;
initial begin
 fout0 = $fopen("en.txt","w");
 fout1 = $fopen("It.txt","w");
 fout2 = $fopen("Qt.txt","w"); 
end

always @ (posedge dat_clk)
 begin
     if(i_rst==0)
     begin
     $fwrite(fout0,"%d\n",o_en);
   	 $fwrite(fout1,"%d\n",o_Ifir_R);
	 $fwrite(fout2,"%d\n",o_Qfir_R);
	 end
	 else begin
	 $fwrite(fout1,"%d\n",0);
   	 $fwrite(fout1,"%d\n",0);
	 $fwrite(fout2,"%d\n",0);
	 end
end



endmodule
0sj2_086m

5.参考文献

1王静.8PSK+TCM编码调制解调技术D.南京理工大学2025-08-14.DOI:10.7666/d.y2062697.

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

完整程序见博客首页左侧或者打开本文底部

V

相关推荐
仲南音15 小时前
Xilinx FPGA——时钟IP核MMCM、PLL
fpga开发
I'm a winner1 天前
基于Xilinx FPGA的LVDS高速串行通信系统(三)--数据训练及握手机制【文末源码】
fpga开发
upper20201 天前
coremark移植坑之-nostartfiles -nostdlib参数
学习·fpga开发·coremark移植·riscv设计
K成长日志1 天前
BLE链路层空口包--LE Uncoded PHY
物联网·嵌入式·蓝牙·iot·ble·无线·通信
Eloudy2 天前
Vivado 纯命令行构建 FPGA 项目教程
fpga开发
Rambo.xia2 天前
AXI跨时钟域与数据一致性——CDC FIFO深度不够、写后读冒险、多Master仲裁、乱序返回,出了Bug根本查不出来
fpga开发·bug
upper20202 天前
FPGA部署卷积神经网络识别MINST图片
fpga开发·卷积神经网络·minst·minst识别·部署神经网络·神经网络识别图片
你是我的解忧王子2 天前
嵌入式 ADC采样 原始数据分析上层(平均值 波动率 正态分布 线性补偿 系统误差)
fpga开发·数据挖掘·数据分析
liulilittle2 天前
论双机热备:分布式
服务器·网络·分布式·通信·竞态
liulilittle2 天前
论无知:分布式
服务器·网络·分布式·并发·通信·竞态