ROM Emulator の製作

[Oct.14 2006] まえがき

ROM emulator の製作記事です。 もともと PCE 互換機の開発メモ に書いていたんですが、あっちのページが直接関係ないものでごちゃごちゃしてきたので こっちに移動しました。

目次


PCE 互換機の開発メモ  トップページ


[Dec.27 2003] ROMエミュレータの製作

ROMエミュレータを製作することにしました。 とりあえずパーツを買ってきたので写真をアップします...


↑買ってきた主なパーツ。USBインタフェイスを買ってしまった。
「パラレルポート」じゃなくて「FIFO」と書いてあったので、
ちゃんと使えるかどうかかなり不安。


↑部品の配置決め。万能基板は半分に切ってしまった。無駄のない回路設計で
前のFC用よりもコンパクトになった(注:私の設計じゃないです)
このような密度で回路を製作すると、基板裏の配線がボーボーになる(笑)のだけど、
今回は線材として、ちょっとしたモノを試してみようと思い、敢えてこのような
高密度な配置に挑戦した。配線が終わったら裏も掲載する予定。


[Jan.01 2004]

ROMエミュレータをデバッグ中です。 回路は ChaN 氏のROMエミュレータ にアドレス線を追加して 4Mbit 化しただけです。 USB制御にしようとたくらんでいたのですが、 上の写真のUSBインタフェイスはCPUが必要と分かったため、 結局今のところパラレルポートで制御しています。 C言語による制御プログラムを載せておきます。まだ ハードウェアの方はデバッグ中ですが、多分これで動くと思います。

#define CTRLPORT        0x378

static unsigned char    s_PrevData = 0x00;

void rome_reset(void);
void rome_sendbyte(unsigned char v);

/*-----------------------------------------------------------------------------
    [rome_reset]
        書き込みモードにし、カウンタとシフトレジスタをゼロクリアします。
-----------------------------------------------------------------------------*/
void
rome_reset(void)
{
    outportb(CTRLPORT, 0x00);
    outportb(CTRLPORT, 0x08);
    s_PrevData = 0xff;
    rome_sendbyte(0x00);
}


/*-----------------------------------------------------------------------------
    [rome_sendbyte]
        1バイト書き込みます。 
-----------------------------------------------------------------------------*/
void
rome_sendbyte(
    unsigned char   v)
{
    if (v != s_PrevData)
    {
        int             i;
        unsigned char   bit0;

        s_PrevData = v;
        for (i = 0; i < 8; i++)
        {
            bit0 = ((v << i) & 0x80) ? 1 : 0;

            outportb(CTRLPORT, 0x08|bit0);      // clock=L
            outportb(CTRLPORT, 0x08|bit0|0x02); // clock=H
        }
    }

    outportb(CTRLPORT, 0x0c);   // strobe=H
    outportb(CTRLPORT, 0x08);   // strobe=L
}

まず rome_reset() を呼び出してから、 ROMエミュレータに書き込むバイト数(512KB)だけ rome_sendbyte() を行なえばOKです。 書き込みが済んだら、outportb(CTRLPORT, 0x00); することでターゲット側からハードウェアがROMとして 見えるようになるはずです。 [Jan.04 2004] ROM EMULATOR の完成写真

[Jan.11 2004]

ROM emulator について少し補足しておきます。つまずいた点など。

RESET 信号線のトランジスタですが、私は汎用の 2SC1815 を使いました。 ただ、今回製作したPCE用 ROM emulator の場合では、 ChaN 氏の ROM Emulator 通りではうまく動作せず、2SC1815 のベースに 抵抗をつけることで解決しました。私は手持ちの抵抗の都合で 1.5[KΩ] を用いました。 この抵抗をつけないと、PCEからのアドレス信号線を開閉する 74HC541 の G1 と G2 (それぞれ1ピンと19ピン、トランジスタのベースと繋がってるやつ) の電圧が 2.5V 程度と、CMOS のロジックIC的に厄介な入力電圧になっていました。 このくらいの電圧を入力すると、COM IC は異常に電力を消費するらしく、3つある 74HC541 のうちの1つが異常に発熱していて、冷や汗をかきました。
[Jan.17 2004] 訂正:「74HC541 の G1 と G2(それぞれ1ピンと19ピン、」→ 「74HC541 の G2(19ピン、」

あと注意するのは、未使用の入力端子は全て+VもしくはGNDに接続することです。 こうしないと入力端子に強力なノイズが入ったりするとラッチアップという CMOS IC 特有の現象を起こして自滅することがあるらしいです(↑のように入力に 2.5[V] 付近の電圧が加わった場合に異常に発熱する現象はラッチアップではないっぽい)74HC14 など出力が入力の逆になるものは入力を+Vに、74HC541 など逆にならないものは入力を GND に接続すると良いようです(出力がゼロVになるように)。
[Oct.14 2006] 訂正:入力信号はプルアップされることが多いので、出力が +V になるように接続した方が無難かもしれません。

使用したSRAMは、HM628512BLP-5 というやつで、アクセス速度は 55[ns] です。 ゲートの遅延時間を余裕をみて 30[ns] 程度とすると、大体 ROM emulator 全体の遅延時間は 85[ns] 程度です。私の持っているPCEのメインメモリ(8KB)のアクセス速度が 100[ns] なのでこれでOKだと思います。

実は ROM emulator の電源はPCEから取っておらず、 PCのUSBポートから取っています。 PCEのカートリッジコネクタから電源を取るとなぜか動作しません。 PCEの電源って確か78M05を使ってたと思うので、 電源の容量不足かなーと思っていますが、本当のところはわかりません。

私はちょっと欲張ってSRAMを 4M bit にしましたが、ちょっとテストするくらいの 目的であれば 512K bit のSRAMで充分だと思います。この場合はアドレス線がちょうど 16本なので、アドレス線を拡張するために新たに 74HC590 と 74HC541 を追加する必要がなく、 製作が比較的楽です。 [Jan.17 2004] ROM Emulator の回路図
注:使用した回路図エディタ(CEAT V2.4)の都合で、 制御線の名称が ChaN 氏の回路図とは異なっています。ピン番号で見てください。

目次  PCE 互換機の開発メモ  トップページ


[Jan.01 2006] CPLD で ROM Emulator の製作

明けましておめでとうございます。(^_^; 昨年はコレといったこともできずに終わってしまいました。 今年はもう少し進歩のある年にしたいです。あまり自信はないですけど...。

Xilinx の CPLD を使って ROM emulator を作ってみました。

ブロック図です。
[Jan.03 2006]: XC9572 ではマクロセル数が足りませんでした → XC95108 に変更。あと Reset 信号追加。


XILINX XC95108PC84-15 を用いた ROM emulator のブロック図

HCmd, HClk, HData はホスト PC からのコマンド、クロック、データ出力と入力です。 TAddr, TData, /TOE, /TWE はターゲット側アドレス、データ、読み出し、書き込み信号線です。 RAddr, RData, /ROE, /RWE は S-RAM のアドレス線、データ線、読み出し信号線、書き込み信号線です。

HCmd にコマンドを出力し、HClk を 0 → 1 変化させて制御ロジックにコマンドを書き込みます。 コマンドは、今のところこれだけです。

データ線は RAM や ターゲット CPU のデータバスに接続するので、 双方向(inout)で設計しないといけません。この辺がややこしいです。 CPLD からみて、 RData は /RWE だけがアクティブ(0)のとき値を出力しますが、 TData は /TOE だけがアクティブ(0)のとき値を出力します。

→ 制御ロジックの Verilog-HDL ソース

制御ロジックのシミュレート結果を載せておきます。


↑ROM emulator 制御ロジックのシミュレート結果(クリックで拡大)

[Jan.04 2006]

とりあえずゴァーっと配線してみましたが、動きませんでした。 いつものことながら、動かないのを知った瞬間は凹みますね... とりあえず写真を撮ってみました。


CPLD ROM emulator

ここまで作った感想ですが、 配線は確かに多少楽になりましたが、 やはり何回も作る気になるほど楽ではありません。

これからデバッグです。はー。本当にちゃんと動くのかなー。

[Jan.05 2006]

↑制御ソフトがバグっていただけでした。 ずーーっとハードを調べていました... イター。 バグでないのをバグと思い込むのもバグのうちですか...。

回路図をババーっと描いたので載せておきます。 ただ配線をしているだけです。 ピン番号はあまりチェックしていません。 間違えていたら適宜修正してください。


↑CPLD ROM emulator 回路図(クリックで拡大)

できたっぽい制御ソフトも掲載しておきます。 パラレルポートの操作には Craig Peacock 氏の PortTalk を利用させていただきました。

→ 制御ソフトソース

わかりやすく書こうと思って書いたら、 逆に変なモノが出来上がりました。 回路図を見るとわかりますが、パラレルポートの信号はすべて HC14 に接続しているため、 論理が反転します。よってソフトの方であらかじめ反転したデータを出力しています。

目次  PCE 互換機の開発メモ  トップページ


(C) 2003, 2004, 2006 Ki