
ROM emulator の製作記事です。 もともと PCE 互換機の開発メモ に書いていたんですが、あっちのページが直接関係ないものでごちゃごちゃしてきたので こっちに移動しました。
ROMエミュレータを製作することにしました。 とりあえずパーツを買ってきたので写真をアップします...


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 氏の回路図とは異なっています。ピン番号で見てください。
明けましておめでとうございます。(^_^; 昨年はコレといったこともできずに終わってしまいました。 今年はもう少し進歩のある年にしたいです。あまり自信はないですけど...。
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 を利用させていただきました。