基于FPGA的8PSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR

news/2024/10/9 19:25:00

1.算法仿真效果

       本系统在以前写过的8PSK调制解调系统的基础上,增加了高斯信道模块,误码率统计模块,可以验证不同SNR情况下的8PSK误码情况。

 

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

 

设置SNR=30db

 

 

 

其对应星座图:

 

 

 

设置SNR=15db

 

 

 

其对应星座图:

 

 

 

设置SNR=10db

 

 

 

其对应星座图:

 

 

 

整个系统的RTL结构如下图所示:

 

 

 

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

        随着通信技术的不断发展,相位调制技术因其高频谱效率和抗干扰能力而广泛应用于无线通信系统中。其中,8PSK(8相位相移键控)作为一种高阶调制方式,具有更高的频谱效率和更强的抗干扰能力,因此备受关注。然而,8PSK调制解调的实现复杂度较高,需要高效的数字信号处理技术。现场可编程门阵列(FPGA)作为一种可编程逻辑器件,具有高度的灵活性和并行处理能力,非常适合实现复杂的数字信号处理算法。

 

2.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映射关系

 

 

 

其星座图如下所示:

 

 

 

2.2 基于FPGA的8PSK调制解调器设计和实现

       FPGA是一种可编程逻辑器件,其内部包含大量的可编程逻辑单元和存储单元,可以根据用户的需要进行灵活配置。FPGA具有以下优点:

 

1)高度的灵活性:FPGA可以根据用户的需要重新配置逻辑电路,实现不同的功能。这种灵活性使得FPGA可以适应各种复杂的通信系统和算法需求。

2)并行处理能力:FPGA内部的逻辑单元可以并行工作,同时处理多个数据。这种并行处理能力使得FPGA可以高效地实现复杂的数字信号处理算法。

3)高性能和低功耗:FPGA的逻辑单元和存储单元都采用了高性能的工艺和设计,可以实现高速的数据处理和存储。同时,FPGA还具有低功耗的特点,适合用于移动通信等需要长时间工作的场景。

 

       在基于FPGA的8PSK调制解调系统中,数字信号处理算法是关键部分之一。具体地,调制器需要将输入的比特序列映射为对应的8PSK符号序列;解调器则需要从接收到的符号序列中恢复出原始的比特序列。为了实现这些功能,我们采用了以下算法:

 

1)调制算法:根据输入的比特序列和表1中的映射关系,计算出对应的8PSK符号序列。这个过程可以通过查找表或者计算的方式实现。为了降低复杂度和提高效率,我们采用了查找表的方式实现调制算法。具体地,我们将表1中的映射关系存储在一个查找表中,然后根据输入的比特序列查找对应的8PSK符号序列。这种方式可以在保证正确性的同时降低算法的复杂度。

2)解调算法:从接收到的符号序列中恢复出原始的比特序列是一个比较复杂的过程,我们将接收到的符号序列与一个已知的8PSK符号序列进行比较。

 

3.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:
// 
//module TEST();reg i_clk;
reg i_clksample;
reg i_rst;
reg i_dat;
reg signed[7:0]i_SNR;
wire[2:0]o_ISET;
wire signed[15:0]o_I8psk;
wire signed[15:0]o_Q8psk;
wire signed[15:0]o_Ifir_T;
wire signed[15:0]o_Qfir_T;
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 signed[31:0]o_error_num;
wire signed[31:0]o_total_num;  
TOPS_8PSK TOPS_8PSK_u(
.i_clk      (i_clk),
.i_clksample(i_clksample),
.i_rst  (i_rst),
.i_SNR(i_SNR),
.i_dat  (i_dat),
.o_ISET (o_ISET),
.o_I8psk(o_I8psk),
.o_Q8psk(o_Q8psk),
.o_Ifir_T (o_Ifir_T),
.o_Qfir_T (o_Qfir_T),
.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_error_num(o_error_num),
.o_total_num(o_total_num)
);initial
begini_clk = 1'b1;i_clksample= 1'b1;i_rst = 1'b1;i_SNR =30;//这个地方可以设置信噪比,数值大小从0~50,#12000i_rst = 1'b0;
endalways #80 i_clk=~i_clk;
always #1 i_clksample=~i_clksample;initial
begini_dat = 1'b0;#12000repeat(10000)begin#160 i_dat = 1'b1;#160 i_dat = 1'b1;#160 i_dat = 1'b0;#160 i_dat = 1'b0;#160 i_dat = 1'b0;#160 i_dat = 1'b1;#160 i_dat = 1'b0;#160 i_dat = 1'b1;#160 i_dat = 1'b1;#160 i_dat = 1'b0;#160 i_dat = 1'b0;#160 i_dat = 1'b0;#160 i_dat = 1'b0;#160 i_dat = 1'b0;#160 i_dat = 1'b0;#160 i_dat = 1'b0;#160 i_dat = 1'b0;#160 i_dat = 1'b0;#160 i_dat = 1'b1;#160 i_dat = 1'b1;#160 i_dat = 1'b1;#160 i_dat = 1'b0;#160 i_dat = 1'b0;#160 i_dat = 1'b1;#160 i_dat = 1'b0;#160 i_dat = 1'b0;#160 i_dat = 1'b1;#160 i_dat = 1'b1;#160 i_dat = 1'b0;end
end//显示发射端带相位旋转的星座图
integer fout1;
integer fout2;
initial beginfout1 = $fopen("It.txt","w");fout2 = $fopen("Qt.txt","w"); 
endalways @ (posedge i_clk)beginif(i_rst==0)begin$fwrite(fout1,"%d\n",o_Ifir_R);$fwrite(fout2,"%d\n",o_Qfir_R);endelse begin$fwrite(fout1,"%d\n",0);$fwrite(fout2,"%d\n",0);end
endendmodule

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/69519.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

java学习10.9

网上找的javaweb教程 Servlet+Mybatis+Thymeleaf的javaweb图书管理系统 实现用web界面对数据库的增删改查 前端页面css样式为现成的东西修改 项目架构整体页面

『模拟赛』多校A层冲刺NOIP2024模拟赛04

『模拟赛记录』多校A层冲刺NOIP2024模拟赛04Rank 赤石场。A. 02表示法 签。 若干天前在洛谷随到过,不过当时只看了眼讨论区就走了www 还好本来不是很难。 发现大体上是一个拆分二的幂的问题,从大到小枚举 2 的幂,判断有没有这个幂只用比较大小关系,然后再对指数做一个同样的…

实现一个烟花效果

1. 首先创建一个烟花类,有烟花上升的效果,烟花爆炸的两种效果(爆炸型和球型)2. 创建线的属性方法,因为上升效果和爆炸效果都会用到3. 上升效果为了达到那种螺旋上升的效果可以通过sin函数实现一个点的偏移量4. 爆炸效果则是将随机生成多条半径不同的线5. 球形效果则是将规…

【Java】反射

Java中的反射机制 动态代理反射 允许对封装类的字段,方法和构造函数的信息进行编程访问 ==》 反射允许对成员变量,成员方法和构造方法的信息进行编程访问 基本操作:获取(获取class对象【字节码对象】) + 解剖 成员变量 Field —— 修饰符、名字、类型、赋值 构造方法 Cons…

DNShell

DNShell 一款基于DNS C2隧道的反弹shell工具。 支持 功能: 支持DNS-recordA-直连型 的C2隧道。 目标: Windows下基于Powershell的反弹。 Linux下基于ShellScript的反弹。 使用方法

【Redis】Redis学习笔记

概况 redis == remote Dictionary Server (远程字典服务) 基于内存的KV键值对内存数据库 作用:分布式缓存,与MySQL共同配合Redis -- 内存 MySQL -- 磁盘Redis -- NoSQL MySQL -- SQL内存存储 和 持久化(RDB+AOF)Redis支持一部将内存中的数据写入硬盘宕机 -- 可自行恢复高…

基于禁忌搜索算法的VRP问题求解matlab仿真,带GUI界面,可设置参数

1.程序功能描述基于禁忌搜索算法的VRP问题求解matlab仿真,带GUI界面,可设置参数。 2.测试软件版本以及运行结果展示MATLAB2022a版本运行 3.核心程序while COUNT<=Itertions ֲ L = zeros(Ant_Num,1); for i=1:Ant_Num Infor_Tabu_tmps = Infor_Tabu(i,:); R = Inf…

CMake 属性之全局属性

CMake 的全局属性是指在 CMake 配置过程中,对整个项目范围生效的设置。这些属性不同于目标 ( Target ) 属性或目录 ( Directory ) 属性,后者仅对特定的目标或目录生效。【写在前面】 CMake 的全局属性是指在 CMake 配置过程中,对整个项目范围生效的设置。 这些属性不同于目标…