MP3記録データCD再生装置(MPROM) |
去年、若松通商でChaNさんに教えられてMP3デコーダLSIを購入したのが発端です。ChaNさんの方では、ポータブルMP3プレイヤーという分野で設計されましたので、MP3プレイヤーのもう一形態であるCD−ROMドライブやHDDなどのATAデバイスを記録デバイスとするメディアから、MP3データを読み出して再生する通称MPROMを作ることにしました。取り敢えず、自作でも十分にMPROMは作れるよ、ということで(^^)
仕様としては、とにかくこの一点が重要です。
「完全日本語対応」
一般に市販されるMPROMは海外メーカー製であるため、ほとんどの場合日本語に対応していませんし、コスト的な問題から漢字を表示することは基本的にできません。このため、今回のMPROMでは日本語を表示できる。特にID3タグやファイル名が確実に日本語表示できることを絶対条件として設計しました。
しかし、日本語を表示するには普通の安物LCDパネルではダメです。このため、今回は本格的なフルドットLCDを使います。フルドットLCDパネルにはEPSON製の高コントラストモノクロパネルを使用しています。このパネルは一般的なLCD駆動タイミング(ライン・フレーム・ドットクロックの3クロック動作)ですので、このパネルでなくても似たようなタイミングのパネルであれば、比較的簡単に流用できます。
CD-ROMについては、一般的なISO9660の他に、Microsoftの提唱したJuliet形式のメディアも認識します。このJuliet形式は漢字ファイル名を使用する場合にはほとんど使われますので、絶対条件としました。また、追記CD−Rでも使えるようにマルチセッションCD−ROMにも対応しました。いまのところUDFはサポートしていませんが、そのうちやるかも:)
2.使用したデバイスの解説
●MP3デコーダ&D/Aコンバータ
今回のキーデバイスはMicronas社が発売しているMP3デコードLSI MAS3507D (写真右)です。このLSIはMP3プレイヤーの初期のころから使われている有名なもので、いまではMP3デコードLSIは珍しくはなかったですが、ほんの1年ちょっと前はこれぐらいしかありませんでした。有名な携帯MP3プレイヤーであるMPMANなどでも使用されています。
このコントローラとともにD/Aコンバータとして DAC3550A (写真左)を使用しています。このLSIはD/Aコンバータとともに、パワーアンプと2系統の外部入力を持つミキサーを内蔵していて、MAS3507と共に使うことで大変コンパクトにMP3再生システムを構築することができます。
●CPU NEC V53A (uPD70236A-16)
いきなり謝ります。このCPU、すでにディスコン(生産停止)されています。もし今回のMPROMを作る気がある方は在庫限りなので代理店にお問い合わせ下さい。秋葉原では神和電機(メモリで有名ですが、この手のものも扱っています)にありますので、必ず「平日に取り寄せの申し込み」をしてください。たしか、1こ2000円ぐらいです。
このCPUは、NECの名CPUであるV30シリーズのマイコン版で、V30と比べて以下の特徴があります。
・バスサイクルが4クロックサイクルから2クロックサイクルに圧縮されているため、同クロックのV30の2倍の速度
・アドレスバスとデータバスが分離され、データバスはダイナミックバスサイジング機能により8ビットバスデバイスと16ビットバスデバイスを同一データバスに直結可能。
・割り込みコントローラ、シリアル・DMA・タイマ・ウェイトコントローラなどが内蔵。
今回のMPROMでは、MP3データをデコーダLSIに転送する際にシリアルデータとして送る必要があります。この場合、割り込みで処理をするとMP3では最大320Kbps程度まで出します。これを割り込みで処理するのは割り込みアクノリッジサイクルの長い86系CPUではかなりの負荷になります。特に、CD−ROMのデータ読み出しもからみますので、ソフト設計の上でも結構面倒です。このため、今回のMPROMではこれをDMAで処理しています。また、画面表示の際のデータスチールでもDMAを使う必要がありますので、CPUのDMA機能は今回の製作では必須となります。
●CPLD Xilinx XC95108-15
いわゆる書き換え可能な回路素子で、ハードウェア記述言語(ABELやVerilog,VHDLなど)を用いて、複雑な回路をソフトウェアを書くように設計することができます。そして、特に最近のものはJTAG端子に簡易ケーブルを使って、パソコンから「システムに組み込んだまま」簡単に書き換える(In-System-Programming)ことができます。
また、書き込み用のソフトや、開発用のソフト(ABEL、VHDLコンパイラ)もXilinx社のWebサイトより無料でダウンロードすることができますので、趣味でこのような比較的規模の大きなシステムを作ることができるようになってます。
今回は、ほとんどのインターフェイスをこの中に設計することで、大幅な部品の削減を行いました。なお、設計の記述言語は今回はABELを使いました。
3.ハードウェア構成と作成
ほとんどのロジックはCPLDに実装されています。このため、外付け部品はかなり少ないです。ATAPIインターフェイスがTTLレベルのバスですので、この変換用にHCT245を使う以外は標準ロジックはシュミット入力が必要な部分用のHC14ぐらいです(リセット回路用)。
今回はUSBライタよりはるかに結線数が多いので、作成時には結線間違い、線間のショートには特に気を払う必要があります。例のごとく、フッ素皮膜線などを使って作るのがよいでしょう。
なお、フラッシュROMにはボトムブートタイプを使っていますが、マッピング上はトップブート(MBM29F800TA-12)を使った方が無駄がないです。今回ボトムブートなのは、手持ちがボトムブートのフラッシュしかなかったからです(^^;;;; (ボトムブートですと、データ保存エリアに端数セクタが入ってきますので使い勝手が悪いので)。
CPLDのクロック系にはダンピング抵抗を入れていますが、ここはアンダーシュートなどで不具合が起きる可能性が大きいので、十分にチェックするか、配線時にかなりの注意を払う必要があります。わたしもかなり悩まされました(^^;;;; ダンピング抵抗で間に合わない場合にはセラミックコンデンサを270〜680pF程度を信号−グランド間に挿入してください。
|
図面 写真 |
||
種類 | メーカー | 型番 | |
---|---|---|---|
CPU | NEC | uPD70236ARB-16 | |
フラッシュROM(8M) | 富士通 | MBM29F800BA-12 | |
SRAM(4M) | 日立 | HM628512-7 | |
CPLD | Xilinx | XC95108-15 | |
MP3デコーダ | Micronas | MAS3507D | |
D/A,アンプ | Micronas | DAC3550A | |
LCDパネル | EPSON | TCM-A0824-2 | |
PPI | NEC | uPD71055C | |
OPAMP | NationalSemiconductor | LMC662 | |
RS232Cレベルコンバータ | AnalogDevices | ADM232AAN | |
バスレベルコンバータ | 日立 | HD151015P | |
トランジスタ | ローム | DTC114XSA | |
CMOS | 各社 | 74HCT245 | |
CMOS | 各社 | 74HC14 | |
ダイオード | 東芝 | 1S1588 | |
レギュレータ(5V) | Motorola | MC78T05 | |
レギュレータ(3.3V) | NationalSemiconductor | LM3940CT | |
OSC | キンセキ | JXO-7(24.576MHz) |
4.ソフトウェアの設計
今回はソフトウェア設計にアセンブラと共にC言語を使っています。さすがに規模がちょっと大きいのと、GUIがからんできますので、設計期間短縮を計ります。特にデバッグをターゲットマシンではなく、AT互換機でなるべくできるようにしていることで、かなり楽ができました。使い慣れたTurboDebuggerなどが使えるのは大きいです。
使用したコンパイラは、エル・エス・アイジャパンのLSIC−86です。このコンパイラはROM化を前提とした仕様となっていて、リンカも直接HEXファイルを書き出すことができます。また、コード生成効率が高いため、かなりアセンブラで書くのと同じような高いレベルのコードを吐いてくれます。
しかし、AT互換機でデバッグするにはLSIC-86のオブジェクトではTurboDebuggerを使えませんので、互換機ではBorlandC++4.52を使ってコンパイルを行い、実行します(デバッグビルドでできるEXEファイルはDOS上でしか動きません(dos窓不可))。
なお、アセンブラで書いてある部分は、TurboAssemblerでアセンブルすることを前提としています。MASM(MicrosoftMacroAssembler)ではアセンブルはたぶんできないので、注意してください。詳しくはファームウェアアーカイブのBUILD.TXTを参照してください。
●再生ルーチン
再生用のコードのメインルーチンはすべてC言語で書かれます。DMAの割り込みやCD−ROMのATAPI INTRQ割り込みも全てCで書かれます。この割り込みはLSIC−86ではBorlandC++などのように _interrupt 修飾子を持ちませんので、スタートアップコードにディスパッチ用のコードを書いて、そこからCの関数を呼び出すようになっています。
●フォント
漢字フォントやANKフォントはFONTX2互換ファイルを使います。これをツールを使って直接目的のセグメントに配置するhexファイルをダイレクトに生成します。FONTX2関連は、DOS/V時代にいろいろなユーティリティがフリーソフトとして開発されていますので、特にフォントで困るようなことはないでしょう(フリーのフォントも出回っています)
●UNICODE解析
Jolietファイルシステムでは、ファイル名にUNICODEが使われます。このままですとFONTX2がSjiftJISベースであるため、表示が面倒、そしてID3TAGもShiftJISということで、大変使い勝手が悪いので、SjiftJISにファームウェア内部で変換する必要があります。しかし、UNICODEとSjiftJISの間には全く数式化できる変換規則がありませんので、すべてのShiftJISコードに対応するUNICODE変換テーブルを持つ必要があります。
実際のコードでは2段の変換テーブルを使って、そのままテーブルを作ると128Kバイトになってしまうのを半分の60Kバイトにまで圧縮しています。この変換コードはBIOS化されていて、簡単にC言語からも呼び出すことができます。
回路図、ブロック図、ファームウェア全ソースコード(C、アセンブラ) アーカイブ(リリース2)
5.使い方
取り敢えず、基本的な使い方としては、フォルダに入って選択(複数可)して鳴らすだけの機能を入れています。プレイリストの編集は、一応シリアルインターフェイスが入っていますので、パソコンで編集してMPROM側に送り込んで、それを再生ということもできますが、まぁそれはあとでということで・・・。データ保存用にフラッシュメモリが4Mビット分空いていますので、結構いろいろと保存することができます。
一応、ハードウェア的には結構いろいろと面白いことができるようにしていますので、ファームウェアをいろいろいじってみるとよいでしょう。
取り敢えず、現状のソフトの軽い使い方など・・・。
写真:左から順に、ISO9660ディスク表示、Juliet漢字ファイル表示
サンプルディスクは、STB-LabさんのWithHeartII(ISO9660)、WoodSoftさんのMarineSnow(CD-Extra/MultiSession,Juliet)を使っています。
写真:左から、時間表示、ID3タグ表示
6.製作を終えて。
取り敢えず、半年ぐらい製作をやっていたのですが、なかなか面白かったです。たぶん自作では一番ハードウェアもプログラムも規模が一番大きいもので、簡易書き換えのFPGAも初めて使ってやったり、普段は滅多に使わない(笑)DMAでも結構遊べました。なかなか仕事ではトータルでシステムを構成することはなかったりしますので、こういう全部を作り上げるのはなかなか味わえないものです(^^)
全体としてはMP3デコードチップがよくできていて、使い方が簡単だったため、比較的規模にしてはすんなりといったと思います。だから、結構いろいろと簡単に作ることができると思います。また、今回はCD-ROMでしたが、同じようなATAインターフェイスのHDDなども接続可能ですので、このファームウェアを参考にそういうものに挑戦するのも面白いでしょう。あと、ファームはまだまだ未完成というレベルだと思うので、いろいろ改良してみるといいと思います。
7.関連リンク
意外にみんな同じことしてたのね(笑) というわけで、いろいろ紹介です。同じようにMPROMのようなものを作成なされている方は、相互リンク張りましょう。
ELM − 製作のきっかけを与えてくれたChaNさんのホームページ
にくにくくにひこのページ − 同じようにMPROMを作成されている大中さんのページ