PSoC5LP Prototyping Kit (27) --- SPDIF_Tx と DMA (15)

spdif_4x / spdif_dma プロジェクトは「4 倍オーバーサンプリングのテスト」とは言いながら、192 kHz サンプリングの S/PDIF 信号を受信できる機器を所有していないので、48 kHz サンプリングでの実験にとどまっていました。
今回 spdif_dma プロジェクトに I2S コンポーネントひとつと DMA コンポーネントを 2 つ追加し、シリアル・オーディオ DAC に 4fs レートで出力し、変換されたアナログ信号を 4fs サンプリングのオーディオ入力インターフェースで PC にキャプチャし、処理がうまく行っていることを確かめました。
PSoC Creator でのトップ・レベルの回路図を下に示します。

インスタンス名 DMA3 と DMA4 の DMA コンポーネントインスタンス名 I2S0 の I2S コンポーネントが今回追加した部分です。
I2S (Inter-IC Sound) フォーマットでの WS (Word Select) 信号を、いわゆる「標準フォーマット」の LRCK (L/R ClocK) に変換するランダム・ロジックも追加してあります。
ブロック・ダイアグラムを下に示します。

I2S コンポーネントでは、シリアル・オーディオ・データ・フォーマットの性質上、L/R のデータがインターリーブされて出力されますから、SPDIF_Tx コンポーネントと同様の DMA によるデータ・アクセス方法になります。
DMA_buf2 配列を共用し、SPDIF_Tx と I2S とに、それぞれ DMA でバイト単位でデータを流し込みむことができます。
ただし、SPDIF_Tx では LSB ファースト、I2S では MSB ファーストの順番になるので、そのままでは両立しません。
そこで、単に「エンディアン」変換のためだけに新たな DMA バッファ「DMA_buf3」を設けて I2S 側専用として使います。
インスタンス DMA3 で、DMA_buf2[‍] から DMA_buf3
へ 2 バイト単位でデータ・コピーを行いますが、その際に DMA コンポーネントの機能を利用して「バイト・スワップ」を行います。
DMA3 のトリガは DFB コンポーネントの dma_req_a 信号を反転したものの立ち上がりエッジで行います。 反転しているのは、エッジ・トリガの指定が立ち上がりエッジしかなく、立ち下りエッジの指定がないためです。
dma_req_a 信号は DFB の計算が完了して出力データが用意できた時点で「H」レベルとなり、DMA により出力ホールディング・レジスタから出力データが読み出された時点で「L」レベルに戻ります。
したがって、dma_req_a 信号の「H」→「L」のエッジを検出すれば、DFB 出力データが DMA で読み込まれたことが分かります。
肝心の DMA バッファへの書き込み終了タイミングは外部からは分かりませんが、「H」→「L」エッジが生じるのは、最も早いタイミングでも DFB から DMA_buf2 への DMA 転送サイクルの途中なので、そこから新たな DMA を起動すれば、現在実行中の DMA 転送サイクルが終了してから新たな DMA 転送サイクルが実行されることは保証されます。
このようにして、DMA_buf2[‌] への書き込みが生じると、直ちに DMA3 による DMA 転送が起動され、DMA_buf3
にバイト・スワップされたデータがコピーされます。
普段使用しているのとは別の PC による、4fs (192 kHz) サンプリングのオーディオ入力を使用した WaveSpectra での観測結果を下に示します。

「標準フォーマット」のノン・オーバーサンプリング DAC として、aitendo で 50 円で販売されている PT8211 を使いました。 毎度おなじみの BU9480 は、線形補間機能が邪魔なので使用しませんでした。
アナログ接続なので、SPDIF によるディジタル接続と比べて劣化はありますが、一応 4fs で機能していることが分かります。
PSoC Creator の STA (Static Timing Analysis) が出すタイミング・バイオレーションの警告は無視して、BUS_CLK = CPU_CLK = DFB の動作クロックを 6.144 MHz の 12 倍の 73.728 MHz まで上げています。
TP1 (テストポイント 1) のピンには DFB 入力 DMA のトリガ信号を、TP2 (テストポイント 2) のピンには DFB 出力レディー信号を出力しているので、両者の間隔を測定すれば、DFB でのフィルタ計算の処理時間が分かります。
実測してみると約 1.3 μs で、4 倍オーバーサンプリングには十分余裕があります。