Main Content

このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。

マンチェスターレシーバー

マンチェスター レシーバーの例では、HDL Verifier™ を使用して、クロック回復機能を備えた VHDL マンチェスター レシーバー モデルを設計、テスト、検証する方法を示します。

マンチェスター符号化の背景

デジタル データの送信では、物理的な信号チャネルの制限を克服するために、何らかの形式の変調が必要になることがよくあります。デジタル データを変調するために使用される技術の 1 つに、マンチェスター符号化があります。この技術には次のような便利な特徴があります。

  • 送信クロック信号は受信データから簡単に抽出できます。

  • エンコードされた信号は、データに関係なく、DC 付近の周波数成分を生成することはありません。これは、AC 結合を必要とするチャネルを介した送信に役立ちます。

  • エンコード回路は非常にシンプルでステートレスです。

一方、マンチェスター符号化にはかなりの帯域幅(シャノン限界を超える)が必要であり、ワイヤレス アプリケーションでの有用性が制限される傾向があります。ただし、短距離光ファイバーやイーサネットなどの接続アプリケーションの場合、これは多くの場合適切なソリューションです。

次のセクションでは、次の内容について説明します。

エンコーディング

マンチェスター符号化では、各ビットが信号の遷移を表すように、クロック信号とデータ信号を同期ビット ストリームに符号化する送信機が使用されます。次の表は、エンコードの各ビット設定がどのように定義されるかを示しています。

マンチェスター符号化における遷移は、各ビットの中央と先頭で発生します。中央の遷移はビット値によって定義されますが、先頭の遷移は前のビットの値に依存します。次の図を考えてみましょう。

前述のマンチェスター符号化信号が示すように、

  • 最初のビットの値が 1 の場合、そのビットの中央でハイからローへの遷移が強制されます。

  • 2 番目のビットの値が 0 の場合、そのビットの中央で低から高への遷移が強制され、最初のビットが高から低に遷移したため、そのビットの開始時には遷移は発生しません。

  • 3 番目のビットの値が 0 の場合、そのビットの中央で低から高への遷移が強制され、2 番目のビットが低から高に遷移したため、そのビットの開始時に高から低への遷移が発生します。

  • 4 番目のビットの値が 1 の場合、そのビットの中央で高から低への遷移が強制され、3 番目のビットが低から高に遷移したため、そのビットの開始時には遷移は発生しません。

  • 5 番目のビットの値が 0 の場合、そのビットの中央で低から高への遷移が強制され、4 番目のビットが高から低に遷移したため、そのビットの開始時には遷移は発生しません。

受信機

エンコードされたビット ストリームを受信するデバイスは、クロックとデータ情報を分離してビット ストリームをデコードする役割を担います。ほとんどの場合、受信機はエンコードされた信号のみを使用して元のデータ ストリームを取得する必要があります。これにより通信チャネルは簡素化されますが、受信者は次の問題を克服する必要があります。

  • 信号をエンコードするために使用されるクロックと受信機のクロックの違い (下の図を参照)。

  • 2 つのクロックの周波数は近い場合があります。ただし、小さな周波数誤差が発生します。

  • クロック間の位相は任意になります。

マンチェスター レシーバーの例では、VHDL でモデル化され、ModelSim® でシミュレートされたマンチェスター レシーバー デバイスによって実行される計算を検証します。マンチェスター レシーバーを実装するには、さまざまなアプローチが利用可能です。この例では、受信機が送信クロックに非常に近い周波数のクロックを使用することを要求する遅延ロック ループ (DLL) を使用します。その結果、周波数ロック範囲が制限された単純なクロック回復回路が実現します。

受信機は受信したデータ ストリームをデータ レートの 16 倍でオーバーサンプリングします。したがって、受信クロックの公称周期はデータ周期の 1/16 である必要があります。送信クロックと受信クロックのわずかな差異やチャネル遅延のドリフトを補正するために、受信機はデータ期間ごとに最大 1 クロック サイクル (+/-) までデータ期間を調整します。したがって、受信機は 15、16、または 17 クロック サイクルを使用して、受信したサンプリング信号からエンコードされたデータを復元できます。たとえば、受信機のクロックが送信機のクロックよりもわずかに速い場合 (周波数エラー)、受信サイクルでは、それを補正するために追加のクロック サイクルを追加する必要がある場合があります。

起動時に発生するような突然の大きな位相エラーでは、信号を適切にロックするために複数のデータ期間が必要になります。最大位相補正を全データ期間の 1/16 に制限すると、受信機は大きな位相エラーを補正するのに時間がかかる可能性があります。

同相畳み込みと直交畳み込みによるデコード

受信したマンチェスター信号のデコードはいくつかの方法で行うことができますが、この例で採用されているアプローチは、マンチェスター符号化を +180 度と -180 度の 2 つのシンボルを持つデジタル位相変調と見なすことです。変調周波数で入力信号を基準同相 (I) および直交 (Q) 波形と畳み込むことにより、データを抽出し、受信波形の位相エラーに関する情報を取得できます。1 つのデータ サイクルの後、受信機は I/Q 畳み込み値の測定値である 2 つの値 (VHDL コードでは Isum と Qsum と呼ばれます) を計算します。受信機は値をデコードして次のことを予測します。

  • サイクルの元の送信データ値

  • 受信信号と受信機のデータ周期間の位相誤差の推定

この設計の重要な側面は、I/Q 畳み込み値の解釈です。データ受信サイクルの終了時に、受信機は I/Q 値を送信されたデータと位相誤差の推定値に変換します。この情報を提示する 1 つの方法は、これらの解釈を測定された I/Q 値に対するプロットとして表示することです。

測定された I と Q がエンコードされたデータ値について完全に曖昧な場合、データは無効であると見なされます。

同様の方法で、位相補正値の I/Q マッピングをプロット形式で生成できます。このようなプロットは、デコード ブロックを視覚的に表現します。実際には、このマッピングの詳細は、マンチェスター レシーバーの安定性とパフォーマンスに大きな影響を与えます。

受信機が受信波形に完全にロックされている理想的なケースでは、受信サイクルは 16 サイクルの長さになり、測定された I/Q 畳み込み値は非常に簡単に解釈できます。ただし、データ サイクルが 15 サイクルまたは 17 サイクルの長さの場合、IQ 畳み込みの測定に若干のバイアスが生じます。これらのサイクル中に I/Q 測定をカスタマイズすることは可能ですが、受信機のサイズと複雑さが増大します。代わりに、結果の値のデコードに変更を加えることなく、データ取得サイクルが延長または短縮されます。ただし、このデコーダー バイアスにより、ディザリングの問題が発生したり、ノイズ耐性が低下したりする可能性があります。

マンチェスター受信機の VHDL 実装

この例では、マンチェスター レシーバーの VHDL 実装に焦点を当てています。マンチェスター符号化信号のデコードにはいくつかの課題がありますが、その中で最も顕著なのはクロック回復です。クロックは受信信号に埋め込まれており、元のデータ ストリームを再現するには抽出する必要があります。下の図は、VHDL コードの 3 つの主要セクションに分かれたサンプル デザインを示しています。

IQコンボルバー:受信信号をサンプリングし、同相 (I) 波形と直交 (Q) 波形の畳み込みを計算します。各波形について、計算は、状態カウンタから受信したサンプルとデコードされた波形に対する XOR 演算の合計として実装されます。

デコーダー:I/Q コンボルバの結果を解釈する組み合わせ回路をモデル化します。

状態カウンター:必要に応じて位相誤差 (遅れと進み) を考慮して、受信信号と畳み込まれた I/Q 波形を生成します。I/Q ジェネレータの位相は、入力されるマンチェスター符号化波形と一致するように調整されます。必要な調整を実行するために、新しいサイクルの開始時に、状態カウンタは調整値 adj をチェックし、次の I/Q サイクルの期間を変更します。この調整値は、I/Q 波形に通常使用される 16 周期から 1 つのクロック周期を追加または削除することに制限されます。

次のタイミング図は、同相波形、直交波形、および位相エラー、データ遅延、およびデータリードのない畳み込み結果を示しています。

MATLAB® VHDL コンポーネントのモデル

この例には、VHDL モデルをテストする 3 つの MATLAB® 関数が含まれています。MATLAB 関数は、3 つの VHDL コンポーネントのそれぞれにマップされます。

I/Qコンボルバー:VHDL I/Q コンボルバー コードが、ランダムに生成されたサンプル ストリームの予想される出力を計算することを確認します。MATLAB 関数は、同相波形と直交波形 (I_wf と Q_wf) の畳み込みを計算することでこれを検証します。計算は、バイナリ信号の XOR と累積として実装されます。

デコーダー:視覚的な検証のために、デコーダーによって生成された I/Q マッピングのプロットを表示します。

状態カウンター:同相波形と直交波形を生成します。テストベンチ中、この MATLAB 関数は、クロック生成、リセットなど、シミュレーション中に適用される信号を完全に制御します。

例の実行

MATLAB サーバーの起動

この例では、オペレーティング システムによって使用可能と識別されたソケット ポート番号を使用して TCP ソケット通信を使用するように、MATLAB サーバー、hdldaemon を起動します。

hdldaemon('socket',0)      % Activate MATLAB server to accept foreign VHDL calls

次に、この例では、 'status' オプションを指定して hdldaemon を呼び出し、割り当てられたポート番号を取得し、将来の参照用に portnum に保存します。

dstat = hdldaemon('status');
portnum = dstat.ipc_id;

アプリケーション リンクのサーバー部分とクライアント部分の両方で同じポート番号を使用する必要があります。したがって、ある時点で、サンプル プログラムはポート番号を ModelSim に転送する必要があります。

デコーダーのテスト

マンチェスター レシーバー モデルで最初にテストされるコンポーネントはデコーダーです。スクリプトは、このエンティティの伝達関数の 2 つのプロットを作成します。このテストは、デコーダーの動作を単純に視覚化したものです。サンプルスクリプト:

1. testisdone フラグを 0 に設定し、情報メッセージを表示します。

global testisdone;
testisdone = 0;

2. プロジェクト ディレクトリを、書き込みアクセス権があり、ModelSim プロジェクトを保持するのに適したディレクトリに設定します。

projectdir = pwd;

3. バックスラッシュ (\) をスラッシュ (/) に置き換えて、プロジェクト ディレクトリとデコーダー VHDL ファイル仕様の形式を、ModelSim と Tcl が使用する UNIX® 形式に変更します。

unixprojectdir =  ['"' strrep(projectdir,'\','/')  '"'];
unixsrcfile = 'decoder.vhd';

4. ModelSim のコンテキストで実行される Tcl コマンドのシーケンスを定義します。

tclcmd = { ['cd ' unixprojectdir ],...
            'vlib work',...
           ['vcom -performdefaultbinding ' unixsrcfile],...
            'vsimmatlab  work.decoder',...
           ['matlabtb decoder -mfunc manchester_decoder -socket ',num2str(portnum)],...
            'run 3000',...
            'quit -f'};

前のリストは各コマンドを定義します:

  • 書き込み可能なプロジェクト ディレクトリへの変更。

  • ModelSim ウィンドウの配置を調整して、MATLAB ウィンドウが隠れないようにします。

  • プロジェクト ライブラリ作業がまだ存在しない場合は作成します。

  • VHDL ファイルをコンパイルします。サンプル スクリプトでは、modelsim.ini ファイルでデフォルト バインディングが無効になっている場合に、デフォルト バインディングを有効にするために 'performdefaultbinding' オプションを指定します。

  • vsimmatlab コマンドを使用して、MATLAB テストベンチ用の VHDL エンティティ デコーダーのインスタンスをロードします。このコマンドは、ModelSim コマンド セットの HDL Verifier 拡張です。

  • matlabtb コマンドを使用して、エンティティ デコーダーのロードされたインスタンスの MATLAB テスト ベンチ セッションを開始します。このコマンドは、ModelSim コマンド セットの拡張です。例のコマンドは、エンティティ インスタンス、エンティティをテストする MATLAB 関数 (manchester_decoder.m)、およびソケット ポート portnum を使用した TCP ソケット通信を指定します。ModelSim と MATLAB の間にリンクを確立するには、portnum の値が MATLAB サーバー (hdldaemon) の起動時に指定されたソケット ポートと一致する必要があります。

  • 現在の解像度制限の 3000 回の反復で ModelSim シミュレーションを実行します。デフォルトでは、シミュレーションは 3000 ナノ秒間実行されます。確認を求めずに ModelSim を終了します。

5. vsim を呼び出して、HDL Verifier で使用するために ModelSim を起動します。

vsim('startupfile','decoder.do','tclstart',tclcmd);

このコマンドは、いくつかの汎用起動コマンドを実行し、次に 'tclstart' プロパティで指定されたユーザー定義コマンドを実行する Tcl コマンド スクリプトを使用して ModelSim を起動します。'startfile' プロパティにより、vsim は将来の参照や使用のために、起動 Tcl コマンド スクリプト全体をdecoder.do に書き込みます。

6. 情報メッセージを表示し、(manchester_decoder.m) の実行が完了するまで待機します。

disp('Waiting for testing of ''decoder.vhd'' to complete');
disp('(flag from manchester_decoder.m indicates completion)');
while testisdone == 0,
    pause(0.501);
end
disp('MATLAB test of decoder.vhd is complete!');
disp('Check the generated plot for results.');

I/Qコンボルバーのテスト

I/Q コンボルバーについても同様です。サンプルスクリプト:

1. testisdone フラグを 0 に設定し、情報メッセージを表示します。

testisdone = 0;

2. プロジェクト ディレクトリを、書き込みアクセス権があり、ModelSim プロジェクトを保持するのに適したディレクトリに設定します。

projectdir = pwd;

3. バックスラッシュ (\) をスラッシュ (/) に置き換えて、プロジェクト ディレクトリとデコーダー VHDL ファイル仕様の形式を、ModelSim と Tcl が使用する UNIX 形式に変更します。

unixprojectdir =  ['"' strrep(projectdir,'\','/')  '"'];
unixsrcfile = 'iqconv.vhd';

4. ModelSim のコンテキストで実行される Tcl コマンドのシーケンスを定義します。

tclcmd = { ['cd ' unixprojectdir ],...
            'vlib work',...
           ['vcom -performdefaultbinding ' unixsrcfile],...
            'vsimmatlab work.iqconv',...
            'force /iqconv/clk 1 0, 0 5 ns -repeat 10 ns ',...
            'force /iqconv/enable 1',...
            'force /iqconv/reset 1',...
            'run 100',...
           ['matlabtb iqconv -rising /iqconv/clk -mfunc manchester_iqconv -socket ',num2str(portnum)],...
            'run 1000',...
            'quit -f'};

次のリストは各コマンドを定義します。

  • 書き込み可能なプロジェクト ディレクトリへの変更。

  • ModelSim ウィンドウの配置を調整して、MATLAB ウィンドウが隠れないようにします。

  • プロジェクト ライブラリ作業がまだ存在しない場合は作成します。

  • VHDL ファイルをコンパイルします。サンプル スクリプトでは、modelsim.ini ファイルでデフォルトのバインディングが無効になっている場合に、デフォルトのバインディングを有効にするために -performdefaultbinding オプションを指定します。

  • vsimmatlab コマンドを使用して、MATLAB テストベンチ用の VHDL エンティティ iqconv のインスタンスをロードします。このコマンドは、ModelSim コマンド セットの HDL Verifier 拡張です。

  • ModelSim の force コマンドを適用して、エンティティの clk、enable、および reset 信号を駆動します。これらの信号は、oport データとしてテスト ベンチに渡されます。最初の force コマンドは、time が 0 のときに clk を 1 に設定し、5 ナノ秒後に 0 に設定し、10 ナノ秒ごとにハイからローへのサイクルを繰り返すことを指定します。2 番目と 3 番目の force コマンドは、enable 信号と reset 信号を 1 に設定します。

  • 現在の制限の 100 回の反復で ModelSim シミュレーションを実行します。デフォルトでは、シミュレーションは 100 ナノ秒間実行されます。これは起動フェーズを説明します。

  • matlabtb コマンドを使用して、エンティティ iqconv のロードされたインスタンスの MATLAB テストベンチ セッションを開始します。このコマンドは、ModelSim コマンド セットの拡張です。例のコマンドは、エンティティ インスタンス iqconv、MATLAB 関数の呼び出しをトリガーするイベント、エンティティをテストする MATLAB 関数 (manchester_iqconv.m)、およびソケット ポート portnum との TCP ソケット通信を指定します。-rising オプションは、clk が立ち上がりエッジを経験した時に MATLAB 関数が呼び出されることを指定します。ModelSim と MATLAB の間にリンクを確立するには、-socket で指定された値が、MATLAB サーバー (hdldaemon) の起動時に指定されたソケット ポートと一致する必要があります。

  • 現在の解像度制限の 1000 回の反復で ModelSim シミュレーションを実行します。デフォルトでは、シミュレーションは 1000 ナノ秒間実行されます。

  • 確認を求めずに ModelSim を終了します。

5. vsim を呼び出して、HDL Verifier で使用するために ModelSim を起動します。

vsim('startupfile','iqconv.do','tclstart',tclcmd);

このコマンドは、いくつかの汎用起動コマンドを実行し、次に 'tclstart' プロパティで指定されたユーザー定義コマンドを実行する Tcl コマンド スクリプトを使用して ModelSim を起動します。「startfile」プロパティにより、vsim は将来の参照や使用のために、起動 Tcl コマンド スクリプト全体を iqconv.do に書き込みます。

6. 情報メッセージを表示し、(manchester_iqconv.m) の実行が完了するまで待機します。

disp('Waiting for testing of ''iqconv.vhd'' to complete');
disp('(flag from manchester_iqconv.m indicates completion)');
while testisdone == 0,
    pause(0.501);
end
disp('Test of iqconv.vhd complete (If it failed, there would be an error message printed above)!');

状態カウンタのテスト

ここで、状態カウンター (statecnt.vhd) をテストします。このスクリプトは、ランダムに生成されたデータ サンプル ストリームのチェック isum および qsum 出力を作成し、testisdone フラグを 0 に設定して情報メッセージを表示します。

testisdone = 0;
projectdir = pwd;
unixprojectdir =  ['"' strrep(projectdir,'\','/')  '"'];
unixsrcfile = 'statecnt.vhd';
tclcmd = { ['cd ' unixprojectdir ],...
            'vlib work',...
           ['vcom -performdefaultbinding ' unixsrcfile],...
           'vsimmatlab -t 1ns work.statecnt ',...
            'force /statecnt/clk 1 0, 0 5 ns -repeat 10 ns ',...
           ['matlabtb statecnt -mfunc manchester_statecnt -socket ',num2str(portnum)],...
            'run 30000',...
            'quit -f'};

次のリストは、tclcmd 内の各 TCL コマンドを定義します。

  • 書き込み可能なプロジェクト ディレクトリへの変更。

  • ModelSim ウィンドウの配置を調整して、MATLAB ウィンドウが隠れないようにします。

  • プロジェクト ライブラリ作業がまだ存在しない場合は作成します。

  • VHDL ファイルをコンパイルします。サンプル スクリプトでは、modelsim.ini ファイルでデフォルトのバインディングが無効になっている場合に、デフォルトのバインディングを有効にするために -performdefaultbinding オプションを指定します。vsimmatlab コマンドを使用して、MATLAB テストベンチ用の VHDL エンティティ statecnt のインスタンスをロードします。このコマンドは、ModelSim コマンド セットの HDL Verifier 拡張です。-t オプションは、ModelSim シミュレータの時間分解能を 1 ナノ秒 (デフォルト) に指定します。ModelSim の force コマンドを適用してエンティティの clk 信号を駆動し、それが oport データとしてテスト ベンチに渡されます。force コマンドは、time が 0 のときに clk が 1 に設定され、5 ナノ秒後に 0 に設定され、10 ナノ秒ごとに高から低へのサイクルが繰り返されることを指定します。

  • matlabtb コマンドを使用して、読み込まれたエンティティ statecnt のインスタンスの MATLAB テスト ベンチ セッションを開始します。このコマンドは、ModelSim コマンド セットの拡張です。例のコマンドは、エンティティ インスタンス statecnt、エンティティをテストする MATLAB 関数 (manchester_statecnt.m)、およびソケット ポート portnum との TCP ソケット通信を指定します。ModelSim と MATLAB の間にリンクを確立するには、-socket で指定された値が、MATLAB サーバー (hdldaemon) の起動時に指定されたソケット ポートと一致する必要があります。

  • 現在の解像度制限の 30000 回の反復で ModelSim シミュレーションを実行します。デフォルトでは、シミュレーションは 30000 ナノ秒間実行されます。

  • 確認を求めずに ModelSim を終了します。

vsim('startupfile','statecnt.do','tclstart',tclcmd);
disp('Waiting for testing of ''statecnt.vhd'' to complete');
disp('(flag from manchester_statecnt.m indicates completion)');
while testisdone == 0,
    pause(0.501);
end
disp('MATLAB test of statecnt.vhd is complete!');
disp('Check the generated plot for results.');

hdldaemon を強制終了する

hdldaemon('KILL');

statecnt.vhd のテストが完了しました (生成されたプロットを調べます)。これでマンチェスターのチュートリアルの例は終了です。