2011年3月2日水曜日

SDメモリカードプレイヤー機能の実装

 ポータブル用にSDメモリカードプレイヤー機能の検討を始め出しました。
 一応参考となるソースがあるので、そんなに大変でもないかと思っていましたが、調べていくとかなり大変かも....

 まず、SDメモリカードには、SPIモードとSDバスモードがあり、SDバスモードであれば4bitパラレルで、それなりの速度でアクセスできるようになりますが、SPIモードでは1bitシリアルでアクセスするため転送速度が稼げません。

 SDバスモードを実装は、一応OpenCoreOrgにIPがあるのでそれを使わせてもらえば可能ですが、SDバスモードを使用するのに、どうもライセンスが必要だの、会員でないと詳細情報の入手が困難だの、アクセスシーケンスが複雑だとか、難易度が非常に高そうで手を出さないほうがよさそうです。

 SDTrans192は、SPIモードで動作させているようで、それで24/352,8kHzの再生を実現させているので、SPIでも目標性能をクリアできるのは間違いないようです。
 
 16/44.1kHzのファイルで、1.44Mbit/s、24/352,8kHzになると16.934Mbpsの転送速度が必要になりますが、規格上50Mbpsの帯域があるので50MHzで動作するSDメモリカードなら転送速度はクリアですが、SPIバス上のオーバーヘッドもありますし、CPUプログラム転送だとプログラムの実行時間のロスがあります。

 とりあえずはNiosII/e 50MHz clockで動作させるつもりですが、高々数MIPS位の性能しか無いですし、16/44.1kHzのファイルでも34クロックで1bit分の転送処理をしなければならないわけですが、それなりのstep数があるので、これでもキワドイ可能性があります。
 まだFPGA内臓メモリにプログラムが入れば可能性がありますが、SDRAMに置かなければならなくなると多分駄目でしょう。NiosII/eだとキャッシュも使えないですし、cycloneIII/IVはそれほど内蔵メモリが大きくないのでちと厳しいか....

 24/352,8kHzになると2.9クロックで1bit分の転送処理で完全に不可能な領域になります。
 元々DMA化は考えていますが、DMA化の前にSDカードアクセス回路を設計して動作させてからになります。DMAコントローラは、IPが利用できますが、使い方をマスタしなければなりません。下手をすると16/44.1kHzでもDMAが必要になりそう.というか、だんだんと駄目な気がしてきました。

 SDTrans192はDMAを使っているわけでは無いように見えますが、100MIPSとはいえプログラム転送では相当チューンしないと厳しいそう。実際アセンブラ駆使しているようで、それで稼働率76%....
やはりDMA必須です。


 Parts Connexionに催促メールを送りました。どうも忘れられていただけのようで、お詫びと共に即発送手続きが取られたようです。

2 件のコメント:

  1. アセンブラでかなりチューンして書いてるよー、って中の人には聞いてます。

    SDカードもClass2だと352.8/24は厳しいですね、Class2のでは結構ぷちぷちします。Class4以降ならいまんとこ平気ですが…

    ArduinoでSDカードオーディオ弄ってた時は、SPIで48/16くらいまでは結構普通に転送できてましたが…

    返信削除
  2.  さすがにアセンブラは遠慮したいです。
     とりあえずFATファイルシステムの管理などアドレス管理関係はソフト処理、SDカードのリード処理自体はハードとすれば352.8k/24も対応できるのでは無いかと見積もっています。うまくすればClass表記たどよくわかりませんが、読み出し10MB/s以上のSDカードなら再生できるはずなのですが....

    返信削除