コンピューター・アーキテクチャを調べる

Implementing a One Address CPU in Logisim」の1.2Comparisons of Computer Architecturesの学習メモです。アドレスについては、http://news.mynavi.jp/column/architecture/115/が日本語の短い資料で分かりやすかったです。

wikipedia – 命令(コンピュータ)

0-Addressアーキテクチャ(0アドレス命令方式)

ALUはオペランドスタックから2つのオペランドをPOPし、演算結果をPUSHします。いわゆるスタックマシンです。例えばADD命令の場合、加算する対称はスタックの先頭とその次と分かっているので、オペランドが必要ありません。

JavaのJava Virtual Machine、.NET Common Language Runtime(CLR)が0-address(スタック)アーキテクチャを採用している。

One-Addressアーキテクチャ

Accumulator(AC)を持つ所謂レジスターマシン。ADD命令の場合、ADDI 5なら、Accumulator + 5 を計算し、計算結果を、Accumulatorに保持します。

アキュムレーター・アーキテクチャとも言います。Intel 8080、PDP-8

Two/Three-Addressアーキテクチャ

two/three-address load/store computer

3-address program

演算結果のレジスターを指定可能。

PowerPC、SPARCなどのRISC系でよく使われる。

2-address program

演算結果のレジスターは、オペランド入力で使ったレジスター。この場合は$R0

Intel/AMD x86アーキテクチャで使われています。

Von Neumannアーキテクチャは、プログラムとデータが同じメモリ上にあり、ハーバード・アーキテクチャは、プログラムとデータが別々にあります。ハーバード・アーキテクチャはAVRやPICなどで使われています。


Implementing a One Address CPU in Logisimを斜め読み

以前見つけた「Implementing a One Address CPU in Logisim」をちょっと読んでみたのですが、以下のような内訳でした。

50ページのおおよその内訳

目次や前書きが9ページ

  1. イントロダクション (9ページ)
    1. CPUの基本コンポーネント
    2. コンピュータ・アーキテクチャの比較
    3. フォン・ノイマン、ハーバード アーキテクチャ
  2. アセンブリ言語 (9ページ)
  3. マシン語 (3ページ)
  4. アセンブラープログラム (13ページ)
  5. CPU実装 (5ページ)

英語がダメでもなんとかなる資料

最初、50ページの英語は大変そうに感じたのですが以外に何とかなりそうです。

この50ページの資料は、最初の9ページは前書きや目次なので、実質41ページの資料です。また4章「アセンブラープログラム」はツールの使い方の画像チャプチャーの13ページなので、ちゃんと読まなければいけない英語は30ページになります。

実はこの30ページも、最初の1章、8ページはデジタル回路の基礎なので、日本語の入門資料で勉強してしまえば何とかなります。よって22ページを頑張って読むことになります。アセンブリ言語を設計し、それをマシン語にして、さらに回路で動かす事を説明しているので何回も読み返す必要はありそうですが、Google検索でいろいろな資料を参考にしていけば、出来ないボリュームではありません。

残りはLogisimでのCPU実装ですが、この5ページの英語の資料は、頑張って英語を読んで、各コンポーネントを自分で小さくしてLogisimで動きをみたりすると大丈夫そうです。


論理回路シミュレータlogisimで7セグメントデコーダ作成

logisimで1個の7セグメントディスプレイを表示する回路を作成しました。Google検索すると、それぞれ出力ピンの計算式が合ったので(参考資料)、それを入力して回路を自動生成しました。まずはLogisimで実際に動作させることができたので、真理値表から計算式やカルノー図を書けるようにする必要もありそうです。

7セグメントデコーダ!

出力ピンの式

a = A + C + B D + ~B ~D

b =  ~B + ~C ~D + C D

c = B + ~C + D

d = ~B ~D + C ~D + B ~C D + ~B C + A

e = ~B ~D + C ~D

f = A + ~C ~D + B ~C + B ~D

g = A + B ~C + ~B C + C ~D

回路図のダウンロード

http://hajimete-program.com/logisim/7SegmentDecoder.circ

これでひとまず、BCD(Binary Coded Decimal)というものが、単純に2進数を10進数に変換する事というのが分かりました。また4bitだと10から15を使わないようです。1桁の7セグメントディスプレイが、2進数4bitで表現できたので、今度はこれを複数繋げる方法を調べていきます。

論理回路シミュレータlogisimで簡単なデコーダ作成

フリップフロップ回路を繋げることで2進数をカウントできるようになったので、7セグメントディスプレイに表示しようと考えたのですが、2進4bitは、0-15までカウントできます。なので、7セグメントディスプレイ1つでは表示できません。

いろいろ調べていくとカウンターを10進カウンターやBCDという仕組みがあることが分かってきました。いきなりそれでカウンターを作り7セグメントディスプレイで表示するのはまだ難しいので、まずは単純なデコーダやBCDなどの回路をつくっていきます。

2-4デコーダ

何に使うのか分かりませんが、2桁の2進数を4桁に変換するデコーダです。NOT回路とAND回路だけで処理も少ないので仕組みがすぐ理解できます。

2-4デコーダ

この回路図を見たときは、なんでこんなもの必要なんだろうと思っていたのですが、実際に作っていてすぐメリットに気付けました。各出力にLEDを繋げてみると単純なデコーダで、視覚的に表示できることが分かりました。

LEDを付けると2進数の表示に使えるのが分かる!

3-8デコーダ

私ぐらいの入門レベルで組み合わせ回路のデコーダを検索すると3入力のデコーダの情報が出てきていまいちその理由が分かりませんでしたが、2-4デコーダを踏まえるとすごく理解しやすいです。2進数3桁を8本で出力するという意味ですね。

2進数N桁の入力を2^Nで出力するデコーダのようです。

http://www.lab3.kuis.kyoto-u.ac.jp/~ktakagi/le3a/primitive_circuits/index.html

http://www.am.ics.keio.ac.jp/parthenon/tips/3-8%E3%83%87%E3%82%B3%E3%83%BC%E3%83%80.pdf

真理値表

 

まとめ

2-4デコーダ、3-8デコーダを回路シミュレーターで実際に作成してみました。小さな回路を実際に作ってみると、自分が何が分かっていないのかが明確になり、この応用として7セグメントディスプレイ用のデコーダも作成できそうです。