首页 > 其他分享 >m基于FPGA的GFDM调制解调系统verilog实现,包含testbench仿真测试文件

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

时间:2023-10-17 22:56:40浏览次数:41  
标签:wire FPGA 符号 testbench deGFDM verilog 载波 调制 GFDM

1.算法仿真效果

本系统进行了Vivado2019.2平台的开发,测试结果如下:

 

 

 

GFDM调制信号放大:

 

 

 

GFDM解调信号放大:

 

 

 

系统RTL结构图如下:

 

 

 

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

 

  

 

标签:wire,FPGA,符号,testbench,deGFDM,verilog,载波,调制,GFDM
From: https://www.cnblogs.com/51matlab/p/17770924.html

相关文章

  • verilog数的舍入溢出和截位
    四舍五入(round)前面讲的都是对数据进行扩位,这一节说的是对数据截位时如何进行四舍五入以提高截位后数据的精度。假设一个9Q6格式的数据为:9’b011.101101,现在只想保留3位小数位,显然必须把最后三位小数位截掉,但是不能直接把数据截成6’b011.101,这样是不精确的,工程上一般也不允许这......
  • verilog浮点表示
    1.verilog浮点表示定点运算有两个缺点:①可处理动态范围小;②由截尾舍入产生的百分比误差随着数的绝对值的减小而增加,这个问题可利用浮点数来解决。根据IEE754-1985标准,非负数n可以用两个参数表示,即尾数M和指数E,其表示形式为:$\eta =M×2^{E}$signexponentsignifica......
  • 星嵌OMAPL138+国产FPGA工业开发板 中科亿海微 EQ6HL45系列FPGA 替代spartan-6
    1XQ138F-EVM评估板简介基于TIOMAP-L138(定点/浮点DSPC674x+ARM9)+FPGA处理器的开发板;OMAP-L138是TI德州仪器的TMS320C6748+ARM926EJ-S异构双核处理器,主频456MHz,高达3648MIPS和2746MFLOPS的运算能力;FPGA采用中科亿海微eHiChip6家族EQ6HL45系列芯片,或XilinxSpartan-6系列芯......
  • 重磅:FPGA实现MIPI DSI4线720P
    1.液晶屏概述 显示屏LCDMIPIDSI4lane,支持分辨率720*1280,60HZ彩色显示。用于对接国产GOWIN的NR-9C的开发板和LATTICE的CROSSLINK开发板,显示MIPIDSI功能。     MIPIDSI是4-LANE,MIPI速率在480MHZ。支持LP模式初始化和HS模式显示数据发送。     屏是5寸,支持DSIS......
  • 重磅:FPGA实现MIPI DSI4线720P
    1.液晶屏概述 显示屏LCDMIPIDSI4lane,支持分辨率720*1280,60HZ彩色显示。用于对接国产GOWIN的NR-9C的开发板和LATTICE的CROSSLINK开发板,显示MIPIDSI功能。      MIPIDSI是4-LANE,MIPI速率在480MHZ。支持LP模式初始化和HS模式显示数据发送。        ......
  • verilog基础语法
    模块使用模块定义加参数modulectrl_5#(parameterintaddr_width=8,parameterintdata_width=32)(input[addr_width-1:0]cmd_addr_i);//模块例化时决定端口宽度ctrl_5#(.addr_width(16))regs5_inst(...);宏定义和模块定义`defineADDR_WIDTH6`defineDATA_......
  • System Verilog
    数据类型​ 数据类型用来定义存储值或者用于线连接的变量数据类型位宽符号值reg可变无符号四态(0,1,x,z)wire可变无符号四态(0,1,x,z)logic可变无符号四态(0,1,x,z)bit1无符号二态(0,1)byte8有符号二态(0,1)shortint16有符号二态(0......
  • FPGA与STM32的区别与联系?如何互联?
    FPGA(现场可编程门阵列)和STM32(意法半导体公司的一个系列的单片机产品)都是数字电路设计中的重要工具,但它们在应用场景、可编程性和开发方式等方面存在显著的区别。首先,FPGA和STM32在应用场景中的区别在于,FPGA适用于处理并发的信号,比如多个方波信号同时输入、输出,这是STM32等单片机难......
  • Stable Diffusion 里 GFPGAN、ESRGAN 和 RealESRGAN 的功能介绍
    StableDiffusion是一个深度学习技术,主要用于图像生成和图像增强任务。它的核心思想是通过稳定的训练过程来生成高质量的图像,同时提供了一种用于生成和增强图像的框架。在StableDiffusion中,GFPGAN、ESRGAN和RealESRGAN都是与图像生成和增强相关的功能,它们各自有不同的应用......
  • FPGA直方图均衡化 Label: Research
    使用FPGA对图像直方图做出均衡化,公式如下:$$D_{B}=f(D_{A})=\frac{D_{max}}{A_{0}}\sum_{i=0}^{D_{A}}H(i)$$上式中,H(i)为第i级灰度的像素个数,A为图像的面积,也即像素总数。因此,计算均衡后的图像步骤如下:(1)首先计算出当前图像......