I2S/PCM ボードレベルの制約と同期 (レイテンシ、スキュー、ビットシンク)

I2S/PCM は典型的な低速シリアル ポートであり、双方向の信号が 2 セットあり、soc の観点から soc-adif とペリフェラル オーディオ コーデックに分けられます。

次に、adif を入力します。

sclk_i、ws_i、sdi

もちろん、3 つの入力信号は同時には有効ではありません。adif RX スレーブがアクティブな場合にのみ、3 つの入力信号すべてが有効になります。

adif 出力:

sclk_o、ws_o、sdo

adif TXマスター使用時のみ3出力が有効となります。

以下に 2 つの問題について説明します

1. TX マスターと RX スレーブの場合、adif とコーデックがビット同期を完了する方法を説明します。

2. TX スレーブと RX マスターの場合、RX による ws/fs sclk 出力が TX エンドに確実に到達して sdo を生成し、RX エンドで ws/fs sclk を使用して正しくサンプリングする方法を説明します。

実際、最初の質問は時報間のスキューに対応し、2 番目の質問は時報送信の遅延に対応します。

まず、いくつかのパラメータの大きさを与えます。

adif とコーデックのレジスタのセットアップ時間とホールド時間は両方とも数 ns です

adif とコーデックの動作クロックは sclk の動作クロックの 10 ~ 100 倍です。

Sclk (bitclk サンプリング クロック) の最大値は 10 MHz 以上であるため、sclk の周期は 100ns 程度です [すべてのオーディオ サンプリング レートとサンプリング深度については、別の記事 TODO を参照してください]

1. I2S/PCM 同期

        I2S/PCM には独自のフレーム同期信号があり、I2S の場合は ws の立ち下がりエッジがフレームの開始となり、PCM の場合は fs の立ち上がりエッジがフレームの開始となります。

        では、ビット同期を確実にするにはどうすればよいでしょうか? 高速シリアル インターフェイスの複雑なビット同期回路とは異なり、I2S/PCM のビット同期は非常に単純で、主に次のメカニズムによって完了します。

  1. 信号グループにスキュー制約を設定すると、スキューは 5ns 未満に制約されます [1ns と 3ns の制約を確認しました。このスキューしきい値はプロセスに関連しており、IO 電圧] 制約には soc 端子とコーデック端子が含まれます。-----写真1を参照
  2. 高周波 adifclk を使用して信号をサンプリングし、adifclk で信号をビートします --- 位相を調整します
  3. sclk の立ち上がりエッジで信号が変化し、立ち下がりエッジでデータがサンプリングされるため、十分なサンプリング ウィンドウが確保されます ---- 図 4 を参照

        T(sclk)、T(fs)、T(sdo) をそれぞれ、TX マスターの adif TX からチップ IO までの遅延時間、または Rx スレーブのチップ IO から adif RX までの遅延時間とします。

このうち、sclk+制御信号+データを出力する必要がある I2S インターフェイスの場合、通常、次のような遅延要件があります。

T(sclk) <= T(fs) <= T(sdo)------この制約の前提条件は、セットアップ、ホールド、および Tco が sclk サイクルよりもはるかに小さいことです。

もちろん、sclk の立ち上がりエッジを使用して信号を変更し、立ち下がりエッジのサンプリング信号の処理を行う場合は、上記の制約を設定する必要はありません。

adif TX からチップ IO までのデータのセクションのタイミングを分析してみましょう。

: 下図のソース信号では、fs と sdo の両方が立ち上がりエッジで変化し、立ち上がりエッジでの遅延は非常に小さく、この遅延はレジスタの内部遅延 Tco であり、実際の遅延と一致します。状況。

                                                                         図1

        上の図から、T(sclk)、T(fs)、および T(sdi) がまったく異なることがわかります。ソースでの 3 つの信号間の関係は、sclk の立ち上がりエッジを使用して fs および sdo データをサンプリングすることです。このうち、sdo の最初のデータは '1' です。 fs と fs の間にはビート間隔があります。一方、IO で sclk を使用して fs と sdo をサンプリングすると、fs と sdo の最初のデータが 2 ビート離れていることがわかります。 , 明らかな誤差があるため、送信中の信号のスキューを抑えるように努めます。理想的には 3 つの信号のスキューが 0 であり、受信側で正しくサンプリングされる必要があります。

                                                                 図2

        図 2 は、立ち上がりエッジ変換と立ち上がりエッジ サンプリングの場合の T(fs)< T(sclk) < T(sdo) の状況を示していますが、この 3 つの間のスキューは大きくありません (T(sclk) が続く限り)。 T(fs ) +Tco]、 fs と sdo の最初のデータは 2 sclks 異なります。

        T(sclk) <= T(fs) <= T(sdo) を満たさない他の状況でも、タイミング エラーが発生しやすくなります。根本的な原因は、Tco が小さすぎることと、T(fs) と T ( sdo) は小さくなりますが、事前にサンプリングされます。

                                                                        画像3

図 3 は、T(sclk) <= T(fs) <= T(sdo) の場合のタイミング図を示しており、各信号が正しいエッジでサンプリングされていることは明らかです。

                                                            図4

図 4 は、立ち上がりエッジでソース端子の信号を変化させ、チップ​​の IO で立ち下がりエッジでサンプリングするタイミング図を示しています。T(fs) > T(sdo) ですが、データは引き続き正しくサンプリングできます。 。また、立ち下がりエッジと比較して、サンプリング ウィンドウの左側と右側がはるかに大きいことがわかります。

2. I2S/PCMのボード間レイテンシ

        TX スレーブと Rx マスターの動作モードでは、TX は Rx によって出力された ws/fs および sclk 信号を受信し、それらを同期します。この同期プロセスには TX に 2 回の adifclk 時間が必要で、エッジ検出はリア エッジのみを変更します (つまり、パルス幅のフリップ A 信号は 1 adifclk 後、ws/fs と sclk を使用してバックエッジで sdo を出力し、sdo はボード間遅延 T(sdo) 後に RX に到達します。このとき、ws を使用しますRX Sclk の /fs および ws/fs は、sdo を正しくサンプリングするために使用されます。これには、3adifclk+T(sdo) が 1 sclk サイクルを超えないようにする必要があります。これは、タイミング図を描くことで解析することもできますが、ここでは繰り返しません。

実際のプロジェクトでは、sclk は 100ns 程度、adifclk は 10ns ~ 0.xns 程度、T(sdo) も数十 ns ~ 0.xns        の範囲にあるため、実現は容易であり、一部のプロジェクトでは、レイテンシの制約が設定されていません。

        RX マスター側の sdo と ws/fs の間の距離が 1 sclk を超えるには遠すぎる場合、音声受信に影響を与えないように設計する手段はありますか?

        このとき、RX は sdata のビット数が左右のチャネルで一致していない、フレーム全体のビット数が設定値と異なるなどのエラーを検出します。このとき、エラーが報告され、ソフトウェアがエラーを検出しなくなるまで、n sclks 遅延するように Rx 側の ws/fs が制御されます。

 

おすすめ

転載: blog.csdn.net/cy413026/article/details/132349290