CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

メモリ発振

JMPコードが実行される仕組みを考えて見ます
ICUは4ビットのJMPコード($C)を認識すると単にJMP出力をHにするだけです。
一方、プログラムカウンタはメモリから出力されている残り12ビットをJMP出力によってカウンタにプリセットします。
そこで、プログラムカウンタに使用したMC14516の真理表をじっと見てみると
どうもプリセット機能があやしい・・・クロックとは関係なく非同期に行われるようです
イメージ 2
 
すると、ICUのJMP出力=カウンタのプリセット入力がHの期間はカウンタのラッチがトランスペアレントになりプログラムメモリで以下のような閉ループができてしまうことになります
このときアドレス入力がクロック同期されていればいわゆる普通の順序回路ですが、
ダイレクトにフィードバックされると何が起こるかわかりません
イメージ 1
今メモリの内容が{$1001,$2000,$C000}であったとき
ある瞬間、メモリから$C000のデータが出力されていると下位12ビットの$000がメモリのアドレスに入力されます。
メモリは即時にアドレス$000に存在するデータ$1001を出力し$001がメモリのアドレスに入力されメモリは$2000を出力する・・・・
といったリスト構造の無限参照をおこなってしまいます。
これはクロックとは関係ない非同期動作でデバイスの遅延時間で決まる最高速度で実行され、リングオシレータのように発振状態となります。
 
まさに今回そのような状態になっているといえます。
メモリの遅延時間は25ns、カウンタ入力~出力の遅延が315~630nsとされているので
発振周波数1.6MHzはありえます。
 
ch1.:clock  ch2.:アドレスA0  ch3.:JMP出力
 
イメージ 3
 
 
 
これを回避するには次のメモリのデータが読み出される前にラッチを閉じてしまえばよいわけでJMP出力をCR微分して幅を100~200nsに狭めてからプリセット入力すれば良さそうです