ROM エミュレータを製作することにしました。 とりあえずパーツを買ってきたので写真をアップします...
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 氏の回路図とは異なっています。ピン番号で見てください。
明けましておめでとうございます。(^_^; 昨年はコレといったこともできずに終わってしまいました。 今年はもう少し進歩のある年にしたいです。あまり自信はないですけど...。
Xilinx の CPLD を使って ROM emulator を作ってみました。
ブロック図です。
[Jan.03 2006]: XC9572 ではマクロセル数が足りませんでした → XC95108 に変更。あと Reset 信号追加。
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)のとき値を出力します。
制御ロジックのシミュレート結果を載せておきます。
とりあえず配線してみましたが、動きませんでした。 いつものことながら、動かないのを知った瞬間は凹みますね... とりあえず写真を撮ってみました。
ここまで作った感想ですが、 配線は確かに多少楽になりましたが、 やはり何回も作る気になるほど楽ではありません。
これからデバッグです。はー。本当にちゃんと動くのかなー。
↑制御ソフトがバグっていただけでした。 ずーーっとハードを調べていました... イター。 バグでないのをバグと思い込むのもバグのうちですか...。
回路図を描いたので載せておきます。 ただ配線をしているだけです。 ピン番号はあまりチェックしていません。 間違えていたら適宜修正してください。
できたっぽい制御ソフトも掲載しておきます。 パラレルポートの操作には Craig Peacock 氏の PortTalk を利用させていただきました。