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まで普通に対応できるように進めようと思います。

つづく、かな?