電子ブロック工房:2007年 04月の記事

CPUのスペック案2 [CPU]

2007年4月30日

 モトローラ型で設計すると、手作りのCPUとしては現実的な構造になることが分かった。

メモリ空間は、1ワード8ビットでアドレス16ビットの、合計65536バイト。

レジスタはすべて8ビット:

A1レジスタ 演算用
A2レジスタ 演算用
B1レジスタ メモリアクセス用
B2レジスタ スタック用
Z レジスタ 各種代入・演算結果保持・ジャンプ用
IPレジスタ 実行位置
CSレジスタ 実行セグメント指定
DSレジスタ データセグメント指定
SSレジスタ スタックセグメント指定

フラグ(FLレジスタ)は、ゼロフラグ(Z)およびキャリーフラグ(C)の二つ。

クロック信号と各種イベントのタイミング:
clock 1   clock 2   events
-----------------------------------------------------------------
   0         0      decrement b2 register (for push)
                    prepare environment for reading command
   1         0      read command from memory
   0         1      prepare environment for command
                    increment IP
                    increment b2 register (for pop)
   1         1      do the command
注)clock2が0の時はCS:IPがアドレスラインに、1の時はDS:B1もしくはSS:B2がアドレスラインに接続される。

アセンブラで円周率を求める [シミュレーション]

2007年4月30日

16ビット長の変数で円周率が 3.1416 まで求められることが分かったので、アセンブラで計算してみた。インテル 80386 系は、レジスタが32ビット。16ビットどうしの乗算を行っても、結果が32ビット内に収まるので、比較的容易にアセンブラで書ける。

円周率を求めるのに、何ビット長の変数が必要か [シミュレーション]

2007年4月29日

表題の問題を解くために、1ビット長から19ビット長までの整数型を仮定し、円周率を求めてみた。

モンテカルロシミュレーションで円周率を求める [シミュレーション]

2007年4月29日

矢は円の内側?

モンテカルロ法で円周率を求めるアルゴリズムはいたって簡単。-1 から 1 までの乱数を、x, y として用意し、図のように点(x,y)と座標の原点までの距離が1以下であれば円の内側だとみなされる。ピタゴラスの定理より、単に

x*x + y*y

の値が1より大きいか小さいかを求めればよい。これを何回も繰り返せば、円の内側に点が入る確率が求まる。その確率を p とすると、外側の正方形の面積が4であるから、円周率は次のように得られる。

π = 4 * p

とりあえずの目標:どんな計算をさせるか [一般的なこと]

2007年4月28日

さて、自作コンピューターが完成すればどのような計算をやらせるかを考えておく必要があるだろう。何をやらせるかを決めないと、設計図が仕上がらない。

 簡単すぎてもいけないし、難しすぎてもいけない。例えば、2進数一桁の足し算をやらせるだけならば、簡単なデジタル回路を制作するだけでよい。逆に、今作ろうとしている自作コンピューターでインターネットに接続することは、ほとんど不可能である。絶対に不可能であるとは言わないが、最初の目標としては高すぎる。

 その中間として、円周率を求めることを目標にしたい。アルゴリズムとしては、モンテカルロシミュレーションを用いる予定である。これには、精度の良い乱数と、乗算を求めるプログラムが必要である。

ニーモニック表 案2 [CPU]

2007年4月28日

代入命令について、すべてZレジスタを介するようにしてみた。

ニーモニック表 [CPU]

2007年4月27日

演算命令
INC A
DEC A
INC B
DEC B
INC C
DEC C
COMP A,D
ADD A,D (結果は、Zレジスタに入る)
NOT A (結果は、Zレジスタに入る)
NOT D (結果は、Zレジスタに入る)
AND A,D (結果は、Zレジスタに入る)
OR A,D (結果は、Zレジスタに入る)
SHL A (上位ビットにCF2を使いシフト。下位ビットはCF1へ)
SHR A (下位ビットにCF2を使いシフト。上位ビットはCF1へ)

ジャンプ命令
JMP (ジャンプ先は、Jレジスタの値)
JZ (ジャンプ先は、Jレジスタの値)
JNZ (ジャンプ先は、Jレジスタの値)
JC (ジャンプ先は、Jレジスタの値)
JNC (ジャンプ先は、Jレジスタの値)
LOOP(ジャンプ先は、Jレジスタの値)
JMPF(MOV CS,Z 及び MOV IP,J)

CPUのスペック案 [CPU]

2007年4月27日

レジスタは8ビット、メモリ空間の1ワードは4ビットの変則型にしようと思う。メモリ空間は、16ビットのアドレス指定で64Kワード(32Kビット)。CS・DSを用いたセグメント指定により、256ワードごとに空間を分割して使用する。

Aレジスタ(8ビット) - 演算用
 上位4ビット:AHレジスタ
 下位4ビット:ALレジスタ

Bレジスタ(8ビット) - メモリアドレス指定用
 上位4ビット:BHレジスタ
 下位4ビット:BLレジスタ

Cレジスタ(8ビット) - カウンタ
 上位4ビット:CHレジスタ
 下位4ビット:CLレジスタ

Dレジスタ(8ビット) - 演算補助
 上位4ビット:DHレジスタ
 下位4ビット:DLレジスタ

Jレジスタ(8ビット) - ジャンプ先指定

Zレジスタ(8ビット) - 代入および演算結果格納
 上位4ビット:ZHレジスタ
 下位4ビット:ZLレジスタ

Fレジスタ(4ビット) - フラグ格納用
 CF1(キャリーフラグ)
 CF2(シフト・ローテート用フラグ)???
 ゼロフラグはない(Zレジスタがゼロフラグを兼ねる)
 サインフラグはない(Zレジスタ上位1ビットがサインフラグを兼ねる)

IP(8ビット) - 命令実行位置

CS(8ビット) - コードセグメント

DS(8ビット) - データセグメント

最初の設計では、インテル型にしてみた。スタックの実装は、とりあえず先送りにする。

ROM [デジタル回路]

2007年4月27日

ROM

フリップフロップ [配線]

2007年4月27日

flip flop
1ビットあたり、7400 を一つ、MOSFET を一つ、ダイオード2つ、抵抗を一つの設計。

この回路は、4/26の2つの回路の折衷案。フリップフロップ部分と入力の選択に7400を、出力の選択にMOSFETを用いている。
<<前の記事