できるだけ当時の部品で作るという当初の目標は達成できたので、次は現代の部品を使ったらどうなるかを試してみました。候補としては、
(1)Teensy 4.1+4004
(2)EMUZ80+4004メザニンボード
(3)TangNano9K+4004
あたりを考えたのですが。まずはread4001(Intel 4004 (その5) Mask ROM 4001を読んでみる)で4001を読んだ実績があるTeensy4.1で試してみることにしました。
read4001のときは3.3V→15Vの変換はFETの2N7000を使っていたのですが、これでいいのか若干気になっていたので別の部品も探してみました。見つけたのがこちら。
CD40109B Low-to-High Voltage Level Shifter (datasheet)
実際の信号で2N7000と比べてみました。
上から、入力(3.3Vパルス)、40109、2N7000(4.7kプルアップ)です。(100ns/div)
40109は立ち下がりの遅延が2N7000の倍の100nsぐらいありますが、それ以外はかなり良い特性です。出力制御(OE)も備えているのでこれを採用することにしました。
この他に、CD4504B(Voltage-Level Shifter)も候補にあったのですが、全ての点で40109の方が勝っていたので不採用です。
上から、入力(3.3Vパルス)、40109、4504。(50ns/div)
次に15V→3.3Vです。4004のデータシートによると、HはVss-0.5~Vss(今回の場合は+14.5~15V)、LはVss-12~Vss-6.5V(+3~8.5V)です。実際の信号を観測してみると、Lは+3~+5Vぐらい。
read4001の時と同じように、1段目をVcc=15VのCMOSで受けて、2段目をVcc=3.3VのCMOSで受ければ良さそうです。1段目は閾値を高くするためにVcc=15Vにする必要があるので標準CMOS、2段目はVcc=3.3Vでいいので高速な74HC4049(入力耐圧は+15V)を使うことにしました。
クロックドライバの3.3V→15Vは秋月で売っているMicrochipのMCP1402(datasheet)を使ってみることにしました。最初は5.185MHzのクロック源(MCLK)を外部に用意して、ソフトで2相クロック(CLK1, CLK2)を生成するという構成を試したのですが、Teensyの内部カウンタ(600MHz)でわりと安定したMCLKまで作れてしまいました。
完成した回路図がこちら。
次にプログラムです。
速度が要求されるので、ポートレジスタ直叩きとかやる必要があるかなあ、面倒だなあと思っていたのですが、digitalWriteの速度を測ってみたところ驚愕な速さだったのでデータバスを1ビットづつ読み書きするというお子様的なプログラミングで済ませてしまいました。
こんな感じのコードで、
この速度。Teensy4.1の性能恐るべしです。(これ5ns/divですよ)
プログラムはクロックを生成しながら4004の命令サイクルにあわせてバスを読み書きするだけなので特筆すべきことは無いかな。
Lチカが動きました。
回路図やプログラムはGitHubに置きました。
(1)Teensy 4.1+4004
(2)EMUZ80+4004メザニンボード
(3)TangNano9K+4004
あたりを考えたのですが。まずはread4001(Intel 4004 (その5) Mask ROM 4001を読んでみる)で4001を読んだ実績があるTeensy4.1で試してみることにしました。
read4001のときは3.3V→15Vの変換はFETの2N7000を使っていたのですが、これでいいのか若干気になっていたので別の部品も探してみました。見つけたのがこちら。
CD40109B Low-to-High Voltage Level Shifter (datasheet)
実際の信号で2N7000と比べてみました。
上から、入力(3.3Vパルス)、40109、2N7000(4.7kプルアップ)です。(100ns/div)
40109は立ち下がりの遅延が2N7000の倍の100nsぐらいありますが、それ以外はかなり良い特性です。出力制御(OE)も備えているのでこれを採用することにしました。
この他に、CD4504B(Voltage-Level Shifter)も候補にあったのですが、全ての点で40109の方が勝っていたので不採用です。
上から、入力(3.3Vパルス)、40109、4504。(50ns/div)
次に15V→3.3Vです。4004のデータシートによると、HはVss-0.5~Vss(今回の場合は+14.5~15V)、LはVss-12~Vss-6.5V(+3~8.5V)です。実際の信号を観測してみると、Lは+3~+5Vぐらい。
read4001の時と同じように、1段目をVcc=15VのCMOSで受けて、2段目をVcc=3.3VのCMOSで受ければ良さそうです。1段目は閾値を高くするためにVcc=15Vにする必要があるので標準CMOS、2段目はVcc=3.3Vでいいので高速な74HC4049(入力耐圧は+15V)を使うことにしました。
クロックドライバの3.3V→15Vは秋月で売っているMicrochipのMCP1402(datasheet)を使ってみることにしました。最初は5.185MHzのクロック源(MCLK)を外部に用意して、ソフトで2相クロック(CLK1, CLK2)を生成するという構成を試したのですが、Teensyの内部カウンタ(600MHz)でわりと安定したMCLKまで作れてしまいました。
完成した回路図がこちら。
次にプログラムです。
速度が要求されるので、ポートレジスタ直叩きとかやる必要があるかなあ、面倒だなあと思っていたのですが、digitalWriteの速度を測ってみたところ驚愕な速さだったのでデータバスを1ビットづつ読み書きするというお子様的なプログラミングで済ませてしまいました。
こんな感じのコードで、
#define digitalWrite digitalWriteFast
digitalWrite(DOUT0, data & bit(0));
digitalWrite(DOUT1, data & bit(1));
digitalWrite(DOUT2, data & bit(2));
digitalWrite(DOUT3, data & bit(3));
この速度。Teensy4.1の性能恐るべしです。(これ5ns/divですよ)
プログラムはクロックを生成しながら4004の命令サイクルにあわせてバスを読み書きするだけなので特筆すべきことは無いかな。
Lチカが動きました。
回路図やプログラムはGitHubに置きました。
※コメント投稿者のブログIDはブログ作成者のみに通知されます