2012年6月21日木曜日

more relays

SRAMとアドレスレコーダを考えるとリレーが全然足りないので、覚悟を決めてあるだけ全部買って来た。1回路入り1個50セント、40円くらい。秋月より安い。ただ、入荷の予定はないそうだ。JRCと書いてるがYueging(中国)製らしい。eBayで買える中国製は色が青色なのと、サイズがでかいので実装面積の問題がある。オレンジのリレーはHeavy Dutyっぽくて好きなのだが、概して高価。というわけでやっぱり黒色。
買ってきたリレー。だんだん感覚がおかしくなってきて、200個じゃ少ないとか思ってしまう

今あるリレー数をまとめてみた。既に、結構な数を使ってしまっているなぁ。

まずはROMでインストラクションデコーダやアドレスデコーダを作り、残ったリレーでSRAMを作ろうと思う。ROM用に33/68オームのチップ抵抗を1000個ずつ買ってきた。本当は500個でいいのだが、1000個買う方が逆に安いため。また、実装用にDigikeyで6インチ角の基板を注文中。ちなみに、いろいろ探したが基板は秋葉が安い。6.5x4.5inchで20$が相場っぽいが、秋月なら400円だし。唯一6inch角のがDigikeyで11$だったのでメモリ系はこの基板で統一するつもり。これにDIPスイッチを載せられるだけ載せてROMにする(たぶん40WORD=400bit分くらい)。
最近、これに全力を傾けてるけど大丈夫かオレ?

2012年6月20日水曜日

ROM design

SRAMの1bitのコストが高い(1$?)ので、ROMも併用することを考えている。変数はRAM領域を使い、プログラム本体はROM領域に置くという、組み込みでよく見る構成だ。じゃあ、ROMのbitコストはどうなのだろう?最初、ROMでは1個のスイッチと1個のリレーが必要かと思っていたが、下記回路だとスイッチ1個と抵抗2個で実現できる気がする。間違いでした
左の抵抗分圧+スイッチが1bitセル。右のリレーがセンスアンプで、4V以上でon, 3.5V以下でoffになるよう抵抗の分圧を調整する。
真ん中のリレーはenable。ROMを読み出す前にセンスアンプをリセットするために必要。
 このままでは負論理になってしまうのでどっかで反転させる必要あり。

テストしているところ。とりあえず動いている。というわけでROMのbitセルは完全に受動部品で実現できそう。
メモリについてまとめると、
RAM: リレー2個、抵抗3個
ROM: 抵抗2個、スイッチ1個

今日はanchor electronicsで2個1$のリレーを買ってきて互換性をテストしてみた。遅延についてはわからないが、とりあえずメモリとしては互換性に問題はないようだ。

2012年6月19日火曜日

SRAM design

そろそろSRAMについて考えねばと思い、試験回路を作ってみた。
思い返してみると、昔、ひたすらSRAMの回路パターンを見続けていたが、実際に回路を作って動作させてみるのは初めてであった。
1つのリレーで選択、もう1つのリレーで保持する。CMOSプロセスのSRAMが6Tで実装されているのを考えると2リレーで実装できるのは効率的に見える。これは、W(ライト)時には直接VDDかGNDにつなげて書き換えるのに対し、R(リード)時には160オーム程度のリレーが接続され、保持リレーが影響を受けないのを利用しているためだ。したがって読み取りにバッファが必要と思われる。
bit-lineにリレーをつなげて読み出し中。保持リレーは動作し続けている。
intelがFinFETを使った0.1um2以下のSRAMを動作させている一方で、200mm2以上のセル面積のリレーSRAMに愕然とする。でかい基板でも一枚に4WORD(40bit)しか載らない。アドレス生成を考えなくても、8bit全部使うには2x10x256=5120と天文学的なリレーが必要になってしまう。そもそもアドレスバスは5bitで十分だった気がしてきた。。。

2012年6月18日月曜日

PC Controller

次はPCのコントローラを作成。ロジックは、
selPC = 1 + 2 + 3
loadPC = 3
selINC = 3 * ^jmp
loadINC = 2
selIncr = 2
数字はシーケンス番号。
これだけだとリレー3個でできるのだが、selをloadより遅延させるため、各selに対し2リレー+CRが必要になる。とりあえずR33オーム、C470uFでPCが正常動作するのを確認。遅延はもっと少なくてもいいかもしれない。


クロック、シーケンスジェネレータ、PCコントローラをつなげてPCを進めているところ。0xFFまで見守って動作を確認。ちなみに0xFFの次は0x00になる。よしよし。
PCが進むだけだが、リレーがガチャガチャ音を立てながら自動で動作しているのは結構おもしろい。

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というからかなり効率的だ。