目次
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. 完全なアルゴリズム コード ファイルを取得します。
で