ROM Emulator の製作

[Oct.14 2006] まえがき

ROM emulator の製作記事です。

目次


トップページ


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

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


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


[Jan.01 2004]

ROM エミュレータをデバッグ中です。 回路は ChaN 氏の ROM エミュレータ にアドレス線を追加して 4Mbit 化しただけです。 今のところパラレルポートで制御しています。 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 を使いました。 今回製作した ROM emulator の場合では、 ChaN 氏の ROM Emulator は 2SC1815 ではうまく動作せず、2SC1815 のベースに 抵抗をつけることで解決しました。私は手持ちの抵抗の都合で 1.5[KΩ] を用いました。 この抵抗をつけないと、ターゲット CPU からのアドレス信号線を開閉する 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] 付近の電圧が加わった場合に異常に発熱する現象はラッチアップではないっぽい)

使用した SRAM は、HM628512BLP-5 というやつで、アクセス速度は 55[ns] です。 ゲートの遅延時間を余裕をみて 30[ns] 程度とすると、大体 ROM emulator 全体の遅延時間は 85[ns] 程度です。

実は ROM emulator の電源はターゲットから取っておらず、 PC の USB ポートから取っています。

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

目次  トップページ


[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 に接続しているため、 論理が反転します。よってソフトの方であらかじめ反転したデータを出力しています。

目次  トップページ


(C) 2003, 2004, 2006 Ki

inserted by FC2 system