2012年6月15日金曜日

Clock Generator(2)

クロックの問題があったので、後段にFFをつけた。さらに、手動と自動でクロックを切り替えられるようにもした。これはテストの際、便利なはず。
CRの遅延でクロックをつくり、FFで半分の周波数に落としている。もちろん、オシロで見たDutyは1:1だった。
クロック+電源基板の様子。R10オーム、C2000uFの2-3Hzくらいで実験中。左下のプッシュスイッチが手動クロック、その横のトグルスイッチが手動/自動の切り替え。

次はPCまわりのロジックを組んで、PCを進ませてみようと思う。

2012年6月13日水曜日

Sequence Generator

シーケンスジェネレータの回路図。6State目でリセットをかけて初期に戻し、計5つのステートを発生させている。回路図中の100uFがないと、リレー動作中にリセットがかかって発振してしまう。
とりあえずこのユニットは動作するのだが、別の問題が発覚した。リレーの個体差が大きいため、クロックジェネレータが全く発振しなかったり、Dutyが1:1から大きくずれてしまう。CRを最適化した時に使ったリレーはどれかわからず・・・もう少しまともな発振回路を考えねば。


2012年6月10日日曜日

Sequence Generator

Anchor Electronicsでオシロのプローブを買いに行ったのだが、なんと2個で1$の激安5V1回路リレーを発見した。最近、とある人に頼み込み秋月のリレーを買い足したのでしばらく持つが、SRAMを作るときにまた考えよう。

次はシーケンスジェネレータを作ろうと思う。昔Pentiumが出始めた頃、DOS/VマガジンにCPUがどう動作しているかの説明を読んだ記憶がある。1)fetch、2)decode、3)execute、4)storeのシーケンスで一つの命令を実行しているとのことだった。4つのパイプラインを持ってひとつずつずれて実行しているため、見た目1クロックで1命令実行されている。今回考えているCPUは、動作的にaccumulator型なので、データ読み込みとALUの演算をシリアルで行う、つまり1)fetch、2)decode、3)move、4)execute、5)storeの5ステートを発生させる、これがシーケンスジェネレータである。5クロックで1命令、クロックは5Hzなので1命令1秒と遅いが、まぁ速度上げたければクロック上げればいいのだ。
同時に、アドレスバスを使ってPCをインクリメントする、これは3ステップで完了する。SRAM書き込みを考えると5ステートで足りないが、SRAMの見通しが立ってないので後で考えることにする。
回路はone-hot state counterで、5ステート目の次に1ステートに戻るよう、リングにするかリセットする予定。

さて、このプロセッサは半導体を使わず、プリミティブなデバイスのみを使って構成すると決めた。気づいたのだが、このプロセッサは基本的に電位に対して対称である。つまり、電源の±を逆にしても完全に動作するはずである。動作確認用のLEDは光らないが。。。とにかく、真空管コンピュータでもECLでもCMOSでも不可能で、これはすごいアドバンテージではないか。唯一極性があるのは電解コンデンサだが、この優位性を示すため、無極性電解で構成しようと思う。

2012年6月9日土曜日

Program Counter(2)

PC基板完成。リセットしたときにPCレジスタが0x00になるようにリセットリレーも追加した。ギリギリ入ったが。
気づいたことは、レジスタに書き込む時、ロードを先にオンしてホールドを解いてからセレクトでつなぐ、ロードを先にオフしてホールドしてからセレクトを外す必要がある。デコーダ基板の出力時にセレクトだけ遅延する回路を追加して対応しよう。
動作テスト中、手動でセレクト・ロードしてPCを進めてみた写真。


2012年6月5日火曜日

Program Counter

プログラムカウンタを製作中。右がハーフアダー、真ん中と左がレジスタである。
部品の実装と、ハーフアダーの配線が終わったので、インクリメントのテスト。ハーフアダーの0bit目の繰り上がり入力を常にHにしてやることで、入力に対し常に+1が出力される。動作している!

2012年6月4日月曜日

Program Counter designing

次に作る予定なのは、プログラムカウンタ(PC)である。レジスタ、ALUは組み合わせなので動くが、PCは順序を考えなければならないのでできるか心配である。本質的に、1)次のステップでインクリメントする、2)JMPの時はアドレスを代入できる、の機能を持たなければならない。
いろいろ考えてみたのだが、結局、アドレスを保持するレジスタを2つ持っている必要があると思う。一つ目はPCレジスタそのもので、セレクタ(アドレスバスに接続するスイッチ)を一つ持つ。もう一つはIncrement(アドレスバスの値に+1する)の値を保持するINCレジスタで、これはセレクタを2つ持つ。8ビットの場合、セレクタ1個だけで2回路のリレーを4つ使ってしまうため、セレクタだけで計12個、8bitレジスタは1回路のリレー8個使うので計16個、さらにloadに計2個、Incrementはハーフアダーで1回路のリレー8個+2回路のリレー8個を使うため、PCだけで計46個のリレーを必要とする。ALU基板(44個)よりも多くのリレーを使ってしまうが、これ以上減らすアイデアを考え付かなかった。
実際には8bitフルのアドレッシングなど使わないだろうから、上位ビットのリレーを抜いて再利用すればいいだろうと思い製作にとりかかる。

ブロック図は上記の通り。JMPの際はZレジスタに退避しておいたデータをデータバス経由でアドレスバスにつないで、PCレジスタにロードする。データバスとアドレスバスをつなげるなんて??と思ったが、理屈では合ってるはず。絵ではbranchになっているが、名前はjmpにするべきだったな。
PCのインクリメントは、PCレジスタをアドレスバスに接続するとIncrementが+1してくれるので、それをINCレジスタに保持させ、次のステップでPCレジスタに転送する。うん、想定の中では動きそうだぞ。



2012年6月1日金曜日

Processor Spec.

wire wrap用のピンを使い切ったので、またチマチマwire wrap用ICソケットをばらしてピンを製造中。

ところで、最終形も(頭の中で)固まってきたので仕様をまとめると、
・8bit アドレス
・8bit ALU
・10bit データバス
最小限のCPUを考えた時、4bitだと0-15までしか扱えないのに加え、アドレスが狭くて16行しかコードを書けない。最低限、電卓のようなものをソフトウェアで実装しようとすると、最低でも6bit(64行)は必要と考え、6bitCPUで設計しだしたが、基板の実装のかっこよさから結局8bitCPUにしたのである。
1bitCPU+マイクロコードというのも考えたが、CPU内のステップが多くなるので断念した。
実際、8bitあれば0-255か、負数を考えても二桁の計算はできるし、アドレスも増えて256行まで書ける。まぁ、SRAM1bitに1リレーとしても256*10と、個人としては天文学的なリレー数が必要になってしまうが・・・

考えているインストラクション(10bit、以下1word)
'01' + data(8bit)  : data=>X register
'10' + data(8bit)  : data=>Y register
'11' + address(8bit) : address=>PC(プログラムカウンタ)、つまりJMP
'00' + instruction(8bit) : 他の命令、例えばaddとか
'00' + '00000000' : NOP  SRAMのアドレス範囲外を読んだとき、全部0になるだろうから
他は、計算結果が0なら次の命令をスキップ、Carryで次の命令をスキップを用意すれば、JMPと組み合わせて分岐が組め、最低限の命令セットが揃う。

ネット上で見つけた、似たようなアクティビティは、
MAD研究所のリレー電卓 http://www.fsinet.or.jp/~mad/
 回路図はほとんど載ってないが、細かな話が非常に参考になった。
 というかリレープロセッサをやろうと思ったきっかけ。SRAMを考えなければ、ワイヤードロジックよりCPU+ソフトウェアの方がリレーを削減できるかもと思った。
Kiの研究部屋のTD4互換リレーCPU http://www.geocities.jp/team_zero_three/index.htm
 実は昨日検索して知った。もし作り出す前に気づいたらどうしただろう・・・
 ざっと読んでみたが、やはり先駆者はすごい。
 レジスタのタイミングが問題になっているようで、非常に参考になる。

とりあえず、他はどうあれ、自分がやりたい、最低限の命令セットで最小限のリレー数で実現するプロセッサを目指すことにする。
6bitの時は、ざっと試算してリレー160個ぐらいで組めそうだった。8bitに変更したが、おそらく2割増程度だろう。ということはリレーたった200個で作れるのか?(SRAMは除いて) 4004のトランジスタ数が2300、8008が3500というからかなり効率的だ。