m FPGA ベースの OFDM システム Verilog 実装(IFFT、FFT、シェーピング フィルタリング、CP 追加および CP 削除を含む)(テストベンチを含む)

目次

1. アルゴリズムシミュレーション効果

2. アルゴリズムに関連する理論的知識の要約

2.1 OFDM原理

2.2 FPGA に基づく OFDM システムの設計と実装

2.2.1IFFT/FFTモジュールの設計と実装

2.2.2 整形フィルタモジュールの設計と実装

2.2.3 CP モジュールの追加および削除の設計と実装

3.Verilogコアプログラム

4. 完全なアルゴリズム コード ファイルを取得します。


1. アルゴリズムシミュレーション効果

vivado2019.2のシミュレーション結果は以下の通りです。

CP追加・削除効果:

システム RTL 構造図:

2. アルゴリズムに関連する理論的知識の要約

          直交周波数分割多重 (OFDM) は、無線通信の分野で広く使用されている効率的な無線通信技術です。 OFDM テクノロジーの主な利点は、マルチパス効果と周波数選択性フェージングに効果的に抵抗できることであり、それによって無線通信システムのパフォーマンスと信頼性が向上します。ただし、OFDM システムの実装の複雑さは高く、効率的なデジタル信号処理技術が必要です。フィールド プログラマブル ゲート アレイ (FPGA) は、プログラマブル ロジック デバイスとして、高度な柔軟性と並列処理機能を備えており、複雑なデジタル信号処理アルゴリズムの実装に非常に適しています。

2.1 OFDM原理

       OFDM はマルチキャリア変調技術であり、その基本原理は、高速データ ストリームをいくつかの低速データ ストリームに分割し、それらを一連の直交サブキャリアに変調して送信することです。受信側では各サブキャリアを復調することで元の高速データストリームを復元できます。具体的には、OFDMシステムのサブキャリア数をN、シンボル周期をTsとすると、k番目のサブキャリアの周波数は、fk=k/Tsとなる。 1 シンボル期間内では、OFDM シンボルは次のように表現できます。

       s(t)=∑[n=0,N-1]X[n]exp(j2πnft)(1)

       ここで、X[n] は n 番目のサブキャリアの変調シンボルであり、QPSK、QAM、およびその他の変調方式のシンボルにすることができます。 exp(j2πnft) は、n 番目のサブキャリアの位相回転係数です。

       受信側では、受信した OFDM シンボルを復調することで、各サブキャリア上の変調シンボルを復元できます。具体的には、k 番目のサブキャリアの復調シンボルは次のように表すことができます。

       Y[k]=∫[t=0,Ts]r(t)exp(-j2πkft)dt(2)

        ここで、r(t) は受信した OFDM シンボルです。すべてのサブキャリアで復調されたシンボルのパラレル/シリアル変換とデコードを実行することで、元の高速データ ストリームを復元できます。

2.2 FPGA に基づく OFDM システムの設計と実装

         FPGA ベースの OFDM システムは主に、IFFT/FFT モジュール、整形フィルタ モジュール、CP 追加および CP 除去モジュール、および制御モジュールの部分で構成されます。このうち、IFFT/FFT モジュールは OFDM シンボルの変調と復調を実現するために使用され、整形フィルタ モジュールは OFDM シンボルの整形とフィルタリングに使用され、CP 追加および CP 除去モジュールはサイクリック プレフィックス (CP) の追加と削除に使用されます。 ) 影響によって引き起こされるマルチパスのシンボル間干渉 (ISI) を排除するため、制御モジュールはシステム全体のワークフローとデータ送信を制御するために使用されます。具体的なアーキテクチャは省略します。

2.2.1IFFT/FFTモジュールの設計と実装

       IFFT/FFT モジュールは、OFDM システムのコア部分の 1 つであり、OFDM シンボルの変調と復調を実装するために使用されます。 IFFT (逆高速フーリエ変換) は、周波数領域の変調シンボルを時間領域に変換して OFDM シンボルを形成するために使用され、FFT (高速フーリエ変換) は、受信した時間領域の OFDM シンボルを復調のために周波数領域に変換するために使用されます。具体的なアルゴリズムの式や実装方法については省略します。

2.2.2 整形フィルタモジュールの設計と実装

        整形フィルタ モジュールは、OFDM シンボルを整形およびフィルタリングして、帯域外放射を削減し、スペクトル利用率を向上させるために使用されます。一般的に使用される整形フィルターには、レイズド コサイン ロールオフ フィルター、ルート レイズド コサイン ロールオフ フィルターなどが含まれます。具体的な計算式や実装方法については割愛します。

2.2.3 CP モジュールの追加および削除の設計と実装

        CP プラスおよび CP 除去モジュールは、サイクリック プレフィックス (CP) を追加および削除して、マルチパス効果によって引き起こされるシンボル間干渉 (ISI) を除去するために使用されます。送信側で適切な長さの CP を追加すると、シンボル期間内にすべてのサブキャリアが同じチャネル応答を経験するようになり、ISI を回避できます。受信側で CP を削除すると、元の高速データ ストリームを復元できます。ガードインターバルを追加した後の IDFT (IFFT) に基づく OFDM システムのブロック図は次のとおりです。

3.Verilogコアプログラム

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/07/27 01:35:32
// Design Name: 
// Module Name: TEST_OFDM_tops
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module TEST_OFDM_tops;


reg             i_clk;               
reg             i_rst;          
reg             i_before_fft1;               
reg             i_last_fft1;   
reg             i_enable1;  
reg signed[15:0]i_real_dat1;                 
reg signed[15:0]i_imag_dat1;   


wire  o_enable_ifft;
wire signed[15:0]o_real_ifft;                 
wire signed[15:0]o_imag_ifft; 


wire  o_enable_ifftcp;
wire signed[15:0]o_real_ifftcp;                 
wire signed[15:0]o_imag_ifftcp; 


wire  o_enable_fftdcp;
wire signed[15:0]o_real_fftdcp;                 
wire signed[15:0]o_imag_fftdcp; 


wire  o_enable_fft;
wire signed[15:0]o_real_fft;                 
wire signed[15:0]o_imag_fft; 


OFDM_tops OFDM_tops_u(
                .i_clk         (i_clk),
                .i_rst         (i_rst),
                
                .i_before_fft1 (i_before_fft1),
                .i_last_fft1   (i_last_fft1),
                .i_enable1     (i_enable1),
                .i_real_dat1   (i_real_dat1),
                .i_imag_dat1   (i_imag_dat1),

                .o_start_ifft  (),
                .o_ends_ifft   (),
                .o_enable_ifft (o_enable_ifft),
                .o_real_ifft    (o_real_ifft),
                .o_imag_ifft    (o_imag_ifft),

                .o_start_ifftcp  (),
                .o_ends_ifftcp   (),
                .o_enable_ifftcp (o_enable_ifftcp),
                .o_real_ifftcp   (o_real_ifftcp),
                .o_imag_ifftcp   (o_imag_ifftcp),
                
                .o_start_fftdcp  (),
                .o_ends_fftdcp   (),
                .o_enable_fftdcp (o_enable_fftdcp),
                .o_real_fftdcp   (o_real_fftdcp),
                .o_imag_fftdcp   (o_imag_fftdcp), 
                
                .o_start_fft  (),
                .o_ends_fft   (),
                .o_enable_fft (o_enable_fft),
                .o_real_fft   (o_real_fft),
                .o_imag_fft   (o_imag_fft) 
                );

reg [15:0]cnts;
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
     begin
     cnts       <= 16'd0;
         i_real_dat1 <= 16'b1111110000000000;
         i_imag_dat1 <= 16'b0000001111111111;
     end
else begin
          
          if(i_enable1 == 1'b1)
          begin
          cnts       <= cnts+16'd1;
          
              if(cnts>=16'd200 & cnts<=16'd1848)
              begin
                  i_real_dat1 <= ~i_real_dat1;
                  if (cnts[0]==1'b1)
                  i_imag_dat1 <= ~i_imag_dat1;
                  else
                  i_imag_dat1 <=  i_imag_dat1;
              end    
          end
          else begin
          cnts       <= 16'd0;
         i_real_dat1 <= 16'b1111110000000000;
         i_imag_dat1 <= 16'b0000001111111111;
          end
     end
end




reg [19:0]cnts2;
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
     begin
     cnts2        <= 20'd0;
     i_before_fft1<=1'b0;
     i_enable1    <=1'b0;
     i_last_fft1  <=1'b0;
     end
else begin
          if(cnts2==20'd25000)
          cnts2  <= 20'd0;
          else
          cnts2  <= cnts2 + 20'd1;

          if(cnts2==20'd0)
          begin
             i_before_fft1<=1'b1;
             i_enable1    <=1'b0;
             i_last_fft1  <=1'b0;
          end
          if(cnts2==20'd1)
          begin
             i_before_fft1<=1'b1;
             i_enable1    <=1'b0;
             i_last_fft1  <=1'b0;
          end
          if(cnts2==20'd2)
          begin
             i_before_fft1<=1'b1;
             i_enable1    <=1'b0;
             i_last_fft1  <=1'b0;
          end
          if(cnts2==20'd3)
          begin
             i_before_fft1<=1'b1;
             i_enable1    <=1'b0;
             i_last_fft1  <=1'b0;
          end
          
          if(cnts2==20'd4)
          begin
             i_before_fft1<=1'b0;
             i_enable1    <=1'b0;
             i_last_fft1  <=1'b0;
          end
          if(cnts2>=20'd5 & cnts2<=20'd4+2047)
          begin
             i_before_fft1<=1'b0;
             i_enable1    <=1'b1;
             i_last_fft1  <=1'b0;
          end
          
          if(cnts2==20'd4+2048)
          begin
             i_before_fft1<=1'b0;
             i_enable1    <=1'b1;
             i_last_fft1  <=1'b1;
          end
          
          if(cnts2>20'd4+2048)
          begin
             i_before_fft1<=1'b0;
             i_enable1    <=1'b0;
             i_last_fft1  <=1'b0;
          end
     
     
     
     end
end



initial
begin
    i_clk = 1'b1;
    i_rst = 1'b1;
    #2000
    i_rst = 1'b0;
end

always #10 i_clk=~i_clk;




endmodule
00_053m

4. 完全なアルゴリズム コード ファイルを取得します。

おすすめ

転載: blog.csdn.net/hlayumi1234567/article/details/134724102