m基于FPGA的GFDM调制解调系统verilog实现,包含testbench仿真测试文件

简介: m基于FPGA的GFDM调制解调系统verilog实现,包含testbench仿真测试文件

1.算法仿真效果
本系统进行了Vivado2019.2平台的开发,测试结果如下:

5714de3ea2609ef09353125f0a93ffc6_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

GFDM调制信号放大:

0a2e40785f90399a264108c1b1ebbbc3_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

GFDM解调信号放大:

539a4ce6f102bdbacb6dc840a6758843_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

系统RTL结构图如下:
13111a8017fe0db7ba58fe21135f7fd3_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

2.算法涉及理论知识概要
随着通信技术的不断发展,人们对数据传输速率和频谱效率的要求越来越高。为了满足这些需求,一种名为广义频分复用(GFDM)的新型调制技术应运而生。GFDM具有灵活的子载波间隔和符号时间长度,能够在各种复杂环境中实现高效的数据传输。

   GFDM是一种基于子载波的多载波调制技术,通过对子载波进行调制和解调来实现数据传输。与传统的正交频分复用(OFDM)相比,GFDM具有更灵活的子载波间隔和符号时间长度,可以更好地适应不同的信道环境。

2.1 子载波调制
在GFDM中,每个子载波可以采用不同的调制方式,如BPSK、QPSK、16QAM等。调制符号在子载波上进行传输,子载波的间隔可以根据需要进行调整。调制符号在每个子载波上的传输时间称为符号时间,符号时间的长度也可以根据需要进行调整。

   在GFDM中,每个子载波可以采用不同的调制方式。以BPSK为例,调制公式为:s_k(t) = a_k * cos(2πf_k t + φ_k)其中,s_k(t)表示第k个子载波上的调制信号,a_k表示调制符号的幅度,f_k表示第k个子载波的频率,φ_k表示第k个子载波的相位。

2.2 脉冲成型滤波
在GFDM中,为了减小子载波间的干扰,通常在调制符号上施加一个脉冲成型滤波器。该滤波器可以在时域和频域上实现良好的局部化特性,从而减小子载波间的干扰。常用的脉冲成型滤波器包括矩形滤波器、高斯滤波器和升余弦滤波器等。

  在GFDM中,通常在调制符号上施加一个脉冲成型滤波器。以矩形滤波器为例,滤波公式为:g(t) = rect(t/T_s)其中,g(t)表示脉冲成型滤波器,rect(t/T_s)表示矩形函数,T_s表示符号时间长度。

2.3 GFDM信号生成
在GFDM中,经过子载波调制和脉冲成型滤波后的信号称为GFDM符号。一个GFDM符号由多个子载波组成,每个子载波上传输一个调制符号。多个GFDM符号组成一个GFDM帧,用于在信道上进行传输。

   在GFDM中,经过子载波调制和脉冲成型滤波后的信号称为GFDM符号。一个GFDM符号由多个子载波组成,每个子载波上传输一个调制符号。以N个子载波为例,GFDM信号生成公式为:x(t) = ∑_{k=0}^{N-1} s_k(t) * g(t - kT_s)其中,x(t)表示GFDM信号,s_k(t)表示第k个子载波上的调制信号,g(t)表示脉冲成型滤波器,T_s表示符号时间长度。

3.Verilog核心程序
````timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module TEST_GFDM;
reg i_clk;
reg i_clk2x;
reg i_rst;
reg i_fft_start;
reg i_fft_end;
reg i_fft_en;
reg signed[15:0]i_I;
reg signed[15:0]i_Q;

wire o_GFDM_start;
wire o_GFDM_ends ;
wire o_GFDM_enable;
wire signed[31:0]o_GFDM_I;
wire signed[31:0]o_GFDM_Q;

wire o_deGFDM_start;
wire o_deGFDM_ends ;
wire o_deGFDM_enable;
wire signed[31:0]o_deGFDM_I;
wire signed[31:0]o_deGFDM_Q;

GFDM GFDM_u(
.i_clk (i_clk),
.i_clk2x (i_clk2x),
.i_rst (i_rst),

            .i_fft_start   (i_fft_start),
            .i_fft_end     (i_fft_end),
            .i_fft_en      (i_fft_en),
            .i_I           (i_I),
            .i_Q           (i_Q),

            .o_GFDM_start       (o_GFDM_start),
            .o_GFDM_ends        (o_GFDM_ends),
            .o_GFDM_enable      (o_GFDM_enable),
            .o_GFDM_I           (o_GFDM_I),
            .o_GFDM_Q           (o_GFDM_Q),

            .o_deGFDM_start     (o_deGFDM_start),
            .o_deGFDM_ends      (o_deGFDM_ends),
            .o_deGFDM_enable    (o_deGFDM_enable),
            .o_deGFDM_I         (o_deGFDM_I),
            .o_deGFDM_Q         (o_deGFDM_Q)
            );

reg [15:0]cnts;
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
cnts <= 16'd0;
i_I <= -1000;
i_Q <= 1000;
end
else begin

      if(i_fft_en == 1'b1)
      begin
      cnts       <= cnts+16'd1;

          if(cnts>=16'd400 & cnts<=16'd1648)
          begin
              i_I <= ~i_I;
              if (cnts[0]==1'b1)
              i_Q <= ~i_Q;
              else
              i_Q <=  i_Q;
          end    
      end
      else begin
      cnts       <= 16'd0;
      i_I <= -1000;
      i_Q <= 1000;
      end
 end

end
reg [19:0]cnts2;
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
cnts2 <= 20'd0;
i_fft_start<=1'b0;
i_fft_en <=1'b0;
i_fft_end <=1'b0;
end
else begin
if(cnts2==20'd30000)
cnts2 <= 20'd0;
else
cnts2 <= cnts2 + 20'd1;

      if(cnts2==20'd0)
      begin
         i_fft_start<=1'b1;
         i_fft_en    <=1'b0;
         i_fft_end  <=1'b0;
      end
      if(cnts2==20'd1)
      begin
         i_fft_start<=1'b1;
         i_fft_en    <=1'b0;
         i_fft_end  <=1'b0;
      end
      if(cnts2==20'd2)
      begin
         i_fft_start<=1'b1;
         i_fft_en    <=1'b0;
         i_fft_end  <=1'b0;
      end
      if(cnts2==20'd3)
      begin
         i_fft_start<=1'b1;
         i_fft_en    <=1'b0;
         i_fft_end  <=1'b0;
      end

      if(cnts2==20'd4)
      begin
         i_fft_start<=1'b0;
         i_fft_en    <=1'b0;
         i_fft_end  <=1'b0;
      end
      if(cnts2>=20'd5 & cnts2<=20'd4+2047)
      begin
         i_fft_start<=1'b0;
         i_fft_en    <=1'b1;
         i_fft_end  <=1'b0;
      end

      if(cnts2==20'd4+2048)
      begin
         i_fft_start<=1'b0;
         i_fft_en    <=1'b1;
         i_fft_end  <=1'b1;
      end

      if(cnts2>20'd4+2048)
      begin
         i_fft_start<=1'b0;
         i_fft_en    <=1'b0;
         i_fft_end  <=1'b0;
      end



 end

end
initial
begin
i_clk2x= 1'b1;
i_clk = 1'b1;
i_rst = 1'b1;

#1000
i_rst = 1'b0;

end
always #10 i_clk=~i_clk;
always #5 i_clk2x=~i_clk2x;
endmodule
```

相关文章
|
22天前
|
机器学习/深度学习 人工智能 测试技术
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
EdgeMark是一个面向嵌入式AI的自动化部署与基准测试系统,支持TensorFlow Lite Micro、Edge Impulse等主流工具,通过模块化架构实现模型生成、优化、转换与部署全流程自动化,并提供跨平台性能对比,助力开发者在资源受限设备上高效选择与部署AI模型。
207 9
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
|
29天前
|
Java 测试技术 数据安全/隐私保护
通过yaml文件配置自动化测试程序
通过yaml文件可以将自动化测试环境,测试数据和测试行为分开,请看一下案例
54 4
|
5月前
|
数据采集 算法 数据管理
频标频稳比对测试系统重新定义测量边界
在上海张江实验室的超净间里,一束激光正以每秒 30 万公里的速度穿越真空腔,与原子跃迁频率进行着纳米级的较量。而在千里之外的西安高新区,一台黑色金属机箱内,SYN5609A 型频标比对测量系统正以同样的精度,为这场量子级的时间竞赛提供着基准坐标。这台看似普通的仪器,正在用双混频时差技术,将人类对时间的掌控精度推向新的维度。
|
4月前
|
人工智能 缓存 自然语言处理
别再手搓测试数据了!AE测试数据智造系统揭秘
本文介绍如何通过构建基于大语言模型的测试数据智造Agent,解决AliExpress跨境电商测试中数据构造复杂、低效的问题,推动测试效率提升与智能化转型。
别再手搓测试数据了!AE测试数据智造系统揭秘
|
6月前
|
jenkins 测试技术 Shell
利用Apipost轻松实现用户充值系统的API自动化测试
API在现代软件开发中扮演着连接不同系统与模块的关键角色,其测试的重要性日益凸显。传统API测试面临效率低、覆盖率不足及难以融入自动化工作流等问题。Apipost提供了一站式API自动化测试解决方案,支持零代码拖拽编排、全场景覆盖,并可无缝集成CI/CD流程。通过可视化界面,研发与测试人员可基于同一数据源协作,大幅提升效率。同时,Apipost支持动态数据提取、性能压测等功能,满足复杂测试需求。文档还以用户充值系统为例,详细介绍了从创建测试用例到生成报告的全流程,帮助用户快速上手并提升测试质量。
|
6月前
|
数据采集 移动开发 算法
【硬件测试】基于FPGA的QPSK调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现QPSK调制与软解调系统,包含Testbench、高斯信道、误码率统计模块,并支持不同SNR设置。硬件版本新增ILA在线数据采集和VIO在线SNR设置功能,提供无水印完整代码及测试结果。通过VIO分别设置SNR为6dB和12dB,验证系统性能。配套操作视频便于用户快速上手。 理论部分详细解析QPSK调制原理及其软解调实现过程,涵盖信号采样、相位估计、判决与解调等关键步骤。软解调通过概率估计(如最大似然法)提高抗噪能力,核心公式为*d = d_hat / P(d_hat|r[n])*,需考虑噪声对信号点分布的影响。 附Verilog核心程序代码及注释,助力理解与开发。
165 5
|
7月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的MSK调制解调系统系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现MSK调制解调系统,采用Verilog开发,包含同步模块、高斯信道模拟、误码率统计等功能。相比仿真版本,新增ILA数据采集与VIO在线SNR设置模块。通过硬件测试验证,展示不同SNR(如10dB和16dB)下的性能表现。研究聚焦软件无线电领域,优化算法复杂度以适应硬件限制,利用MSK恒定包络、相位连续等特性提升频谱效率。核心代码实现信号生成、调制解调、滤波及误码统计,提供完整的硬件设计与分析方案。
224 19
|
7月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的2ASK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR
本内容展示了基于Vivado2019.2的算法仿真效果,包括设置不同信噪比(SNR=8db和20db)下的结果及整体波形。同时,详细介绍了2ASK调制解调技术的原理与实现,即通过改变载波振幅传输二进制信号,并提供数学公式支持。此外,还涉及帧同步理论,用于确定数据帧起始位置。最后,给出了Verilog核心程序代码,实现了2ASK解调与帧同步功能,结合DDS模块生成载波信号,完成信号处理流程。
133 0
|
7月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的4ASK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的4ASK调制解调系统的硬件测试版本,该系统包括testbench、高斯信道模块和误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置功能。通过VIO设置不同SNR(如15dB和25dB),实现了对系统性能的实时监测与调整。4ASK是一种通过改变载波幅度表示数据的数字调制方式,适用于多种通信场景。FPGA平台的高效性和灵活性使其成为构建高性能通信系统的理想选择。
164 17
|
7月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的16QAM调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前开发的16QAM调制与软解调系统,增加了硬件测试功能。该系统包含FPGA实现的16QAM调制、软解调、高斯信道、误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置模块。通过硬件测试,验证了不同SNR条件下的系统性能。16QAM软解调通过比较接收信号采样值与16个调制点的距离,选择最近的调制点来恢复原始数据。核心Verilog代码实现了整个系统的功能,包括SNR设置、信号处理及误码率统计。硬件测试结果表明系统在不同SNR下表现良好,详细操作步骤可参考配套视频。
179 13

热门文章

最新文章