コードのダウンロード
ジョイスティックPmodコントローラ(トップレベルファイル):pmod_joystick.vhd(10.1 KB)
SPIマスター(これもプロジェクトにインクルードする必要があります):spi_master.vhd(8.9 KB)
特長
- DigilentのPmod JSTK2への簡素化されたインターフェースのVHDLソースコード
- 最新のX軸、Y軸位置データをパラレルバスで継続的に出力
- トリガボタン、センターボタンの最新状態を常時出力
- ジョイスティックPmodからデータを取得するためのSPI通信を行う
- システムクロックレートが設定可能
はじめに
ここでは、図1に示すDigilentのジョイスティックJSTK2 Pmodとのインターフェースを処理するVHDLコンポーネントの詳細を説明します。図2は、このジョイスティックPmodコントローラをシステムに組み込んだ典型的な例を示しています。図に示すように、ジョイスティックPmodコントローラはPmodのポートに接続し、トランザクションを実行してデータを収集します。データは継続的に更新され、2つの単純なパラレルバス(2軸に対応)と2つのシングルビット出力(ボタンに対応)に出力され、これらはユーザーロジックまたはFPGAの出力ポートに接続できます。
図 1. DigilentのジョイスティックJSTK2 Pmod
図 2. 実装例
動作原理
ジョイスティックPmodコントローラは、主にステートマシンとSPIマスターコンポーネントで構成されています。Pmodに7バイトのパケットを要求し、これを解析して位置データとボタンの状態を取得します。
ステートマシン
このデザインでは、図3に示すステートマシンを使用してその動作を実装しています。起動すると、コンポーネントは直ちに startステートに入ります。Pmodがパワーアップするのに十分な時間を確保するため、100msの間このステートを維持します。そして、initiate_transactionステートに進みます。ここでは、Pmodのチップセレクト信号をセットし、15us待って、byte_transactステートに進みます。このステートでは、SPIマスターコンポーネントを使用してジョイスティックと8ビットのSPI通信を行います。続くbyte_pauseステートは、送信されたバイト数を記録し、バイト間に10usの休止を行います。パケット内の全バイトが完了すると、output_resultsステートに移行します。結果は、 x_position、y_position、trigger_button、およびcenter_button出力ポートに出力され、デザインは1ms待ってからinitiate_transactionステートに戻り、次のデータセットの取得処理を開始します。図には示されていませんが、コンポーネントはリセットされると、いつでもstart状態に戻ります。
図 3. ステートダイアグラム
SPIマスター
byte_transactステートの間、ステートマシンはSPIマスターコンポーネントを制御し、Pmod上のマイクロコントローラと通信します。SPIマスターのドキュメントはここから入手できます。
このデザインでは、CPOL = ‘0’ およびCPHA = ‘0’モードでSPIマスターを実装します。これは、システムクロック周波数( clk_freqジェネリックパラメータで指定、下記参照)に基づいてclk_divパラメータを設定し、Pmodのリファレンスマニュアルで指定されている1MHzのバス速度でPmodと通信します。
このデザインでは、SPIマスターのスレーブセレクトは使用しません。Pmodには、チップセレクトと最初のバイトの間に15usの休止、バイトとバイトの間に10usの休止があるなど、多少異例なタイミング要件があります。このため、このデザインでは個別のチップセレクトを使用し、SPIマスターはデータパケット内の各バイトに対して個別のトランザクションを行います。
システムクロック周波数
ジェネリックパラメータclk_freq には、ジョイスティックPmodコントローラのclkポートに供給されるシステムクロックの周波数を設定する必要があります。
ポートの説明
表1にジョイスティックPmodコントローラのポートを示します。
表 1. ポートの説明
接続
このPmodには6ピンコネクタがあります。表2にこのコネクタのピン配置を示します。ジョイスティックPmodコントローラのポートは、このコネクタに配線されているFPGAピンにリスト通りに割り当てる必要があります。
表 2. ジョイスティックPmodのピン配置とジョイスティックPmodコントローラへの接続
リセット
ジョイスティックPmodコントローラコンポーネントが動作するには、reset_n入力ポートがロジックハイでなければなりません。このポートのロジックレベルがローになると、非同期にコンポーネントをリセットします。リセット中、コンポーネントはPmodとの現在のトランザクションを中止し、 x_position、y_position、trigger_button、およびcenter_buttonデータ出力をクリアします。リセットが解除されると、ジョイスティックPmodコントローラは動作を再開し、ジョイスティックデータの収集と出力を再開します。
まとめ
このジョイスティックPmodコントローラは、DigilentのPmod JSTK2にインターフェースするプログラマブルロジックコンポーネントです。Pmodとのすべての通信を処理し、更新された位置とボタンのデータを継続的に提供します。