SPIマスター(VHDL)

Logic Home

コードのダウンロード

バージョン1.2:spi_master.vhd (8.9 KB)
バスがアイドル状態のとき、SCLKは直ちにCPOL入力の値に対応します。

バージョン1.1:spi_master_v1_1.vhd (8.8 KB)
ModelSimシミュレーションエラーを修正(明示的にclk_toggles信号をリセット)

バージョン1.0:spi_master_v1_0.vhd (17.0 KB)
初版パブリックリリース

特長

  • SPI(Serial Peripheral Interface)マスターコンポーネントのVHDLソースコード
  • スレーブ数を設定可能
  • データ幅を設定可能
  • 極性と位相を選択可能
  • 速度を選択可能
  • 長いデータストリームに対応する連続モード

はじめに

ここでは、CPLDやFPGAで使用されるVHDLで記述されたSPIマスターコンポーネントについて詳しく説明します。このコンポーネントはQuartus II、バージョン9.0を使用して設計されました。リソース要件はインプリメンテーション(すなわち、必要なスレーブ数とデータ幅)によって異なります。図1は、SPIマスターをシステムに組み込んだ典型的な例を示しています。

図1. アプリケーション例

背景

SPI通信方式は、4本のワイヤを使用する全二重データリンクです。マスターはスレーブセレクト(SS)ワイヤをローにすることにより、トランザクションを開始します。シリアルクロック(SCLK)ラインは、マスターによって駆動され、同期クロック源となります。マスターは、マスターアウトスレーブイン(MOSI)ラインを介してデータを送信し、マスターインスレーブアウト(MISO)ラインを介してデータを受信します。

マスターは、さまざまな手法で複数のスレーブと通信することができます。最も一般的な構成は、各スレーブが独立したSSラインを持ち、SCLK、MISOおよびMOSIラインを他のスレーブと共有するものです。各スレーブは、自分のSSラインがローにプルダウンされていないときは、共有ラインを無視します。このトポロジを上の図1に示します。

SPIには、クロック極性(CPOL)とクロック位相(CPHA)の2つのパラメータに基づく4つの動作モードがあります。マスターとスレーブは、同じモードを使用しなければ、正常な通信はできません。CPOLが0の場合、SCLKは通常ローとなり、最初のクロックエッジは立ち上がりエッジとなります。CPOLが1の場合、SCLKは通常ハイであり、最初のクロックエッジは立ち下がりエッジとなります。CPHAはデータアライメントを定義します。CPHAが0の場合、最初のデータビットはSSの立ち下がりエッジで書き込まれ、SCLKの最初のエッジで読み出され ます。CPHAが1の場合、データは最初のSCLKエッジで書き込まれ、2番目のCLKエッジで読み込まれます。図2のタイミング図は、4つのSPIモードを表しています。

図 2. SPIタイミング図

ポートの説明

表1にSPIマスターのポートを示します。スレーブ数はENTITYのGENERICパラメータslavesで宣言し、送受信データバス幅はGENERICパラメータのd_widthで宣言します。

表 1. ポートの説明

クロック

clockclk_div入力は、SCLKの周波数(すなわちSPIデータレート)を定義します。clockは、コンポーネント内部の同期ロジックを動作させるために使用されるシステムクロックです。clk_div整数入力により、現在のトランザクションが発生する相対速度を設定することができます。clk_divはSCLK のトランザクション間のクロック数で、式(1)で表されます。

equation_1_numbered

clk_divポートが1に設定されると、SCLKの周波数はclock周波数の半分となり、達成可能な最大データレートに設定されます。enableピンは、各トランザクションを開始するためにclk_divの値をコンポーネントにラッチするので、個々のスレーブに対してデータレートを調整することが可能です。

clk_divポートに一定値を設定すると、データレートが恒久的に設定されます。clk_divが0に設定された場合、コンポーネントは1の値と見なします。したがって、clk_divポートをローにすると、 コンポーネントは常に最高速度で動作するように設定されます。

極性と位相

enableピンは、各トランザクションの開始時に、cpolcphaの標準的なロジック値をラッチします。これにより、個々のスレーブと独立したSPIモードでの通信が可能になります。すべてのスレーブが同じモードを必要とする場合、cpolcphaを対応するロジックレベルに接続するだけでよいのです。

トランザクション

busy出力ポートのロジックレベルがローの場合は、そのコンポーネントがコマンドを受け付ける準備ができていることを示します。このコンポーネントは、enable入力がアサートされたclockの最初の立ち上がりエッジで、トランザクションの設定、アドレスおよびデータをラッチします。次のclockで、コンポーネントはbusy信号をアサートし、トランザクションの実行を開始します。完了すると、コンポーネントは、受信データをrx_dataポートに出力します。このデータは、コンポーネントが後続のトランザクションから新しいデータを受信するまで、ポートに残ります。コンポーネントがbusyをローに設定してデータが利用可能になったことをユーザーに通知すると、コンポーネントはもう次の命令の準備ができています。

図3に典型的なトランザクションのタイミング図を示します。このSPIマスターは、4つのスレーブと4ビットのデータ幅でインスタンス化されています。SPIモード3(CPOL=1、CPHA=1)で動作するスレーブ2へデータ「1001」を送信します。マスターは「1010」データを受信します。

図3. 典型的なトランザクションタイミング図

連続モード

最後の受信ビットの間に、SPIマスターはcontフラグを読み取ります。ローの場合、コンポーネントは、上述したように通信を完了します。ハイの場合、tx_dataポートのデータをラッチし、現在のデータを使い切ると新しいデータでシームレスに送信を継続します。現在のデータの最後のビットが終了すると(すなわち、新しいデータの最初のビットがmosiポートに表示されると)、コンポーネントは受信データの最初のブロックをrx_dataポートに出力し、この受信データが利用可能であることを示すために1clockサイクルの間busy信号をディアサートします。受信データは、新しいデータ通信が完了し、コンポーネントが連続した受信データブロックを提示するまで、rx_dataポートに残ります。

図4は、連続モードを使用したトランザクションのタイミング図を示しています。このSPIマスターは、4つのスレーブと2ビットのデータ幅でインスタンス化されています。コンポーネントが最初のデータ「10」をラッチすると、contポートはハイを維持し、tx_dataポートは新しいデータ「01」を提示します。新しいデータをラッチしたのち、busyポートをローにしますが、これは、contポートとtx_dataポートがクリアされ、rx_dataポートに最初の受信データ「01」が存在することを示す信号です。トランザクションが完了すると、busy信号が再びディアサートされ、新しいrx_data「10」が利用可能になります。

図4. 連続モードによるトランザクションのタイミング図

連続モードは永続的にインプリメントされることにより、非常に長いデータストリームを処理できます。contポートをローにすると、連続モードは無効になります。

リセット

SPIマスターコンポーネントが動作するためには、reset_n入力ポートが論理値ハイである必要があります。このポートにロー信号を入力すると、非同期でコンポーネントをリセットします。リセット中は、busyポートおよびすべてのss_n出力をハイに保持します。mosi出力がハイインピーダンスになり、rx_data出力ポートがクリアされます。リセットから解放されると、busyポートは次のクロックでディアサートし、SPIマスターが通信可能な状態にあることを示します。

まとめ

SPIマスターは、1つのパラレルインターフェースで様々なスレーブとの通信に対応する柔軟なプログラマブルロジックコンポーネントです。これによりユーザーが指定した数のスレーブとの通信が可能となり、スレーブはそれぞれ独立したSPIモード、データ幅およびシリアルクロック速度が要求されます。

関連トピック

SPIスレーブ(VHDL)

SPI 3-Wire Master (VHDL)

SPI to I2C Bridge (VHDL)

Accelerometer ADXL345 Pmod Controller (VHDL) – このデザインでは、このページで説明されているSPIマスターコンポーネントを使用して、Analog DevicesのADXL345加速度センサと通信します。また、このSPIマスタの連続モード機能の使用も実証しています。

Accelerometer ADXL362 Pmod Controller (VHDL) – このデザインでは、このページで説明されているSPIマスターコンポーネントを使用して、Analog DevicesのADXL362加速度センサと通信します。また、このSPIマスターの連続モード機能のデモもしています。

Ambient Light Sensor Pmod Controller (VHDL) – このデザインでは、このページで説明されているSPマスターコンポーネントを使用して、Texas InstrumentsのADC081S021 A/Dコンバータと通信してVishay Semiconductorの環境光センサTEMT6000X01からデータを収集します。

ADC AD7476A Pmod Controller (VHDL) – このデザインでは、2番目のMISOデータラインを含むように変更されたSPIマスターコンポーネントのバージョンを使用します。2つのデータ入力ラインにより、このデザインでは2つの別々のAnalog Devicesの12 ビットADC AD7476Aと同時に通信(データ受信)します。

DAC AD5541A Pmod Controller (VHDL) - このデザインでは、上記のSPIマスターを使用して、Analog Devicesのシングルチャネル、16ビットD/AコンバータAD5541Aと通信します。

DAC AD5628 Pmod Controller (VHDL) - このデザインでは、上記のSPIマスターを使用して、Analog Devicesの12ビットA/DコンバータAD5628と通信します。コンバータを設定し、コマンド、アドレスおよびデータを送信してコンバータの8チャネルを制御します。

DAC AD7303 Pmod Controller (VHDL) - このデザインでは、2番目のMOSIデータラインを含むように変更されたSPIマスターコンポーネントのバージョンを使用します。このデザインでは、2つの別々のAnalog Devicesのデュアルチャネル、8ビットDAC AD7303を同時に制御します。

DAC DAC121S101 Pmod Controller (VHDL) - このデザインでは、2番目のMOSIデータラインを含むように変更されたSPIマスターコンポーネントのバージョンを使用します。2つのデータ出力ラインを使用して、2つの別々のTexas Instrumentsの12ビットD/AコンバータDAC121S101に同時にデータを送信します。

Digital Potentiometer AD5160 Pmod Controller (VHDL) - このデザインでは、上記のSPIマスターを使用して、Analog DevicesのデジタルポテンショメータAD5160の抵抗を制御します。

Gyro L3G4200D Pmod Controller (VHDL) - このデザインでは、上記のSPIマスターを使用して、ST MicroelectronicsのジャイロスコープL3G4200Dを構成し、それから情報を取得します。また、このSPIマスターの連続モード機能の使用も実証しています。

NAV Pmod Controller (VHDL) - このナビゲーションデザインでは、上記のSPIマスターを使用して、ST Microelectronicsの圧力センサLPS25HBとiNEMO慣性モジュール(3軸加速度センサ、ジャイロ、磁力計) LSM9DS1からデータを取得し、合計10の自由度を提供します。

Thermocouple Pmod Controller (VHDL) - このデザインでは、上記のSPIマスターを使用して、Maximの熱電対デジタル変換器MAX31855から情報を取得します。




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