DAC AD7303 Pmodコントローラ(VHDL)

Logic Home

コードのダウンロード

DAC AD7303 Pmodコントローラ(トップレベルファイル):
pmod_dac_ad7303.vhd(8.5 KB)

デュアルMOSI付きSPIマスター(プロジェクトにインクルードする必要があります):
spi_master_dual_mosi.vhd(9.7 KB)

特長

  • DigilentのPmod DA1(Analog DevicesのDAコンバータAD7303用Pmod)との簡素化されたインターフェースのVHDLソースコード
  • シンプルなパラレルインターフェースで、2つPmodのデュアル8ビットDACを同時に制御
  • DAC Pmodとのすべてのシリアル通信を処理
  • システムクロックレートを設定可能

はじめに

本稿は、図1に示すDigilentのPmod DA1(AD7303搭載)とのインターフェースを処理するVHDLコンポーネントの詳細を説明するものです。図2は、このDAC AD7303 Pmodコントローラをシステムに組み込んだ典型的な例を示しています。このようにDAC Pmodコントローラは、Pmodのポートに接続し、DAC出力を設定するトランザクションを実行します。データはユーザーロジックやFPGAの入力ポートに接続可能なシンプルなパラレルインターフェース上に提示されます。

pmod_ad1

図1. AD7303用DigilentのPmod DA1

図2. 実装例

背景

Pmod DA1は、Analog DevicesのAD7303デュアル電圧出力8ビットD/Aコンバータを2個搭載しているため、合計4個のDAC出力チャンネルを提供します。このコンバータは、DACの内部基準電源を使用するように設計され、レールツーレールの出力振幅を可能にするオンチップアンプを備えています。これらは、最大30MHzで動作可能なシリアルインターフェースで制御されます。Pmod DA1は、両方のDACに同時に書き込むように構成されています。

制御ビット

AD7303の2チャンネルは、制御バイトとデータバイトを送ることによって制御されます。Pmod DA1は常に内部基準電源を使用するので、ここでは制御バイトの下位 6 ビットのみを示します。表1に制御ビットとその機能を示します。表2は、ロード機能の真理値表です。表3は、パワーダウン機能の実装方法です。

表1. 制御ビット

表2. ロード機能真理値表

表3. パワーダウン真理値表

power_down_truth_table

動作理論

DAC Pmodコントローラは、簡単なステートマシンとeewikiで入手できるSPIマスターコンポーネントの改良版を使用して、DAC Pmodを制御します。

ステートマシン

このデザインでは、図3に示すようなステートマシンを使用してその動作を実現しています。起動すると、コンポーネントは直ちにスタート(start)状態になります。この状態を100us維持し、Pmodが起動するのに十分な時間を確保します。その後、ポーズ(pause)状態に移行します。ここでは、DACとのトランザクション間に少なくとも33nsが経過するようにします。この時点で、DAC PmodコントローラがDAC Pmodとの新しいトランザクションの準備ができていることを示すために、ビジー(busy)信号をデアサートし、レディ(ready)状態に進みます。dac_tx_enaイネーブル信号がアサートされるまでready状態で待機し、新しいトランザクションのために両方のDACの制御ビットとデータをラッチしてsend_data状態へ進みます。この状態で、Pmodとのトランザクションを実行し、同時に両DACとの通信を行い、その後、pause状態に戻ります。また、図示はしていませんが、コンポーネントをリセットすると、いつでもコンポーネントはstart状態に戻ります。

図3. 状態遷移図

SPIマスター

send_data状態の間、ステートマシンはSPIマスターコンポーネントを制御し、Pmod上のDACと通信します。このデザインで使用されているSPIマスターは、一般的なSPIマスタードキュメントの改良版で、こちらで入手できます。この改良版は、オリジナルのMOSIロジックを複製して、2つの独立したMOSI出力(mosi_0mosi_1)を提供します。出力されたMOSIデータは、2つのパラレル入力tx_data_0tx_data_1からそれぞれ取り出されます。このように、SPIマスターは、単一のSPIバスを使用して、2つの別個のスレーブデバイスと同時に独立したデータを通信することができます。

SPIマスターは、AD7303コンバータの要件を満たすために、CPOL = 0 と CPHA = 0 に設定されます。

クロックの設定

このDAC Pmodコントローラのクロックは、ENTITYで定義されたGENERICパラメータのclk_freqspi_clk_divに値を割り当てることで設定されます。clk_freqパラメータには、clk入力ポートに供給されるシステムクロックの周波数をMHzで割り当てる必要があります。式1は、spi_clk_div値がどのように計算されるかを定義しています。

equation_1

ここで、fclkは供給されるシステムクロックの周波数(MHz)です。

例えば、このコードで指定されているデフォルト値は、spi_clk_div = 1です。これは、このコンポーネントが50MHzのシステムクロックを使用して開発およびテストされたため、このような値になりました。50/60 = 0.83、切り上げで1です。clk_freq ≤ 60 MHzの場合、デフォルトのspi_clk_div = 1となります。

式2は、その結果得られるシリアルクロック周波数fsclkを定義しています。

equation_2

この計算により、シリアルクロックはDACの最大シリアル通信クロック周波数である30MHz以下に保たれます。最速の通信は、入力クロック周波数(MHz)が60の整数倍のときに発生します。

トランザクション

DAC Pmodコントローラは、そのbusy出力で利用可能であることを示します。busy信号が「0」のとき、コントローラはDAC Pmodに送信するトランザクションを受け入れる準備ができています。dac_tx_ena入力をアサートすると、dac_1_ctrldac_1_datadac_2_ctrl、および dac_2_dataに現在の値がラッチされます。ラッチされると、コントローラはトランザクションが進行中であることを示すためにbusy信号をアサートするので、この時点では利用できません。トランザクションが完了すると、再びbusy信号をデアサートして、次のリクエストを受け付ける準備ができたことを示します。

トランザクション例

図4に、トランザクションの一例を示します。busy信号は「0」です。その後、ユーザーロジックは、制御ビット「100000」とデータ「10011001」を提示してDAC 1に書き込みます。また、制御ビット「100000」とデータ「10110011」を提示してDAC 2に書き込みます。コントローラはbusy信号をアサートし、リクエストがラッチされたことを示し、その時点でユーザーロジックはdac_tx_ena信号をデアサートすることができます。コントローラはDAC Pmodへのシリアル通信を実行し、完了するとbusyをデアサートします。その後、ユーザーロジックは、新しいトランザクションを開始し、制御ビット「100100」とデータ「10010001」をDAC 1に、制御ビット「100100」とデータ「00111110」をDAC 2に書き込みます。

dac_tx_ena信号がデアサートされない場合、新しいトランザクション要求はラッチされ、コントローラが利用可能になった33ns後に開始されます。

図4. トランザクション例

ポートの説明

表4にDAC Pmodコントローラのポートを示します。

表4. ポートの説明

接続

このPmod には、J1という6 ピンのコネクタがあります。表5に、このコネクタのピン配置を示します。DAC Pmodコントローラのポートは、このコネクタに配線されているFPGAピンにリスト通りに割り当てる必要があります。

表5. DAC PmodのピンアウトとDAC Pmodコントローラへの接続について

リセット

DAC Pmodコントローラコンポーネントが動作するためには、reset_n入力ポートがロジックハイである必要があります。このポートをローレベルにすると、コンポーネントが非同期でリセットされます。リセット中、コンポーネントはDAC Pmodとの現在のトランザクションを中止し、利用できないことを示すためにbusy出力をハイに設定します。リセットが解除されると、DAC Pmodコントローラは動作を再開します。

まとめ

このDAC Pmodコントローラは、DigilentのAD7303コンバータ内蔵Pmod DA1とのインターフェースとなるプログラマブルロジックコンポーネントです。シンプルなパラレルインターフェースで入力されたユーザー情報をもとに、Pmodの2つのコンバータを同時に制御します。

関連トピック

SPIマスター(VHDL)

コンタクト先

ご意見、ご感想およびご質問は、eewiki@digikey.comまでお寄せください。




オリジナル・ソース(English)