AK4490基板

順番が違うというか、本来はコントローラたるZYNQのI2S/DSD回路の整備が先かとは思いますが、基板発注面付けの都合もあってAK4490基板のアートワークを先行させました。部品はすべて片面に置けました。

DAC周辺のケミコン配置は、リファレンスデザインのそれをトレース、もといコピーしました。

SCF方式のDACを使うのは、自分としてはTDA1547以来です。最近ではなんとなくアナログFIRフィルタ+電流出力方式に魅力を感じていたので、最新技術で武装した先祖返りのようなこのDACには興味がありました。

でも、半田付けは当分先になるかも・・・。

 

USB 2題

申し込んでおいたWindows10のUpgradeが可能になりましたので、早速Win8.1から上書きインストールしてみました。Win8、Win8.1は、革新的過ぎてUIが今までのWindowsと全く変わってしまい、戸惑うことばかりで全く使いませんでした。Windows10は少し保守的になっているようですので期待しています。

Win8.1には、USDA_MINI基板用のドライバーとFoobar2000関係、そしてVisualStudio2013位しか入れていなかったこともあってか、インストールはすんなりと終了しました。

「オーディオの入力および出力」という新しい項目ができてスピーカーとして認識されています。

ひとまずFoobar2000にてASIO NativeでDSDの再生ができることが確認できました。

さて、話がガラッと変わります以下の記事にて 、ZYBOに実装したMPD on LinuxでDSDのNative再生を行うと、再生の頭で大きなノイズが入ると書きました。記事にもありますように、データの冒頭に値が0×00のデータの塊が送信されてくるために、DSDでは一瞬フルスケールのDCが入ってきたような状態になるからです。

恐らく、この再生の頭のゼロは、ALSAより上位のレイヤーのオーディオドライバーが出していると考えられます。次の再生信号がPCMになるかDSDになるかは、ALSAのみが関知していて、それ以上の人たちは知らないので、再生の頭にはとにかくPCM用にゼロをつけてくるのだと推測しています。

LINUXのソースを読み解けば良いのはわかっていますが、自分的にはUSBのロジック回路で対応することにし、このたび解決させました。

DSD Native再生モードで、再生の頭から連続で送信されてくるゼロを0×96で置き換えてしまいます。一度でもゼロ以外のデータが送られた後のゼロについては当然0×96に置き換えません。

WindowsのASIOドライバーでは全く問題にならないのですが、LINUXのNative DSD再生のために回路変更を入れました。その他、ZYBOにおいてNative DSD再生の際に、44.1kHzからDSDへ切り替わる時のノイズについても、これを抑圧するための回路を追加しました(ZYBO以外でも同じかもしれません)。

これで安心して、UPnPネットワーク・オーディオ・プロセッサ基板と化したZYBOを、Kinskyから制御して快適にネットワーク・オーディオを楽しめるようになりました。

上記のノイズに関しては、接続するDACチップによっては、DACチップの機能でAUTOミュートするため、問題が顕在化しないという事はあるかもしれません。そもそも、lightMPDとUSDA_MIN基板を使ってNative DSD再生を楽しんでおられる方はほとんどいらっしゃらないのかもしれません。あるいはlightMPDではLINUXのソースに手を入れて解決済みなのかも・・・。

USDA_MINI, USDA, ならびにUSBDACに対応する上記問題の改善用ファーム(FPGA)等々を用意しましたので、この現象で困っている方がいらっしゃいましたらご連絡ください。有償になりますが、低廉で書換えサービスを提供させていただきます (現在のところ、lightMPDでNative DSD再生をしない場合には変更の必要はありません)。 ※USDA_MINI基板の7月下旬発送分からはすでに対応しております。なお、LINUXのすべての環境で改善をお約束できるものではございません。あらかじめご了承ください。動作確認したのはZYNQ(ARMv7)上のLINUX(ソースからビルドしています)です。

 

DLNA(UPnP)化しました

XilinxのZYNQを積んだZYBO上でしばらくの間MPDを走らせて運用していましたが、DSD11.2MHzなども特に音切れを感じることもなく安定して動作していました。イーサーネットがギガビット対応というのは案外ハイレゾプレーヤーにとってアドバンテージなのかもしれません。CPUがA9のDualというのは少し平凡ですが、データ転送が主な仕事であれば弱点にはならないようです。

既存のI2Sコントローラを改造してDSD対応にし、ZYNQに組み込んでUSB DDC(DAC)以外の出力選択肢も設けましたが、電源やDAC基板込みでセットに組み上げてしまうのであれば話は別ですが、当方の場合、ZYBOを剥き出しで使っている関係上、USBの方が取り回しが良くて融通が利くため、ほとんどUSBばかり使っていました。

結果、当方はZYNQのPL部 (ユーザーロジック用領域) は全く使わず(笑)、PS部 (最初からハードマクロとして組込み済み) のみを使って本格的にZYBOで遊んでいるユーザーということになります。笑っちゃいますね。

さて、MPDも標準的な使い方をする限り、ネットワークやLinuxの香りがプンプンして堪らないので(笑)、これをUPnP化いたしました。当方はネットワーク系やLinux系の技術者出身ではなく、AV (※オーディオ・ビジュアルです) 系の技術者出身ですのでsambaだNFSだ、マウントがどうだこうだ、という世界は息苦しいのです(笑)。

しばらくの間お世話になったMPadともこれでお別れです。ありがとうございました。
そしてこれからは、長所・短所をひっくるめて市販のネットワークプレーヤと同じ操作性を享受することになります。少し乱暴ではありますが、UPnP ≒ DLNA ≒ OpenHome などと言った各種規格 ? に則り、業界筋で言うところのネットワークプレーヤーと同じものになったということです。

問題がないわけではありませんが、IPアドレスもDHCPサーバーから設定してもらうようにしました。その結果、使う立場からすればIPアドレスの事を気にすることなく、LANケーブルを挿して電源を入れれば何も設定することなく使うことができるようになります(もっとも、接続するUSB DACに応じてNativeDSDとDoPのどちらを使うかの設定だけは必要です)。さすがにUPnPと言うからには当然そうするべきでしょう。

その代わり、SSHでログインするために、あらかじめシリアルコンソールで接続して、ZYBOが取得したIPアドレスの番号を調べておかなければならない、といったような笑えない事態も発生することになり、開発者が楽をするとユーザーが苦労し、開発者が苦労するとユーザーが楽になる、という絵に書いたような状態になります(笑

サーバーも、今までのように普通のファイルサーバーをNFSなどでマウントして使うというやり方ではなく、Twonky Mediaなどに代表される、いわゆるメディアサーバーに能動的に働いてもらう、という仕組みに変更になります。

現状では、KinskyとPlugPlayerで動作しております。他にも良いのがあれば試してみたいです。LUMINで使えないのがわかって結構残念です。

実はバックアップ用に長期保管してあったQNAPのTS-119があったので、これに3TBのHDを入れ、TS-119用の最新ファームウェアをダウンロードして構成したところ、嬉しいことにTwonky Media ServerはVer.7.2.7 になっており、これがありがたいことにDSD配信対応版なのでした。

DSDは11.2MHzまで再生できてしまいました。当然Flacも24/192kHzは全く問題なく動いており、おそらく384kHzも動作すると思われます。DSDがLinnのKinskyで再生できるというのは、ある意味で興味深いことです。

キャプチャはDSDではなく、24/96kHzのFlac配信版です。DSDといってもPENTATONEなどもほとんどがPCM録音のDSD変換のようですから、あえて高いほうのDSDは買いませんでした。ただ、DSDの方はSTEREOとMULTIのisoファイルを配信しているようです。余談ながら、当方はDSD5.6MHzの8ch再生が可能なUSB DDCを設計資産として持っていますが、 再生ソフト側の対応状況はどうなんでしょうか。

PlugPlayerだと特大のアルバムアートワークが楽しめます。確か、購入時にFlacファイルにアートワークがTagとして付いていなかったか、あるいは極小だったかしたため、AmazonからSACD用の大きなジャケ画像を拝借してきて埋め込んだような記憶があります。

こういう表示関係はコントローラとサーバー側の2者対応で、レンダラーたるMPDは関与しなくて済んでいるはずです。 基本的には、ユーザーが選択したトラックのURL情報やコマンドなどが記述されたxmlファイルがコントローラから送信されてくるので、MPDはそのxmlの内容を解釈してhttpのGetコマンドでサーバーからオーディオファイルを引っ張ってきて再生する、というトライアングルの関係がUPnPの大雑把な動作内容です。データベースをMPD自身で管理する、という概念もなくなります。(※ここでいうコントローラとは、Kinskyなどの再生ソフトのことを言っています)。

なお、I2S対応DAC基板を含めてシステムを頒布して欲しいという意見を一部頂いておりますが、現状のI2S/DSD回路はアナログデバイス社のIPを改造したものであり、コードの2/3は残っている関係で、これを公開して基板を頒布するのであれば、ライセンス上、最低でもアナログデバイス社のデバイスを積んだ基板でなければな‘りません。

同社にも申し分けないのですが、今更アナログデバイス社のオーディオDACを積んだ基板をつくろうという意欲は湧いて来ません。ある方から音質的に否定的な意見も伺ってはいますが、AKMの新製品などで基板化してみたいと考えています。そういうわけで、基板頒布は完全オリジナルのI2S/DSDコントローラを設計してから、ということになります。1個15万円のDuCULoNを2個積んだネットワークプレーヤー、なんていうのも面白そうですね・・。

USBだけの再生対応版であれば、microSDカードイメージの頒布もできない話ではないのですが・・・。ZYBOを持っていてHigh-endを志向している自作オーディオファンなんてそうはいらっしゃらないでしょうね。このためだけにわざわざZYBOを入手するというのもお勧めはできませんし・・・。

Special Thanks to Jean-Francois !

I2S/DSDコントーラ動作しました

ZYBOにつないだI2S/DSD接続のDAC基板にて、MPDでDSDが再生できるようになりました。

本来、アプリ(本件の場合、mpd) から SNDRV_PCM_FORMAT_DSD_U32_LE を指定してもらえばよいと思っていたのですが、MPDのNative DSD対応パッチ版では SNDRV_PCM_FORMAT_DSD_U32_BE しか今のところ対応されていません。

これだとエンディアンがひっくり返ってしまってサンプルの前後関係が逆になってしまいます。MPDのソースに、新規の dsd_native_type を「勝手に」追加してできないことはないのですが、それも将来の互換性を考えるとうまくないので、ZYNQに実装したI2S/DSDコントローラとそのデバイス・ドライバ側で対処することにしました。

アプリから SNDRV_PCM_FORMAT_DSD_U32_LE を指定された場合には転送されたデータをそのままシリアル化してDSD信号とし、SNDRV_PCM_FORMAT_DSD_U32_BE を指定された場合には、AXIバスから転送された4bytesデータのエンディアンをスワップしてDSDのシリアル信号に変換しています。

こうしておけば、USDA_MINI基板をつないでいた場合から、DSD転送モードは変更せずに出力先を hw:0,1 から hw:0,0 に変更するだけで、楽に (たいした事ない?) 移行 (行ったり来たり) できます。

細かい修正希望項目はいくつかありますが、これでひとまず動作確認終了です。

次はMPDのDLNA化でしょうか?

SPI通信追加

今までは、ZYBOにつなげるDAC基板を、設定の不要な “PCM1794A” 基板であると「デバイス・ツリー」に記述することで、実際には”PCM1792A”基板を接続しているにもかかわらず、ZYNQにSPIコントローラを実装しないで済ませていました。SPIとは、DAC ICなどのレジスタ等への通信用バスの一方式です。

DSD対応化にあたって、PCM1792Aの制御 (設定) が不可欠になりますので、今回、ZYNQにSPIコントローラを実装しました。実装しました、といっても、これはもともとZYNQのPS部に組み込まれた機能をハード的に有効にするだけで、回路設計が必要なわけではありません。とはいっても、FPGA設計ツールを立ち上げて回路の再構築をし、回路情報データを再度生成してLinuxの起動時に必要な”BOOT.bin” を作り直す、といったような作業は必要になります。その際にはFPGA設計ツールだけではなく、(Xilinxの) SDKも必要になります。

ZYNQにSPIコントローラを実装して、ZYBOのデバイスツリーからPCM1794Aを削除し、SPIコントローラ直下に新たにPCM1792Aを追加しました。組み込みLinuxはいわゆるPlug & Playではないので、その昔、MS-DOS PCのBIOS設定でメモリ領域を指定してアダプタ・カードを追加していたようなことを、テキスト (デバイス・ツリー) を書いて設定ファイルにし、Linuxブート用のバイナリ一式に含めるという形で、設計者は同様の作業をしなければなりません。

XilinxのWikiによると、ZYNQに組み込まれたSPIコントローラはケイデンス (ご同業の方でしたらご存知の会社ですね) のIPだということですので、Linuxカーネルのブート時に同社のデバイス・ドライバがロードされるようにデバイス・ツリーに記載しています。

再生ソフトが”Play”を開始するタイミングで毎回ZYBO(ZYNQ)からSPI通信で設定データが飛んできます。PCMだけなら不要な設定といえるもので、信号フォーマットがI2SかRJ(右詰)か、そしてそれらの場合にビット数が32(24)か16か、をチェックして切り替え設定をしているだけです。これらはダイナミックに変更する必要がないものといえますので、ソースのこのあたりを改造して、このPCM1792A用のLinuxドライバをDSD対応させてみるつもりです。

もっとも、その前に、今度こそ本当にARMのAXIバス対応DSDコントローラを設計しないといけません。

今のところ、ZYBO上でMPDが普通に動作しています。ちゃんと、PLLによらず発振器によるクロックで動作するようにしましたので、音質的にも、精神衛生上もGoodです。

PCMはできた

ZYBO基板向けのI2S-DAI-DAC基板が無事に動きました。

DAC基板側に2つの発振器を載せていて、再生するファイルのサンプリング周波数が44.1kHzの倍数か、48kHzの倍数かに応じて2つの発振器出力(22.5792MHz/24.576MHz)のイネーブル・ディセーブルを切り替えてZYBO側のI2Sコントローラ回路と、DACの双方に供給するというものです。

当面、PCM信号再生ならMPDからこの「出力先」へ信号を流して楽しむことができそうです。

次のステップは、ZYBOに搭載されたZYNQのAXIバスにぶら下がる形のDSDコントローラをインプリメントし、I2S-DAI-DAC基板にDSDファイルも出力できるようにすることです。

ところで、ZYBO上でこのZYNQプロセッサに繋がっている「カニ」さんは”realtek,RTL8211E”です。きちんと速度を検証していませんが、USDA_MINI基板をつないで、nfsマウントしたQNAPのTS119からDSD11.2MHzのファイルを30分連続で再生したところ、幸運にも音飛びが気になるようなことはありませんでした。ギガビットのおかげ?

先を越されました

先ずは実用的な状態でLinux のUSB Native 転送の動作確認をしようと思い、ZYBOにMPDを導入しました。https://github.com/lintweaker/mpd-dsd-018

ZYBOで同じような事をしていて、SDカードイメージを公開しているケースが見あたりませんでしたので、自分でソースファイルからクロスコンパイルしてZYNQ (ARM) 用 のMPDを作りました。FLACや各種AUDIOファイルアクセス用のライブラリも仕方なく全てソースからARM用にビルドしました。

まだシリアルコンソールから操作しないとIPアドレスの設定やSDカードのマウントなどができませんが、とりあえずMPODからSDカード内のFLACファイルやDSDファイルを選択して再生することができるようになりました。

ZYNQのUSBは、USB-シリアル変換用と、USB On-The-Go の2通り搭載していて、USBDACはOn-The-Goの方につなぎます。ですから、On-The-GoケーブルでつないでおかないとHOSTモードにならず、USBDACを認識しません。On-The-Goケーブルをつないでおけば、きちんとPnP動作をしてくれます。

予想通り、DSD Native転送になっています。ここでいうNativeというのは、DSD-PCM変換された信号ではなくてオリジナルのDSD信号を転送する、という次元の話ではなく、USBを使ったDSD転送において、DoP方式ではなくDSDのために定義された転送モードで送り出す、という意味です。

上のキャプチャはDSD256のファイルを転送中のUSBアナライザの画面です。1uフレーム期間(125us)に平均して352.8バイトのデータをUSDA_MINI基板へ送り込んでいます。

重要なのは、DSD256に対応できるということよりも、DSD64/128の場合も含めて、DoP転送よりも転送に必要な負荷が少ないことが期待できる、ということになります。

ただ、DoP転送、Native転送にかかわらずDSD転送の場合には少し問題があります。というのは、再生開始直後に、少しの期間”ゼロ”を送ってくるため、再生の頭でノイズが出てしまいます。ゼロではなくて”0×96,0×69,0×96,0×69,….” などを送ってくれれば良いのですが、そうはなっていません。

0×96,0×69,…ならば、1bitに展開すると”10010110….”といった1bit列になり、フィルタするとDCになりますが、”0×0,0×0,0×0,0×0,…”を送られると、bit列は”00000000….”となり、フィルタすると負のフルスケールに張り付いた値になりますので、どうしても再生の頭でノイズになってしまいます。

再生の頭だけはアンプのボリュームで回避して、アルバム単位で聴いていれば実用上問題はないのですが。Linuxのソースのどこを修正すればよいのかまだ調べていません。

ちなみに、lightMPDはすでにBBB用にDSD Native転送対応のバージョンがUPされています(先を越されました:笑)。対象のDDCをお持ちの方はお試しになる価値はあると思います。UDA2はうまく動作するか未確認なので多少不安ですが、USDA_MINIではとりあえずNative転送で動作しています。

USBなら本当はraspberry pi 2で動作すればクアッドコアですし一番コスパが高くて良さそうなのですが、何事も思った通りには行かないものです・・・。それともDoPはNGでもNativeはOKということなのでしょうか?

さて、 ひとまずUSBは置いておいて、I2Sを試してからAXIバスにぶら下がるDSDインターフェース設計を始めたいと考えています。

おまけ

前回の記事で、最近の新しいLinuxカーネルには、「一部のUSBオーディオ基板向けを想定して拡張フォーマットが新たに用意されている」 という旨を述べました。

再生しようとする信号のフォーマットを、ALSAアプリと出力先のデバイス・ドライバとの間で教え合うためのフラグのようなものなのですが、”SNDRV_PCM_FMTBIT_DSD_U32_LE” という「もの」と、”SNDRV_PCM_FMTBIT_DSD_U32_BE” といった「もの」などが追加されているのです。

そこで、とりあえず前者をI2Sコントローラ用に採用して定義しましたが、実は、「一部のUSBオーディオ基板」 にはUDA2基板、USBDAC基板やUSDA_MINI基板を含めることができることに気がつきました。

カーネル・ソースの、/sound/usb/quirks.c のコードに下図の赤丸で囲んだ記述を追加することで、対応サンプリング周波数がDSD256にまで拡張され、同じサンプリング周波数のファイルを再生するためのCPUの仕事量が2/3に減り、かつ16bitにパックしたDSD信号にDoPマーカを付け足すという不毛な仕事からCPUが解放されます。 (すみません、256対応は実験上は未確認です) 。

quirks.c に該当する関数がない場合には、古いソースだと考えられます。また、連動してALSAのライブラリも新しいものにする必要があります・・・。 どうせなので最新版に・・・。

ZYBOのUSBでテストアプリを作って確認できました。他のARM系のボードでもおそらく大丈夫だと思います。BBBやRas-Piでもいけるのではないかと思います。もちろんパソコン上の各種ディストリビューションでも同様に行けるのではないでしょうか。

カーネルの再コンパイルをご自身でやらなければならないので、決してお勧めするわけではありませんが・・・。

もしかしたら、ですが、BBBやRas-Pi上のMPD再生で、音切れ対策に、ひょっとしたらですが、多少効果があるかもしれません。ネットワーク上のトラフィックに変化はないはずですが、USBバス上に送り出す時の負荷は減るはずですので・・・。

※動作を保証するものではございませんので、どうかご了承をお願いします。

目処が立つ

前回予想したとおり、このI2Sコントローラに入力するオーディオ系クロックを12.288MHzから倍の24.576MHzに変更するだけで、つまりZYNQプロセッサのペリフェラル・クロックのPLLコンフィギュレーションを変えるだけで、I2Sコントローラの回路やデバイス・ドライバを変更することなく、192kHzまでのサンプリング周波数に対応できることが動作確認できました。

気を良くして、サンプリング周波数が48kHzの倍数 (あるいはやろうと思えば44.1kHzの倍数) にしか対応できないという現行の装置の限界を破るべく、再生オーディオファイルのサンプリング周波数に応じて、このシステムクロックの周波数を、2つのクリスタル発振器、24.576MHzか22.5792MHzのいずれかを切り替えて供給できるようにI2Sコントローラと、そのデバイス・ドライバを改造してみました。

当然、ALSA準拠のアプリ再生で切り替わるようにしてあります。まずはI2Sコントローラに発振器切り換え用のレジスタを追加しました。そして、アプリからALSA経由で再生サンプリング周波数のパラメータを受け取ったデバイス・ドライバが、その追加したレジスタに値をセットすると改造I2Sコントローラが発振器の切り替えセレクタを制御する、という寸法です。なのでデバイス・ドライバにも変更を入れました。

これで、UDAなどと同じように、愚直に原始的に、ではありますが、ピュア・オーディオ品質のクロックが使えるI2Sコントローラができあがりました。 そういうことで必然的にDAC基板も作らざるを得なくなります。

クリスタル発振器はDACが載った基板上に2個置かれることになります。選択されたクロックがDAC ICとZYBOに供給されます。

DAC ICとしてPCM1792Aを載せましたので、CPU(ARM)から設定ができるようになる (する) 予定です。LinuxにはPCM1792Aのデバイス・ドライバも入っていますので、こちらも改造して使うことになると思います。

改造が必要になる理由はDSD対応です。今回の検討で、I2SコントローラにDSD対応の機能を追加すれば普通にNative DSD再生ができるはずであることを確認しました。

最近のALSAライブラリには、”SND_PCM_FORMAT_DSD_U32_LE” というフォーマットが追加されています。調べてみると、元来、一部のUSBオーディオ基板向けに新たに用意された拡張フォーマットのようですが、自作のALSAアプリからARMのAXIバスにぶら下がる形のこのI2Sコントローラに対しても、再生時にデバイス・ドライバ経由でこのフォーマット情報を伝えることが可能であると実験で確認しました。

つまり、アプリが再生開始する直前に、再生信号のフォーマット情報 として “SND_PCM_FORMAT_S32_LE” を送ってくればI2Sモードに、”SND_PCM_FORMAT_DSD_U32_LE” を送ってくればDSDモードへと、I2Sコントローラの機能が切り替わるようにI2Sコントローラのロジック回路とデバイス・ドライバを作りこんでおけば良いというわけです。

おそらくは、最近のMPDではこのフォーマット、”SND_PCM_FORMAT_DSD_U32_LE” がサポートされているはずですので、ZYBOにも組み込んであげることで、出力対象がUSBアダプタではありませんが、Native DSD再生ができるようになるものと思われます。

ちなみにですが、ZYNQプロセッサのベンダであるxilinxや、あるいはZYBO基板をリリースしているDigilentが公開しているramdiskにはALSAのライブラリは組み込まれていませんので、自分で最新版のソースを引っ張ってきて、ノートPCにインストールしたLinux上でクロス・コンパイルして突っ込みました。

ALSAアプリにしても、デバイス・ドライバにしても、もちろんOS本体のカーネルにしても、すべてクロス・コンパイルということになってしまうのは同じですが・・・。

i2sコントローラ改造とDAC基板

このi2sコントローラの構成は、再生部のみですが前回のブログにブロック図を書き起こして掲載しました。

バスにぶら下がる構造のこの手のデバイスは、大抵が、バス経由(ARMの場合はAXIバス)でメインメモリ内のデータをそのデバイス内のFIFOに突っ込めるだけ突っ込んでおいて、データの抜き出し側で一定速で読み出すという方式になっています。この場合、FIFOにはバスのクロックに同期してデータを書き込み、読み出しはオーディオのクロック(22.5792/24.576MHz)に同期して行う、という事になります。

PC用のPCIバスに挿して使用するサウンドカードは、カード上のコントローラがマスタとなり、(自身で主導権を握って)メインメモリからデータを引っ張ってくるものがほとんどで、CPUはデータ転送に関わらないで済むように設計されています。それが合理的な考え方で、その分CPUが他の仕事に専念できるからです。CPUはファイルからオーディオデータを読み込み、必要に応じて各種デコードなどを行ってメモリ上に置いておく、という動作のみが必要になります。

それに対し、このi2sコントローラはマスタになるタイプではなく、あくまでもスレーブデバイスですから、メインメモリのデータは、他者に転送してもらわなければなりません。

通常はその役割をCPUが負うことになり、何もしなければデータ転送だけでCPUが忙しくなってしまうことになります。CPUは、FIFOが空いている限り(FIFOの状況を逐一チェックしながら、満杯でなくなれば)データをメモリから読んでFIFOに書き込むというプロセスを繰り返します。

これではまずいので、そこに登場するのがDMA(ダイレクト・メモリ・アクセス)コントローラ、略してDMACということになります。

あらかじめデータの転送元アドレスと転送先を設定しておけば、i2sコントローラから転送要求が伝わるたびに(1発パルスを受け取るたびに)、メモリからFIFOにデータを自動的に転送するようになっていて、CPUに替わってデータ転送の仕事を行ってくれるのがこのDMACということになります。

i2sコントローラは、自身のFIFOが満杯でない限り転送要求のパルスをDMACへ繰り返し出力します。これは簡単なロジック回路だけ構成することが可能で、こういう仕組みによって、i2sコントローラがマスタにならなくてもCPU負荷を上げることなくデータ転送を行うことができるようにしています。

どちらかというと、二昔前のISAバスのサウンドカードに近い動作方式ですが、ISAバスは1度に16bitのデータしか転送できないのに対してこちら(AXIバス)は32bit分転送できますし、バスのクロックに至っては、ISAバスが数MHzなのに対し、このi2sでは100MHzにしており、PCIバス比では3倍のクロック速度になっています。という事で性能的には段違いといえます。

さて、このi2sコントローラの回路とデバイスドライバを少し改変して上の図のようなDAC基板をつなげるようにしたいと思います。本来、発振器はZYBOのような基板上にあるのが筋だと言う感じもしますが、DAC基板側に置くことになります。

時間を見て、先ずはPCMだけでも192kHzまで普通に対応できるように進めようと思います。

つづく、かな?