2012年10月9日火曜日

AC'97 Codecを制御してみる 3

AC'97 Codec用の制御回路を作成して、信号を出したり音楽データを再生させることはできた。
元々はCodecをDACやADCとして使ってみようと考えていたのだが、意外と出力のノイズが目立つので方針を変更して、本来のAC'97用コントローラの形にまとめてみることにした。

以下にブロック図を示す。


このコントローラは3つのブロックで構成される。 CodecへのPCMデータの出力はDMAによる方法とCPUによるレジスタへの書き込みによる方法を選べる。
DMAの場合、DRAM上にバッファ領域を確保しそのアドレスをレジスタに設定する。


DMACにはバッファの使い方で2つのモードを持たせた。1つはBEGINからENDまで転送したら動作完了となる non-circulation モードで、もう1つはENDに達したらBEGINから再び転送を行う circulation モードである。 前回の実験では音楽データ1曲分をDRAMに展開して再生させたが、これだと非常に大きなメモリ空間を占有してしまうことになる。 音楽データ全体はフラッシュメモリや外部記憶上にあり、そこから少しずつDRAM上のバッファに転送して出力するというやり方が一般的だろうと思う。  ただし、この場合はソフトウェアの介在が不可欠で、DMACのバッファからの読出しに同期してバッファのデータを更新する必要がある。このコントローラの場合は、DMACのポインタがTHRESHOLDレジスタで示すアドレスを通過したタイミングと、ENDレジスタで示すアドレスを通過したタイミングで割込みを発生できる。THRESHOLD通過割込みが発生した場合、BEGINからTHRESHOLD間のデータは転送済みなので、ソフトウェアはその領域を次のデータで更新する。同様にして、END通過割込みではTHRESHOLDからEND間のデータを更新する。もちろんこの方法の場合はDMACをcirculationモードで使用する。

全体的な外部仕様(レジスタ仕様)は以下のとおりだ。




0 件のコメント:

コメントを投稿

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...