I2S controller on ZYBO

前回の記事ではUSDA基板をZYBOにつないでALSA経由で再生実験をしました。

ZYBOの中心となるZYNQというSoCチップは、「PS」 部と「PL」部とからなり、「PS」部にはSoCチップには必須?の汎用外部バス(USBやLAN)などがすでにハードマクロで作りこまれています。「PL」部は現状のFPGAと同様に、設計者が実現したい機能をロジック回路として自由に作りこむことができるようになっています。

ですから、ARM社のAXIバス(ZYNQもご他聞に漏れずARMのSoCです)に繋がる様にI2Sのインターフェース回路を設計すれば、ドライバーソフトも用意する必要はありますが、OSから制御することができるものを作り込めるのです。Linuxを使ってALSA経由で動かせればソフト開発の負荷は下がるでしょう・・・。

ところで、ご存知のアナログデバイス社は、自社の販売するオーディオコーデックなどのデバイスを接続してもらうことを期待して?、VHDLというハードウェア記述言語でコーディングされたI2Sコントローラーの設計データを公開しています。

これを、ZYNQの製造メーカーであるXilinxの開発ツールを使って「PL」部に組み込むことで、容易にI2SコントローラーとARM(CPU)をつなげることができます。

ただし、最初から設計データがあるとは言っても、やはりあらかじめ論理シミュレーションをして動作の様子等を調査しておかないと自信を持って大本につなぐことはできません。

そこで、再生部分のみではありますが、ソースコードを読み、実際にVHDLシミュレータにかけて動作を調べるといったリバースエンジニアリングをしました。その過程でレジスタマップも書き起こしてしまいます。アナログデバイス社から同時に公開されているデバイスドライバーのソースコードの読み込みも、レジスタマップを理解するための助けになります。

オリジナルの設計ではどうやら96kHzまでの対応に限定されますが、ALSA経由でこのモジュールを動かすことができました。次のステップとして、このI2Sコントローラーを192kHz対応に改造し、マスタークロック(今現在でも外には出ています)関係を、22.5792/24.576MHz系で発振器を切り替えて使用できるような構成に変更しようと考えています。

USDA基板の時と同様に、aplayを使っての再生まで確認できました(上記のブートメッセージは再生前です・・・)。

2個の発振器の載ったDAC基板、例によって人気のない?PCM1792Aあたりを搭載し、DSD再生も可能なようにしようかなと思案中です。

I2Sコントローラ、デバイスドライバともに改変が必要になりますが、やろうと思えばできてしまうのが、このZYNQのようなデバイスの面白いところです。

以下、5/26追記:

ZYBOのシステムのデフォルト・コンフィグレーションではオーディオ系のシステムクロックが12.288MHzに設定されています。これは元々が50MHzの水晶発振クロックから、何回かPLLででっち上げられたクロックで、実は周波数も正確な12.288MHzではなく、ある程度偏差のあるクロックです。こういったSoCがらみの基板でオーディオクロックを得るためにはありがちな仕組みではありますが・・・。

少し脱線しましたが、このオーディオ用の大元のクロックを24.576MHzに設定すれば、I2Sコントーラのロジック回路も、そしてデバイスドライバーも変更することなく192kHzまで対応できるような気がしています。デバイスドライバのソースを読んでいたらそのような気がしてきました。

追って確かめてみようと思います。