Implementing a One Address CPU in LogisimのCPU実装を調べる5 複製してみる

これまでの作業で「Implementing a One Address CPU in Logisim」のアセンブリ言語と回路図がすべてわかりました。最後に同じ回路を作ってみます。

各ソフトウェア

このドキュメントで使っている各ソフトウェアは、Charles Kannさんのサイトhttp://chuckkann.com/joomlaMain/index.php/2016-05-09-22-19-35/one-address-cpu からダウンロードできます。

自分でCPUを作ってみる

ただ教科書を読むだけでなく、実際に全部作ってみると、どこを理解していないか確認できるので、実装してみます。

CPU全体

マシン語を実行して0005+0002=0007の実行後のループ(=halt)状態

ALU

ALUは、加算、減算のみです。Overflowフラグを用意するため15bitの桁上がり(Carry Out)と16bitの桁上がりのどちらかがある場合をOverflowにします。Logisimに付属している加算器ICは、ビット数は変更できますが、Overflowフラグの出力ピンはありません。そのため15bit加算器と、1bit加算器をそれぞれ計算して、あとで繋げることで16bitの加算にしています。

なぜ15bitと1bitに分けるかですが、最上位ビットは正負のビットなので、正の数の場合は15bitで表し16bitになる場合は桁上がりです。また負の数は最上位ビットを1にして、17bitになったら桁上がりです。そのため、Overflowフラグは、15bitと16bitの桁上がりを確認する必要があります。

16bitの演算となると、ワイヤーがとても面倒なのが分かりました。

Control Unit

制御装置は、入力のInstructionで、各装置(=各IC)をOn/Offする信号を送るだけなので単純な回路です。

Sign Extend

8bitを16bitに拡張する回路図です。

 

ダウンロード

http://hajimete-program.com/logisim/one.circ

まとめ

今回、回路シミュレーターLogisimと「Implementing a One Address CPU in Logisim」でCPUを作ってみました。気付いただけでも回路図は抵抗やコンデンサーなどもないし、順序回路FlipFlop回路も動作しないし、出来たCPUは加算器と減算器しかないし、実物で動作できないし…と課題は沢山あります。

ですが、今回CPUを作成するまで多くの発見がありました。

  • 回路シミュレータは、トライアンドエラーがやりやすい
  • 初心者でも失敗を恐れずに試せる
  • 論理回路を小さく作ってみて、そこから大きくしていくプログラミングと同等な感覚が分かった
  • アセンブリ言語(仕様)を作るという事はCPUを作る事
  • よく図解されているCPUの基本構成の制御装置、ALU、レジスター、PC、メモリーなどが理解できた。
  • アセンブリ言語の分岐は、if文でありfor文である。

また、50ページ教材で、CPUの論理回路とアセンブリ言語の実装を学べたのは非常に有意義であるとともに、複雑なものを複雑なまま学習していることが多いと感じさせられました。


Implementing a One Address CPU in LogisimのCPU実装を調べる4 ControlUnit

今回は、「Implementing a One Address CPU in Logisim」CPU-MainというCPU全体が書かれている回路図の制御装置(Control Unit)の作りを見ていきます。

各ソフトウェア

このドキュメントで使っている各ソフトウェアは、Charles Kannさんのサイトhttp://chuckkann.com/joomlaMain/index.php/2016-05-09-22-19-35/one-address-cpu からダウンロードできます。

制御装置(CU=ControlUnit)とは

CPUの制御装置は、マシン語の命令に従って、回路のワイヤーのON/OFFをします。このCPUの命令フォーマットは以下の16bitフォーマットになっています。

下位8bitはデータメモリーまたはALUに送られて、即値なら加算減算に使い、アドレスならそのメモリーのデータを参照します。

8-11bitのALUOptは、ALUの入力になります。ALUはこの値から加算か減算のどちらかの演算処理を選択します。

最後12-15bitは、OpCode(オペコード)で制御装置に渡され、この値により各ワイヤーのON/OFFを行います。以下がマシン語の命令に対する各ワイヤーのON/OFFの一覧表です。

Operation OpCode WriteAc ALUSrc ClrAc MemWr Beqz
 即値命令  0x1  1  1  0  0  0
 メモリー命令  0x2  1  1  0 0  0
 クリアレジスター(clac)  0x3  1  x 1  0 0
 ストア(stor)  0x4  0  x  x  1  0
 ゼロジャンプ(beqz)  0x5  0  x  x  0  1
CPU Arithmetic Subsection

例えば、数字の5を足し算をする場合、表の一番上の行の「即値命令」になります。この時は、以下のように複数の回路を有効化、無効化します。

  • 制御装置にOpCode(オペコード)0x1を渡す。
  • WriteAC=1にしてAC(Accumulator)を有効化
  • ALUSrc=1にして、[Select ALU Input]マルチプレクサーをデータメモリーではなく、数字5を使うように切り替え
  • ClrAC=0にして、AC(Accumulator)の入力を、ALUからの出力に切り替え
  • MemWr(Memory Write)=0にして、データメモリーを書き込めないように無効化
  • Beqz(Branch if equal zero)=0で、分岐処理の回路を無効化

制御装置の実装

制御装置は、先ほどの一覧表示に従ってOpCodeが入力されたら、それに対して各回路を有効または無効にしているだけです。以下は即値命令(0x01)時の制御装置の状態です。デコーダー(Decd)にInstructionの上位ビット0001=0x1が入力として渡ってきます。OpCode=0x01の場合は、WriteAC=1、ALUSrc=1なので、ワイヤーをうまくつないで、表と同じようにしています。

OpCodeをデコーダーで判別

デコーダーが回路が分かりづらければ一度、以下のような簡単な回路を作ってみて動かしながらやってみると、理解できると思います。

小さなデコーダー回路を作ってみる

 

まとめ

今回は、制御装置を調べてみました。制御装置は各ワイヤーまたは回路をON/OFFする機能でした。OpCodeからデコーダーでON/OFFを切り替えるだけなので回路は単純ですが、どのようにOpCodeを設計して、どの回路があるかを把握していなければなりません。このCPUのドキュメントのように必ず表を作っていくとよさそうです。


Implementing a One Address CPU in LogisimのCPU実装を調べる3 Execution Path Subsection

今回は、「Implementing a One Address CPU in Logisim」CPU-MainというCPU全体が書かれている回路図の作りを見ていきます。

各ソフトウェア

このドキュメントで使っている各ソフトウェアは、Charles Kannさんのサイトhttp://chuckkann.com/joomlaMain/index.php/2016-05-09-22-19-35/one-address-cpu からダウンロードできます。

今回は、Execution Path Subsectionを見ていきます。

複雑そうだが…

はじめてこの回路図を見たときは、こんなの分からないと思ったものですが、毎回小さな回路を自分で作り直しているうちに、単純な回路だとわかりました。ポイントは、画像中央のPCが何をしているかです。

PC=Program Counter(プログラムカウンター)とは、現在プログラムの実行している場所を示しています。言い換えると、現在実行しているプログラムメモリーのアドレスを指しています。

回路が起動したときは、PC=0000 0000 にして、クロックが動き続ける間、1を足していきます。つまりプログラムメモリーのアドレスを0001、0002と増やしていくだけです。

加算回路とレジスター

カウンター回路

まずは、1を加算するカウンター回路です。加算器(Adder)とレジスターのみです。加算器は、レジスターから受け取った値0と1を足して、結果1を出力します。その出力1は、レジスターの入力なので、レジスターに保持され、さらにレジスターから1が出力されます。

次は、

加算器は、レジスターから受け取った値1と1を足して、結果2を出力します。その出力2は、レジスターの入力なので、レジスターに保持され、さらにレジスターから2が出力されます。

というように加算が続きます。

このカウンターにRAMを付けると?

先ほどの加算器とレジスターを使った、1を足しているカウンター回路の出力先に、RAM回路の入力A(Address)を付けると、メモリーの位置を移動している事になります。下記のがどうだと、Clearボタンを押したときに、レジスターが0にリセットされて、それが出力されるので、RAMのアドレス0番地を指すようになります。

現在、RAMに00だけしか書かれていませんが、ここにマシン語を入れておけば、その指示したアドレスの値をRAMは出力ピンDから出力します。

また、アドレスを0,1,2,3,4と動かすほかに、任意のアドレスに移動したい場合は、上記のようにマルチプレクサーと、切り替え信号を用意して、レジスターの入力を切り替えればよいです。

任意のアドレスの移動

beqz(Branch-if-equal-zero)回路

RAMはカウンター回路が動いている間、1,2,3…と移動アドレスを指示していきます。このCPUで任意のアドレスに移動する場合は、ALUの値と0を比較して同じで、かつ、マシン語でbeqz命令が送られてきた場合に、両方を満たしているので、AND回路から1が出力されます。マルチプレクサーは、これを分配の信号として使います。

RAMが出力したデータと分配

RAMから出力されたデータはマシン語で以下のフォーマットです。

16-bit machine instruction formatとなっています。

  • 4-bit Op Code
  • 4-bit ALU Opt
  • 8-bit Immediate or Address

よって、上位8bitのOpCodeとALUOptは、制御回路(Control Unit)の入力になり、下位8bitの即値またはアドレスは、データメモリーとALUに渡されます。

まとめ

このCPUのほとんどの回路図を見てきただけでなく理解できました。あとは制御装置(Control Unit)だけです。制御回路も簡単な回路で、この回路がどのような命令があって何をしたいのかを理解すれば、問題ありません。

次回は、制御装置の回路図を見ていきます。


LogisimのPlexersの使い方とInclude Enables?属性

Logisimではあらかじめ用意されている回路の属性に[Include Enables?]という項目があり、これをYesにすると、その回路を有効または無効化できる1bitの入力ピンが用意されます。デフォルトでは[Include Enables?]はYesになっているのでこの入力ピンが表示されています。Plexersの中では、Multiplexer、Demultiplexer、Decoderが[Include Enables?]を持ちます。

設定方法

設定方法は、Logisimで回路を選択すると属性情報で表示できます。[Include Enable?]が見えるので、この値をNoにすると、ピンがなくなり、回路は常に有効になります。

何故このような仕組みがあるのか?

デジタル回路の勉強をはじめたときは、AND回路やOR回路を繋げてLEDを光らせたりするだけなので、1bitを流して有効化無効化する意味があまり分かりませんでした。ですが、CPUなどのように回路が大きくなってくると、加算処理の時はこの回路は動作させなくない、またはRAMからデータを取得するときはこの回路は動作させたいなど、操作によって使う回路が異なってくるのが分かりました。この時切り替えるスイッチが欲しいのですが、それを行うのがこの[Include Enables?]の入力ピンでした。

Plexers回路のおさらい

Logisimに標準であるPlexers回路を使って簡単な回路図を作成しておさらいします。

Bit Selector

その名の通り、複数ビットから1bit選択するときに使います。属性を変更すれば、n-bitの選択も可能です。

4bitの入力信号から、選択して1bit出力

Multiplexer

2つの入力ピンから選択信号で、どちらかを選んで出力します。また[Include Enables]属性がYesの場合は、この回路の有効無効を切り替えられます。以下の画像では、右下の「0で回路停止」の入力ピンを1にしているので、この回路が有効化され動作しています。

マルチプレクサーは、2つの入力のいずれかを選択

Demultiplexer

デマルチプレクサーは、マルチプレクサーの反対で、選択信号で、2つの出力ピンのどちらかを選んで出力します。

デマルチプレクサーは、2つの出力のいずれかを選択

Decoder

デコーダーは、n-bitの入力をそれぞれ異なる出力に流すことができます。

まとめ

回路の[Include Enables]属性の使い方とLogisimのPlexers回路をおさらいしました。マルチプレクサーやデコーダーなどで入力と出力をまとめたり分けたりできます。

これの応用としては、以下のように、1つの信号で、様々な回路を有効化無効化する制御装置(Control Unit)があります。

  • 0001信号の場合は、加算処理時の複数回路を有効にして、他の回路をすべて無効。
  • 0002信号の場合は、レジスターの値を確認して、0なら、プログラムカウンターを動かす。そのための回路のみを有効化し、他の回路は無効化。

Implementing a One Address CPU in LogisimのCPU実装を調べる2 Arithmetic Subsection

今回は、「Implementing a One Address CPU in Logisim」CPU-MainというCPU全体が書かれている回路図の作りを見ていきます。

各ソフトウェア

このドキュメントで使っている各ソフトウェアは、Charles Kannさんのサイトhttp://chuckkann.com/joomlaMain/index.php/2016-05-09-22-19-35/one-address-cpu からダウンロードできます。

CPU全体の回路図は、区切りなどがありませんが、大きく2つに分けることができます。1つは算術とデータメモリーの入出力管理をするサブセクションです。もう一つは、プログラムの実行パスを制御するサブセクションです。

まずは、全体を把握するのではなく、Arithmetic Subsectionを見ていきます。

Arithmetic – 算術部分

上記の画像を見ると、レジスターやROMやALU、SignExtend、マルチプレクサーなどがあり複雑に見えますが、やっていることは凄く簡単で、Arithmetic算術は、ALU(Arithmetic Logic Unit)がポイントになります。

シンプルにすると以下のような感じです。

 

上記の回路では、RAMもレジスターも結局はデータを保持するもので大きいか小さいかの違いなので、シンプルにレジスターを2つにしました。これが加算器につながっています。今回のCPUでは、演算の入力を2つとり、結果を1つ返します。よって加算は以下のようになります。

入力A + 入力B→出力D

また、出力Dは、その後レジスターの入力となるので、以下の形になります。

入力A + 入力B→入力A

つまり加算結果はレジスターに保持されます。クロックが動作している間、この回路は動き続けるので、入力Bの値である1がどんどん足されていき、レジスターにその結果が表示されます。

数値0でリセットしたい場合や、メモリーの情報ではなく即値を使いたい場合は、マルチプレクサーを使って切り替えます。次は、マルチプレクサーも小さな回路で見てみましょう。

小さなマルチプレクサーとレジスターの回路を切り出す。

CPU回路を理解するために、以下の簡単な回路を作成しました。

入力を切り替えると、レジスターと出力ピンの値が1111また0000になる

4bitの入力データ(1111または0000)をマルチプレクサーで切り替えて、入力された4bitデータはクロックが立ち上がる(=線が明るくなった)タイミングでレジスターへ格納されます。またそのデータは、レジスターの出力ピンQから、出力ピン(一番右の4bit)に渡されます。

MUXと書かれている台形記号が、マルチプレクサーで、下についている切り替え信号で、入力されたものを切り替えられます。0で、入力ピンの1111、1で入力ピンの0になります。

またレジスターは、レジスターの左下のピンに0または1を入れると、無効または有効に切り替えることができます。これによりレジスターが動いていない状態できます。

レジスターを0で無効にしているので、入力を切り替えてもレジスターは動作しない。

LogisimのRAM回路を使う

RAMも小さな回路を作ってみると、単純なメモリーなのでアドレスを指定して書き込むか読み込むかのどちらかだけなので簡単です。レジスターと同様にクロックの立ち上がりで動作するので、クロックを用意します。またいくつかRAM用のピンがあります。

str: (store)0で入力データが書き込めなくなります。

sel:0でRAM自体が無効になります。

ld: (load)0で、出力ができなくなります。

RAMの入力用(STORE)Dピンと出力用(LOAD)Dピンの表示方法

logisimに用意されているRAMコンポーネントを選択して属性の[Data Interface]を[Separate load and store ports]にすると、上記画像のように、データ保存用のDピンと、データロード用のDピンが用意されます。初期設定では1つなので、初心者のうちは2つのDピンを使ったほうがやりやすいと思います。

 

まとめ

一見複雑そうな回路も、似たような小さな回路を作ってみると、それが組み合わさったものというのが分かります。プログラミング言語の場合は、関数やクラスなどで明確に分かれますが、回路図の場合は、うまくサブサーキットを作るようにしたりするとよいのかもしれません。

次回は、Execution Path Subsectionをみていきます。

 


Implementing a One Address CPU in LogisimのCPU実装を調べる1ALU

Implementing a One Address CPU in Logisim」は最後の5ページで、Logisimで作成したCPU実装の解説をしているので実際にこのCPUを動かしてみながら、回路図を調べていきます。

各ソフトウェア

このドキュメントで使っている各ソフトウェアは、Charles Kannさんのサイトhttp://chuckkann.com/joomlaMain/index.php/2016-05-09-22-19-35/one-address-cpu からダウンロードできます。

5.2 The ALU

ALU(Arithmetic Logic Unit)は、加算減算をサポートします。またOverflowフラグも持っています。16bitのIntegersのサイズは、-32768から32767なので、27000+25000=52000や、-27000+-25000=-52000の場合、桁あふれが発生します。

このCPU作成とは別に、「論理回路シミュレータlogisimで加算回路」で詳しく加減算回路を書きました。これで加算回路に減算を追加する方法が分かります。

オーバーフローフラグの注意点

http://www.c-jump.com/CIS77/CPU/Overflow/lecture.html

桁あふれの場合に何故、15bit目のCarryOutと16bit目のCarryOutをとってXORで桁あふれフラグを用意するかですが、最上位ビットは正負のフラグなので、正数の場合、16bitは0で、15bitどおしの計算になります。この時、桁あふれを起こしたら15bitの演算結果でCarrayOutが出力されます。一方負の数の場合は、16bitを使って表現するので、16bit目のCarryOutが出力されます。

符号付き計算の場合は、16bitのCarryOutだけではなく、15bit目も見る必要があります。

4bit加算器

いかに4bitの加減算回路を作成し、計算結果の3bit目と4bit目のXORを取得しオーバーフローフラグを確認してみました。

+7(0111) + +1(0001) = +8(1000) 桁あふれ

 

-8(1000) – +1(0001) = -9(0111) 桁あふれ
-8(1000) + +7(0111) = -1(1111) 桁あふれ無し

ALUは16bit幅なので、ワイヤーが多く戸惑いますが、実際には上記のような4bit幅で作れる回路を16bit幅にしただけです。


Implementing a One Address CPU in LogisimのCPU実装を調べる1符号拡張

Implementing a One Address CPU in Logisim」は最後の5ページで、Logisimで作成したCPU実装の解説をしているので実際にこのCPUを動かしてみながら、回路図を調べていきます。

各ソフトウェア

このドキュメントで使っている各ソフトウェアは、Charles Kannさんのサイトhttp://chuckkann.com/joomlaMain/index.php/2016-05-09-22-19-35/one-address-cpu からダウンロードできます。

5 CPU implementation

このチャプターはOne-Address(1アドレス命令方式)CPUのLogisimでの実装を解説します。

個の実装は、CPU-Mainが全体の回路図で、3つのサブ回路があります。

  • ALU – 演算装置
  • Control Unit – 制御装置
  • Sign Extend – 8bitから16bit拡張
CPU-Mainと3つのサブ回路で構成されている
CPU-Mainに3つのサブ回路がある

5.1 The sign extend unit

wikipedia 符号拡張

符号拡張(ふごうかくちょう、Sign extension)とは、符号付の数値を表現するビット列が格納領域のビット幅より短い場合に、隙間を適切に埋めることによって数値としての同一性を維持する手法である。

このCPUのインストラクションフォーマットは、3.1 Overview of the machine code instruction formatに書かれているように、

16-bit machine instruction formatとなっています。

  • 4-bit Op Code
  • 4-bit ALU Opt
  • 8-bit Immediate or Address

マシンコードで0x1005の場合は、

  • 1 – 即値命令
  • 0 – 0x0 加算
  • 8bit – 数字5

となります。ですがALUは16bitの入力を受け付けるので、8bit 0x05では、幅が足りないため、Sign Extend Unitで8bitsから16bitsに符号拡張します。

以下のように、2の補数表現の場合、最上位ビットは符号を表すので、最上位ビットを新しく拡張したビットに入れていけば良いです。つまりもともと8bit(0..7)なので、最上位の7bitを新しく用意した8-15bitに渡せばよいです。

最上位ビット(7bit目)から、8bitから15bitまでを作る

上部のワイヤーが、下位0..7bitになり、下部のワイヤーが8..15bitになります。元々の8bitビットから、最上位ビット7bit目をスプリッターで取り出して、そこから8bit分の線をスプリッターで用意して、それを1本にまとめ上位8bitとします。最後に下位8bitと上位8bitのワイヤーを1本にまとめて、符号拡張の16bitに出力ピンに渡しています。


Implementing a One Address CPU in Logisimのアセンブリ言語仕様

Implementing a One Address CPU in Logisim では、アセンブリ言語仕様を作って、それをJavaで作ったアセンブラープログラムで、マシン語に変換しています。このアセンブリ言語を理解するために、ブログでメモします。

2.3アセンブラー・ディレクティブ(Assembler Directives)

  • .textディレクティブ

これ以下のテキストがアセンブリ命令、つまりプログラミングのソースコードになります。

  • .dataディレクティブ

これ以下のテキストがデータになります。

  • .labelディレクティブ

データや命令にラベルを付けれます。アセンブリ言語はfor文がないので、goto文のように、ラベルにジャンプすることで制御します。ただしそのラベルが0x015Aのようにアドレスだと、ソースコードが読みづらいので、普通のアセンブリ言語にはラベル機能があります。

  • .numberディレクティブ

2バイト(16bit)の容量を確保し、その数値で初期化します。-32768..32767の10進数で16進数はではなりません。

  • #ディレクティブ

コメント

2.4データタイプ (Data Types)

アセンブリ言語には、明示的なデータ型はなく、データアクセス、ストアのルールがあるだけです。

  • このCPUのwordは16bits
  • メモリーロケーションは、16bit wide
    • アドレス0なら、bits 0…15
    • アドレス1なら、bits 16…31
  • 256メモリロケーション(addressable words)
    • テキストメモリー、データメモリー
    • 0-255まで
    • $pcは、テキストメモリーでのみ使われます。
  • 命令で、即値(Immediate value)とアドレスでは、8bitが使われます。
    • これがアドレスとして使われる場合は、unsingedで、0-255です。
    • addなど命令に使われる倍は、8-bit valueはデータセグメントのアドレスを表します。
    • beqz分岐命令の場合は、8-bit valueは、テキストセグメントを参照するのに使います。
    • addiなどの即値命令の場合は、-128…127の8-bit integer valueとして使います。

2.5 Designing an Assembly Language

アセンブリー言語をデザインする。

命令を3つの要点で分けて考えます。メモリー間のデータ転送命令、演算命令、プログラム制御命令を3つにわけて考えましょうという事です。

  1. メインメモリーのデータを、レジスター(≒オペランドスタック)に移動できる命令を用意
  2. ALUの演算命令を用意
  3. プログラム制御。普通はbranch演算で提供します。つまりJUMP命令。

2.5.1 Transferring data from main memory to internal CPU memory

メインメモリーからCPU内のメモリーへのデータ転送

今回実装する1アドレス命令方式はレジスターが1つです。アキュムレーター(=Accumulator=累積器)は、$acで示し、CPU内でプログラマーがいろいろ使える唯一のメモリーです。

CPUの処理の流れとしては以下になります。

  1. メインメモリーからレジスターにデータをロード
  2. 演算処理
  3. 処理結果をメインメモリーにストア

アキュムレーターは8bitの1個だけなので、命令とデータを保持するために、メインメモリーに頼らなければなりません。このコンピュータでは、データメモリからアキュムレーター間の転送には、add、sub、store命令を使います。

add命令、sub命令

オペランドには、ラベル、またはメモリーアドレスです。

このアセンブリ言語にload命令はありませんが、clacで$acを0にクリアして、add Aで、メモリーAから$acに値を加算しているので、以下のように$ac = 0 + labelAをやっているので結局はload命令があるのと同じことです。

STOR命令

オペランドには、ラベル、またはメモリーアドレスです。$acの値を、オペランドに保持します。

2.5.2 Set of valid ALU operations

次に考慮することは、ALUの命令セットです。このコンピュータは、加算と減算(add,sub)を用意します。

2.5.3 Program Control(Branching)

プログラム制御(分岐)

使いやすいプログラミングには、ifやloop構造があります。この1アドレス命令方式(one-address CPU)では、Branch-if-equal-zero(beqz)命令を用意します。

これはMIPSプロセッサーで使われる名称のようです。x86のアセンブリー言語の場合は、JE(Jump if equal)、JZ(Jump if zero)がよく使われます。

もし$acが0なら、EndLoopラベルに分岐します。

2.5.4 Assembler Instructions

 

  • add[label|address]
    • $ac += data memory address
  • addi immediate
    • $ac += immediate
  • beqz [label|address]
    • if ($ac == 0) $pc = address.
  • clac
    • $ac  = 0
  • sub [label|address]
    • $ac -= data memory address
  • subi immediate
    • $ac -= immediate
  • stor [label|address]
    • data memory = $ac
  • noop
    • $pc++

2.6 Assembler Programs

2.5まででやってきたことを踏まえたプログラミングサンプルです。


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

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で動きをみたりすると大丈夫そうです。