電子ブロック工房 / デジタル回路 https://www.rad51.net/blog/mycom/ IC・トランジスタで出来たコンピューターを設計・製作するためのブログ / デジタル回路 ja Jeans CMS © Weblog http://backend.userland.com/rss https://www.rad51.net/jeans/skins/jeans/images/jeans2.gif 電子ブロック工房 https://www.rad51.net/blog/mycom/ NMOSで作った、ジョンソンカウンター https://www.rad51.net/blog/mycom/?itemid=914


トランジスターを用いた回路設計がうまく行っているように思えるので、CPUの回路全体を近々公開しようかな。]]>
デジタル回路 https://www.rad51.net/blog/mycom/?itemid=914 Mon, 25 May 2015 18:54:25 PDT ITEM914_20150525
NMOSで作ったD-FF https://www.rad51.net/blog/mycom/?itemid=913
ほぼ出来上がっているトランジスターCPUの回路に於いて、FFはすべて、DタイプFFとして実装している。そこで、D-FFをブレッドボード上に構築して、予想したとおり動作するかどうかを、実験した。

現在の所、D-FFはNMOSを用いて次の様に構築する予定である。

2015-05-02-dff.png

通常、D-FFのクロック入力は一つだけであるが、カウンターを構築する上で複数のFFが同一のクロックを用いるような構成になるため、回路の簡略化とFF同士の同期を考えて、CLKと/CLKの2つのクロック入力端子を設けてある。このFFは、2つのDタイプラッチがタンデムに接続された構成になっていて、CLKと/CLKはそれぞれ、スレーブラッチ(右側8個のNMOS)、マスターラッチ(左側8個のNMOS)に接続されている。

まずは、この回路が正常に動作するかを、ブレッドボードでテストしてみた。/QをDにつなぎ、T-FFの構成にして、入力されたシグナルの周波数が半分になるかどうかを、測定。まずは、入力周波数の測定。186.5 kHzの表示。
2015-05-02-input.png

次に、MOSFET-Nトランジスターで構成したD-FFにこのシグナルを入れて、出力側の周波数を測定。
2015-05-02-output.png
93.28 kHzの表示。ちゃんと、半分の周波数になっている。実験では、これぐらいの周波数が限界で、さらに速くすると、ちゃんと動作しなかった。トランジスターCPUの完成品では、50-100 kHzぐらいのクロックで動かすことになるだろう。

このテストでは、D-FFが10 kΩプルアップでのNMOSの構成であるのに対し、CLKと/CLKの入力部分にCMOSのNOTを用いている。従って、D-FF回路に比べると、CLK-/CLK作成回路は格段に速い動作をする。マスタースレーブ型のFFの動作を考える上で、CLK, /CLKの2つの入力が速い動作であるのは、理想的な回路構成である。しかし、設計しているCPU内では、すべての回路に10 kΩプルアップのNMOSを使用する予定なので、CLK, /CLKだけ高速動作というわけに行かない。CLKと/CLKの2つのシグナルが同時に変化していればよいが、少しズレがあるようなケースについて考えておく必要があるだろう。

CLKシグナル立ち上がりの際に/CLKシグナルの立ち下がりも同時に起これば、問題なく動作するはずであるが、このタイミングがずれてしまった場合について考える。もし、CLK=H, /CLK=Hの時間が一定以上長く続くと、2つのラッチが両方ともゲートが開いた状態になってしまい、誤作動の原因になる。他方で、CLK=L, /CLK=Lの時間があったとしても、FF誤作動の原因にはなり得ない。これは、CLKシグナル立ち下がりの際も、同様である。従って、CLK=H, /CLK=Hとなるようなことが決していないような設計にすればよいということになる。

このようなCLK, /CLKの作成のために、次のような回路を挿入することにした。
2015-05-02-clock.png

この回路の動作を、Quartus II上でシミュレーションすると、以下のようになる。CLK立ち上がり、立ち下がり、いずれの場合においても、CLK, /CLKの両方がHになることはない。
2015-05-02-sim.png

シミュレーションだけではなく、ブレッドボード上のD-FFでも、このクロック作成回路が問題なく働くことを確認した。

FFのクロック部分についてはずいぶん悩んでいて、FFを作成する場合に、同じMOSFET-Nの同じロットを用いてthresholdをそろえておいて、安定動作を計ろうかなどと考えていた。それ用に、個々のMOSFETのthresholdを測定するための回路をPICで組んで、購入したMOSFETを調べたりしていた。しかし、上記のCLK-/CLK作成回路を使えば、少々thresholdのずれたMOSFETを混在させて回路を組んでも、誤作動する心配はなさそうである。

だいぶ煮詰まってきた。そろそろ、半田付けを始めたい。少しまとまった回路(ジョンソンカウンター)を作成して動作確認を行なった後に、CPU全体の回路を公表する予定。現在の所、CPUを構成するトランジスターの数は合計で651個である。]]>
デジタル回路 https://www.rad51.net/blog/mycom/?itemid=913 Sat, 02 May 2015 19:45:56 PDT ITEM913_20150502
クロック周り https://www.rad51.net/blog/mycom/?itemid=872
2012-11-26-clk.png

デコーダー(74137)のラッチ入力と出力許可(GLNとG1)が直結で入力されている部分が微妙なのだが、ラッチの入力から出力まである程度の遅延があるはずなので、たぶんこれでも大丈夫。後で必要なら、GLNの前に遅延回路を入れるかも知れない。

シミュレーションの結果は、次のようになる。
2012-11-26-clksim.png

マシン語の命令の種類によって、4クロックから10クロック消費され、2クロックごとにY0, Y1, Y2, Y3, Y4が出力される。Y0-Y4それぞれがLになっている間バスに値が出力され、CLK22からのシグナルで、それぞれのラッチに値を入力する設計である。初期の設計では、Y0-Y4のシグナル幅が2クロックになっていたが、これを1.5クロックとすることで、瞬時ではあるものの、バスラインへの出力がかぶるようなことが無いようにした。

今のところ、タイミングはこんな風に。
Fetch code:
	Y0 CLK21: fetch code H
	Y0 CLK22: inc PC
	Y1 CLK21: fetch code L
	Y1 CLK22: inc PC

NOP:
	Y2: reset

IF C etc:
	Y1 CLK23: set skip flag
	Y2: reset

Load literal:
	Y2 CLK22: load to S register
	Y3: reset

PUSH:
	Y1 CLK23: dec SP
	Y2 CLK22: copy from register to memory
	Y3 reset

POP:
	Y2 CLK22: load to register
	Y2 CLK23: inc SP
	Y3 reset

Load to register:
	Y2 CLK22: copy to another register
	Y3: reset

Calc:
INC:
DEC:
	Y2 CLK22: load to T register
	Y3 CLK22: copy T register to another register
	Y4: reset

Jump:
	Y2 CLK22: load to PCS
	Y3 CLK22: load to PCH
	Y4 CLK22: load to PCL
	Y5: reset

PUSH PC:
	Y1 CLK23: dec SP
	Y2 CLK22: copy from PCL to memory
	Y2 CLK23: dec SP
	Y3 CLK22: copy from PCH to memory
	Y3 CLK23: dec SP
	Y4 CLK23: copy from PCS to memory
	Y5: reset

RET:
	Y2 CLK22: Load to PCS
	Y2 CLK23: inc SP
	Y3 CLK22: Load to PCH
	Y3 CLK23: inc SP
	Y4 CLK22: Load to PCL
	Y4 CLK23: inc SP
	Y5: reset
]]>
デジタル回路 https://www.rad51.net/blog/mycom/?itemid=872 Mon, 26 Nov 2012 14:02:01 PST ITEM872_20121126
プログラムカウンタ https://www.rad51.net/blog/mycom/?itemid=742
20090724-pc.png

シミュレーションも、OK。
20090724-pc-sim.png]]>
デジタル回路 https://www.rad51.net/blog/mycom/?itemid=742 Thu, 23 Jul 2009 18:38:47 PDT ITEM742_20090723
タイミング回路、再び https://www.rad51.net/blog/mycom/?itemid=741
まずできたのは、<%media(20090724-clock4.zip|以下のもの)%>。
20090724-clock4.png

回路図上のほう、ディレイを用いた部分は発信回路で、源内CAD限定。実際には、水晶発振などで置き換える。

シミュレーションの結果は、次のとおり。
20090724-sim4.png
よさそうに見える。…が、一箇所気に入らない部分がある。例えば、c3は2バイト命令の2バイト目を読むために用いる信号だが、この信号がHの間、CPUが出力するアドレスラインは安定していないといけない。メモリから命令を読む際のアドレスラインは、q4がLの間、出力される。このとき、c3の下がりは、q4の上がりよりも安定して早く行われないといけないが、ここの部分が微妙なのだ。導線がちょっと長かったり、間に入れるゲートの数が微妙に違ったりすると、メモリでデータを読む際にq4の上がりがc3の下がりよりも早く行われるかもしれない。こうなると、メモリの内容を正確に読むことができなくなる。

そこで改良を加えたのが、<%media(20090724-clock5.zip|次の回路)%>。
20090724-clock5.png
シミュレーションの結果は、以下のようになる。
20090724-sim5.png
ディレイ回路をうまく作るのは、後々経験や実験が必要になるだろうが、タイミング回路の設計としてはこれでよさそう。

各クロックの実際の使用例としては、例えばCALL命令の場合、

c1: 命令一バイト目読み出し
c2: PC(プログラムカウンタ)のインクリメント
c3: 命令二バイト目読み出し
c4: PCのインクリメント
c5: PCのメモリへの書き込み(上位バイト)
c6: SP(スタックポインタ)のデクリメント
c7: PCのメモリへの書き込み(下位バイト)
c8: SPのデクリメント

となる。q4がLの間、PCの内容がアドレスラインに出力され、q4がHの間、SPの内容がアドレスラインに出力される。ディレイの長さとしては、もしクロックを1 MHzとした場合に、100-200 nsが妥当だろう。これくらいの長さがあれば、手に入るSRAMの書き込み速度などと比較して問題なさそうである。実際には20ns辺りがしきいらしく、そうなるとクロックは5 MHzから10 MHzまで上げられることになる。]]>
デジタル回路 https://www.rad51.net/blog/mycom/?itemid=741 Thu, 23 Jul 2009 13:04:05 PDT ITEM741_20090723
レジスター3つ https://www.rad51.net/blog/mycom/?itemid=453 test

cs
コードセグメントレジスタ。インクリメント機能を搭載していて、これはインデクッスポインタからのキャリーオーバーがある時にのみ、実行される仕組み。データのロードも可能。


ip
インデックスポインタ(プログラムカウンタ)。コードセグメントと殆ど同じだが、インクリメントは必ず行われ、キャリーオーバーシグナルを送出するようになっている。


sp
スタックポインタ。インクリメントとデクリメントの両方が可能。データのロードも出来る。]]>
デジタル回路 https://www.rad51.net/blog/mycom/?itemid=453 Sun, 14 Oct 2007 21:11:51 PDT ITEM453_20071014
タイミング回路 https://www.rad51.net/blog/mycom/?itemid=452
timing4
timing4

このタイミング回路を、命令ごとに制御するための回路が下の通り。

test]]>
デジタル回路 https://www.rad51.net/blog/mycom/?itemid=452 Sun, 14 Oct 2007 21:04:27 PDT ITEM452_20071014
クロック周り4 https://www.rad51.net/blog/mycom/?itemid=399 前と同じ)。
sp++/sp--を修正
シミュレーションもOK。これで、この部分は完成かな?]]>
デジタル回路 https://www.rad51.net/blog/mycom/?itemid=399 Tue, 24 Jul 2007 13:07:48 PDT ITEM399_20070724
クロック周り3 https://www.rad51.net/blog/mycom/?itemid=397 ip++
ここで、問題が発覚。ipレジスタのやり取りをするジャンプ系命令の実行の際、上記のip++信号が下がるときと、命令実行信号の立ち上がり(ipレジスタへの代入をトリガー)が同じタイミングで起こる。ICの性質によっては、2回のトリガーが重なって、1回だけのトリガーになってしまう可能性がある。ip++ のあと、一呼吸してから ip 代入命令を実行すればよいのであるが、もともとジャンプ系の命令はすべてダブルクロックで実行されるので、この辺りの設計を変えなければならない。

そこで、ダブルクロック命令の実行の際は、1回休んでから命令の実行を開始することにした。したがって、ダブルクロック命令の実行には、3クロック消費されることになる。


新しいクロック回路
一番下の回路がそれで、FFを一つ追加して、実行を遅らせることにした。また、ck3をベースにしたexec 信号の生成が3番目・4番目のFF(同様にck3をクロックとして用いている)からのシグナルを基に作成されているのが気持ち悪かったので、少し早めのck2を利用しているRead1st信号を利用したFFを一つ追加してそのシグナル(eOK)を使うことにした。なお、2byte' 信号は1バイト目のレジスタの保存データではなく、1バイト目を読み出すときのデータライン由来。

exec周りは、次のとおり。
実行信号生成

シミュレーションの結果は、このとおり。前回の回路と違い、Prep4Exec2 が上がるときには、Prep4Exec は上がらないようになったので、注意。

(追記)ダブルクロックの際、push/pop 命令で sp--/sp++ が一回余分に出るので、直さないといけない。]]>
デジタル回路 https://www.rad51.net/blog/mycom/?itemid=397 Mon, 23 Jul 2007 19:31:49 PDT ITEM397_20070723
クロック周り2 https://www.rad51.net/blog/mycom/?itemid=395 先日のクロック周りの回路をさらに拡張していくうちに、スパゲッティの様な回路になってしまった。もしかしたらうまく働くのかもしれないが、おそらく誤作動するだろう。

源内CADの使い方にも慣れてきたので、一から作り直すことにした。今回の回路は、systematic に仕上がっているので、拡張性が高くバグの混入の可能性も低いと思われる。新しいタイミング回路のメイン部分は次のとおり。
クロック回路・メイン部
上の回路は、水晶発信からのシグナルを4つのクロックに分解する部分。2つ目のFFのデータ入力部に、AND回路を入れた。これを入れなかった前の回路は、リセットスイッチを押したときの水晶発信からのクロックが1か0かによって、誤作動する可能性があった。

真ん中と下の回路は、それぞれ、2バイト・3バイト命令の制御と、1つの命令で2回のクロックが必要な場合の制御。シンプルな回路に収まった(ラインecは、命令実行トリガー;記事の続きを参照)。

次に、命令読み取りのタイミング用回路。
読み取り
Prep4Read が1のとき、[ip]の内容をメモリからデータラインに呼び出し、Read1st, Read2nd, Read3rd の立ち上がりで、データラインの内容を3つのレジスタ(74174で作成)に保存する。記事を書いていて気が付いたが、まだ ip++ 信号がない。作成しなければならない。

命令実行回路。
命令実行用
Prep4Execが1の時、データラインを実行用に準備する。さらにPrep4Exec2も1の時は、2つ目の命令の実行準備。ここで行うべき命令の内容は、上で述べた3つのレジスタに保存されている。Exec の立ち上がりで、命令を実行する。

スタックポインタのinc/dec用回路。
スタックポインタの処理
push/pop命令の際の、sp のアップダウン用のクロックを作成する部分。

シミュレーションの結果はこのとおり。以下の命令を、順にシミューレートしてみた。

1)1バイトpush命令
2)2バイトpush命令(push の使用予定なし)
3)3バイトpush命令(push の使用予定なし)
4)1バイトpop命令
5)1バイト・2クロックpop命令(ret 命令など)
6)2バイト・2クロックpush命令(call 命令など)
7)3バイト・2クロックpush命令(call 命令など)

なお、マルチバイト・ダブルクロックのpop命令は使えない(sp++ シグナルが余分に発生する)ので注意。]]>
デジタル回路 https://www.rad51.net/blog/mycom/?itemid=395 Mon, 23 Jul 2007 15:36:24 PDT ITEM395_20070723