SPIスレーブ(VHDL)

Logic Home

コードのダウンロード

バージョン1.2:spi_slave.vhd (8.1 KB)
より多くのツールで合成できるようにアーキテクチャを若干変更

バージョン1.1:spi_slave_v1_1.vhd (8.0 KB)
非同期アクティブローリセットの追加

バージョン1.0:spi_slave_v1_0.vhd (7.5 KB)
初版リリース

特長

  • ユーザー定義可能なSPIモード
  • ユーザー定義可能なデータ幅
  • 送信レディ、受信レディ、および受信オーバーランエラービット付きステータスレジスタ
  • SPIトランザクションおよび/または個々のピン割り込みを介してマスターが利用可能なステータスレジスタビット
  • ユーザーロジックで使用可能なステータスレジスタビット

はじめに

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

block_diagram

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

背景

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

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

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

図 2. SPIタイミング図

ポートの説明

表1に、SPIスレーブのポートを示します。スレーブが動作するモードは、GENERICパラメータのcpolおよびcphaで定義されます。送信および受信データバス幅は、d_widthで宣言します。

表1. ポートの説明

機能の説明

スレーブコンポーネントのSPIモードは、VHDLのENTITYでcpolcpha(GENERICパラメータ)でユーザーが設定します。

このSPIスレーブコンポーネントとSPIマスターとの間のトランザクションは、8ビットのコマンドとそれに続くNビットのデータ転送で構成されなければなりません。データ転送のサイズNは、VHDLのENTITY内のGENERIC d_widthパラメータで決定され、ユーザーが設定することになります。図3は、cpol = 0、cpha = 0、d_width = 8のトランザクションを表しています。

図 3. トランザクションの構成

8ビットコマンド

表2 は、マスターが MOSIで送信する8ビットコマンドを定義したものです。マスターはコマンドMSBを最初に送信しなければなりません。

表2. 8ビットコマンドのフォーマット

8_bit_command_format

SPIスレーブコンポーネントは、受信、送信およびステータスの3つのレジスタを含んでいます。wr_addrビットは、データ転送中にMOSIラインがどのスレーブレジスタに書き込むかを示し、rd_addrビットは、MISOラインがマスターに送り返すレジスタを識別します。表3に各レジスタのアドレスを示します。

表3. レジスタのアドレス

register_addresses

受信レジスタ

受信レジスタは、マスターからMOSIラインで受信したデータを保持するバッファです。ユーザーロジックが結果のデータにアクセスするには、コンポーネントがトランザクションを実行していない時(つまり、busy出力がローの時)にrx_reqにパルス信号を加える必要があります。その後、スレーブは受信レジスタの内容をrx_dataポートに出力します。

送信レジスタ

送信レジスタは、スレーブからマスターへMISOラインで送信されるデータを保持するバッファです。ユーザーロジックは、コンポーネントがトランザクションを実行していない(すなわち、busy出力がロー)時、tx_load_dataポートにデータを提示し、tx_load_enにパルス入力することにより、このレジスタに書き込みます。

ステータスレジスタ

SPIスレーブは、ステータスレジスタを使用せずに動作させることができます。このレジスタは、スレーブコンポーネントのステータスに関する情報をユーザーに提供しますが、コンポーネントを使用するために必要なものではありません。

ステータスレジスタには3つのステータスビットがあります。マスターは、このレジスタにアドレス指定されたトランザクションで、これらのビットの読み出し、設定およびクリアを行うことができます。ステータスレジスタの読み出し、または書き込みを行うトランザクション中、最初に送られる3つのデータビットはそれぞれtrdyrrdyおよびroeに対応します。スレーブコンポーネントは、トランザクション中に送受信される残りのビットを無視します。ユーザーロジックは、これらのビットに名前をつけたポートを介してアクセスします。ユーザーロジックは、コンポーネントが動作していない(すなわち、busy出力がローになっている)ときに、st_load_trdyst_load_rrdyおよびst_ load_roe入力に必要な値を入力してst_load_enにパルス入力をし、これらのビットを設定またはクリアできます。

trdy

trdy(transmit ready 送信準備完了)ビットは、最後のSPIトランザクションが実行された後にユーザーロジックが送信レジスタに新しいデータを書き込んだことを示しており、そのためマスターが現在のデータをまだ読み出していません。このコンポーネントは、次にマスターが送信レジスタを読み出すと、trdyビットをクリアします。

rrdy

rrdy(receive ready 受信準備完了)ビットは、ユーザーロジックが最後に受信レジスタを読み出した後に、マスターが新しいデータを受信レジスタに書き込んだことを示しており、そのためユーザーロジックが最新のデータをまだ受信していません。このコンポーネントは、ユーザーロジックがデータを要求すると、rrdyビットをクリアします。

roe

roe(receive overrun error 受信オーバーランエラー)ビットは、ユーザーロジックがデータを読み出す前に、マスターが最後に受信したデータを上書きしたことを示します。マスターは、SPIトランザクションでステータスレジスタに書き込むことにより、roeビットをクリアすることができます。また、ユーザーロジックは、上記のようにst_load入力でステータスレジスタに書き込むことにより、ビットをクリアすることができます。

割り込み

また、trdyrrdyおよびroeポートは、SPIトランザクションを必要とせず、SPIスレーブの状態変化によるSPIマスターデバイスやユーザーロジックへの割り込み手段を提供します。ユーザーはこれらのポートをSPIマスターまたはユーザーロジックのいずれか、もしくは両方に接続可能、またはどちらにも接続する必要はありません。

トランザクションの例

図4は、トランザクションの例を示しています(ModelSim Altera Starter Edition 10.0cでシミュレーション)。スレーブは、モード「00」で動作するように設定されています。スレーブがビジー状態でないとき、ユーザーロジックはtx_load_dataバスにデータ「10101010」を提示しながら、tx_load_enにパルスを入力します。trdy 信号が直ちにハイになり、送信すべき新しいデータが存在することを示します。次に、マスターは、「00000000」コマンドでトランザクションを開始し、スレーブに後続のMOSIデータを受信レジスタにロードし、送信レジスタの内容をMISOに出力するように指示します。最後のデータビットが送信されると、trdy信号がローになり、送信レジスタの現在の値がマスターに送信されたことを示します。同様に、スレーブが最後のデータビットを受信レジスタに読み込むと、rrdy信号がアサートされ、新しいデータを受信したことが示されます。その後、ユーザーロジックがrx_reqにパルス入力すると、スレーブは受信データ「10110001」をrx_dataバスに出力して応答します。その後、rrdy出力がディアサートされ、受信レジスタに含まれるデータがユーザーロジックによって既に読み取られたことを示します。

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

リセット

SPIスレーブコンポーネントが動作するためには、reset_n入力ポートが論理値ハイである必要があります。このポートにロー信号を入力すると、非同期でコンポーネントをリセットします。リセット中は、miso出力はハイインピーダンスになり、 rx_data出力ポートはクリアされます。送信、受信、送信レディ、受信レディおよび受信オーバーランエラーのすべてのレジスタはクリアされます。

まとめ

このVHDL SPIスレーブは、ユーザー定義可能なモードとデータ幅を提供します。また送信レディ、受信レディ、受信オーバーランエラーのステータス情報も含みます。

関連するトピック

SPIマスター(VHDL)

SPI 3-Wire Master (VHDL)

SPI to I2C Bridge (VHDL) - このデザインは、このページで説明されているSPIスレーブを使用して、SPI ~I2Cブリッジを実装しています。




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