Main Content

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

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

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

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

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

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

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

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

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

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

エンコーディング

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

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

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

  • 最初のビットの値が 1 の場合、そのビットの中心で High から Low への遷移が強制されます。

  • 2 番目のビットの値が 0 の場合、そのビットの中心で Low から High への遷移が強制されます。最初のビットが High から Low へ遷移したため、そのビットの先頭では遷移は発生しません。

  • 3 番目のビットの値が 0 の場合、そのビットの中心で Low から High への遷移が強制され、2 番目のビットが Low から High へ遷移したため、そのビットの先頭で High から Low への遷移が発生します。

  • 4 番目のビットの値が 1 の場合、そのビットの中心で High から Low への遷移が強制されます。3 番目のビットは Low から High へ遷移するため、そのビットの先頭では遷移は発生しません。

  • 5 番目のビットの値が 0 の場合、そのビットの中心で Low から High への遷移が強制されます。4 番目のビットは High から Low へ遷移するため、そのビットの先頭では遷移は発生しません。

受信機

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

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

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

  • クロック間の位相は任意です。

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

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

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

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

受信したマンチェスター信号のデコードはいくつかの方法で行うことができますが、この例で採用されているアプローチは、マンチェスター エンコーディングを 2 つのシンボル (+180 度および -180 度) によるデジタル位相変調として考慮することです。変調周波数で受信信号を基準の同相 (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 convolver:受信信号をサンプリングし、同相 (I) 波形と直角位相 (Q) 波形の畳み込みを計算します。各波形の計算は、状態カウンターから受信したサンプルとデコードされた波形に対する XOR 演算の合計として実装されます。

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

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

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

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

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

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

Decoder:視覚的に確認できるように、デコーダによって生成された I/Q マッピングのプロットを表示します。

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

例の実行

MATLABサーバーの起動

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

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) の起動時に指定されたソケット ポートと一致する必要があります。

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

5.vsim を呼び出して、 HDL Verifierで使用する ModelSim を開始します。

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

このコマンドは、いくつかの汎用起動コマンドを実行する Tcl コマンド スクリプトを使用して ModelSim を起動し、その後、「tclstart」プロパティで指定されたユーザー定義コマンドを実行します。「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 の強制コマンドを適用してエンティティの clk、enable、reset 信号を駆動し、oport データとしてテスト ベンチに渡されます。最初の強制コマンドは、時刻が 0 のときに clk を 1 に設定し、5 ナノ秒後に 0 に設定し、10 ナノ秒ごとに高から低へのサイクルを繰り返すことを指定します。2 番目と 3 番目の強制コマンドは、イネーブル信号とリセット信号を 1 に設定します。

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

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

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

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

5.vsim を呼び出して、 HDL Verifierで使用する ModelSim を開始します。

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

このコマンドは、いくつかの汎用起動コマンドを実行する Tcl コマンド スクリプトを使用して ModelSim を起動し、その後、「tclstart」プロパティで指定されたユーザー定義コマンドを実行します。「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) をテストします。このスクリプトは、ランダムに生成されたデータ サンプルのストリームに対して checks 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 強制コマンドを適用してエンティティの clk 信号を駆動し、oport データとしてテストベンチに渡されます。Force コマンドは、時刻が 0 に等しいときに clk が 1 に設定され、5 ナノ秒後に 0 に設定され、10 ナノ秒ごとに High から Low へのサイクルを繰り返すことを指定します。

  • 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.');

hdlデーモンを終了します

hdldaemon('KILL');

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