I2Sトランシーバ(VHDL)

Logic Home

コードのダウンロード

Version 1.0:i2s_transceiver.vhd(7.5 KB)
初期リリース

特長

  • Inter-IC Sound(I2S)トランシーバコンポーネントのVHDLソースコード
  • I2Sバス仕様に準拠
  • サンプルレート設定可能
  • シリアルビットクロックレート設定可能
  • データ幅設定可能
  • マスターのみ
  • 完全なサンプルデザインが利用可能(追加情報セクションを参照)

はじめに

ここでは、VHDLで記述された、FPGAで使用するマスターI2Sトランシーバコンポーネントについて詳しく説明します。このコンポーネントは、I2Sインターフェースでオーディオデータを受信し、この受信データをサンプルレートでパラレルインターフェース上のユーザーロジックに提示します。また、ユーザーロジックからサンプルレートでパラレルデータを入力し、このデータをI2Sインターフェース経由で送信します。 図1は、システムに統合されたI2Sトランシーバの典型的な例を示しています。

図1. 実装例

背景

I2S(I2SまたはIISとも言う)とは、デジタルオーディオ用に標準化されたシリアル通信バスのことです。このバスは、シリアルクロック(SCK)、ワードセレクト(WS)、およびシリアルデータ(SD)の3ラインから構成されます。図2は、I2S通信リンクのデータフレームを示しています。

図2. I2Sデータフレーム

シリアルデータラインは、左チャンネルと右チャンネルの2つの時分割多重データチャンネルを送信します。データは、2の補数形式で最上位ビット(MSB)が最初に送信されます。ワードセレクトラインは、現在どのチャンネルが送信されているかを示します(ロー=左チャンネル、ハイ=右チャンネル)。そのチャンネルのデータワードのMSBは、ワードセレクトラインがトグルしてから1クロックサイクル後に送信され、その後に残りのデータ ワードが送信されます。データビットはクロックの立ち下がりエッジで送信され、クロックの立ち上がりエッジで読み出されます。

I2SトランスミッタまたはI2Sレシーバのいずれかがマスターとして動作します。マスターは、シリアルクロックとワードセレクト信号を供給します。

また、オーディオコーデックには通常、内部回路を動かすために「マスタークロック」(MCLK)が必要です。MCLK周波数は、256*Fs(Fsはサンプルレート)のようなサンプルレートの倍数が一般的です。要件は個々のオーディオコーデックに依存します。

動作理論

このI2Sトランシーバは、マスタークロックを入力し、カウンタを使用してそれからシリアルクロックとワードセレクト信号を生成します。シリアルクロック周波数はマスタークロックの整数分の1倍であり、ワードセレクト周波数(すなわちサンプルレート)はシリアルクロックの整数分の1倍です。

受信データは、シリアルクロックの立ち上がりエッジでsd_rxポートから内部受信シフトレジスタにクロック入力されます。シフトは、ワードセレクトがトグルしてから1シリアルクロックサイクル後に該当のチャンネルに対して有効になり、データワードの幅の間継続し、再び無効になります。トランシーバは、ワードセレクトがトグルするたびに、右チャンネルと左チャンネルの受信データを、それぞれr_data_rxポートとl_data_rxポートに出力します。

逆に、r_data_tx入力ポートとl_data_tx入力ポートに出力される右チャンネルデータと左チャンネルデータは、ワードセレクトのトグルごとに内部送信シフトレジスタにパラレルロードされます。このデータはシリアルクロックの立ち下がりエッジでsd_txポートからクロック出力されます。シフトは、ワードセレクトがトグルしてから1シリアルクロックサイクル後に該当チャンネルで有効になり、データワードの幅を超えて1シリアルクロックの間継続し、その後再び無効になります。追加送信ビットは、I2Sバスの仕様に従い、受信側I2Sデバイスとデータ幅の不一致があった場合にsd_txデータ線を「0」に設定します。

I2Sトランシーバの設定

I2Sトランシーバは、ENTITYのジェネリックパラメータを設定することで構成されます。

sclk_ws_ratio

ワードセレクト(ws)信号の周波数はサンプルレートです。sclk_ws_ratioパラメータは、ワードセレクト期間あたりのシリアルクロック(sclk)サイクル数を定義します。
equation1

mclk_sclk_ratio

mclk_sclk_ratioパラメータは、シリアルクロック(sclk)1サイクルあたりのマスタークロック(mclk)のサイクル数を定義します。
equation2

d_width

d_widthパラメータは、各データワードのサイズをビット単位で定義します。

これは、ワードセレクト半周期中のシリアルクロックサイクル数(つまり、チャンネルデータ送信中のシリアルクロック数)と等しい必要はありません。ワードセレクトの半周期中に余分なクロックサイクルがある場合、余分なシリアルクロックサイクル中のシリアルデータ受信ポート(sd_rx)のデータは無視され、シリアルデータ送信ポート(sd_tx)はこれらの余分なビットに対して「0」を出力します。

マスタークロックの供給

I2Sトランシーバが動作するには、マスタークロックmclk入力が必要です。このクロックは、I2Sトランシーバが通信するI2Sスレーブデバイスに送信されるマスタークロック信号と同 じクロックを想定しています。

通常、必要なサンプルレート(Fs)は既知であり、I2Sデバイスにはこのサンプルレートの倍数のマスタークロックが必要です。たとえば、必要なサンプルレートが一般的に使用される44.1kHzで、I2Sデバイスが256*Fsのマスタークロックを受け入れるとします。これは、ユーザーがI2SデバイスとI2Sトランシーバの両方に11.29MHzのmclkを提供する必要があることを意味します。

mclk信号は、PLLを使ってFPGA内部で生成されます。

ポートの説明

表1にI2Sトランシーバのポートについて説明します。

表1. ポートの説明

ストリーミングオーディオデータトランザクション

I2Sトランシーバは、受信デー タ をl_data_rxポー トとr_data_rxポー トでユーザー ロ ジ ッ クに提供し ます。こ れ らの受信データ ポー トは、いずれもwsの遷移ごとに更新さ れます。新しい左チャンネルデータはws=「0」の間だけ受信されるので、l_data_rxポートはwsの立ち上がりエッジと同時に、つまり左チャンネルデータワードが終了するときに新しい値を取得します。同様に、新しい右チャンネルデータは、ws = 「1」の間だけ受信されるので、r_data_rx ポートは、wsの立ち下がりエッジと同時に、つまり右チャンネルデータワードが終了するときに新しい値を取得します。ユーザーロジックはws信号を使用して新しいデータが利用可能であることを示し、それによってサンプルレートでこのデータを取得することができます。図3はこの動作を示しています。

同様に、I2Sトランシーバは、各wsの遷移で l_data_txおよびr_data_txポートに新しい送信データをラッチします。ユーザーロジックはws信号を使用して、送信データがいつラッチされるかを示すことができるため、これらのポートに次の送信データセットを自由に提示できます。wsの立ち下がりエッジでラッチされたl_data_tx値は、左チャンネルのデータワード送信中にsd_txで送信されます。同様に、wsの立ち上がりエッジでラッチされたr_data_tx値は、右チャンネルのデータワード送信中にsd_txで送信されます。 図3は、この動作を示しています。

図3. タイミング図

リセット

I2Sトランシーバが動作するには、reset_n入力ポートがロジックハイである必要があります。このポートのロー信号は、非同期でコンポーネントをリセットします。リセット中、このコンポーネントはsclkws、およびsd_txポートをローに保持します。そうすると現在進行中の送信はすべて中止されます。現在進行中の受信は放棄され、l_data_rxr_data_rx出力ポートはクリアされます。またすべての内部データバッファがクリアされます。リセットが解除されると、I2Sトランシーバは動作を再開します。

まとめ

このI2Sトランシーバは、標準I2Sバス上でオーディオデータを送受信する設定可能なプログラマブルロジックコンポーネントです。マスターとして動作し、インターフェースにシリアルクロックとワードセレクト信号を供給します。それにより、ユーザーは特定のサンプリング周波数、データ幅、マスタークロック、およびワードあたりのシリアルクロックサイクル数を設定することができます。

補足情報

I2S Bus Specification, Philips Semiconductors(59.8 KB)

I2S Pmod Quick Start (VHDL) - このデザインでは、このページで説明するI2Sトランシーバコンポーネントを使用して、FPGAとCirrus LogicのCS5343マルチビットオーディオADCおよびCS4344ステレオDACをインターフェースします。



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