コンピュータに実際に何らかの仕事をさせるためには計算の結果を出力したり、外の世界の信号を入力したりする必要が出てきます。そのような時に使用されるのが入出力命令です。このCPUでは入力用と出力用に2つずつ、合計4つの入出力命令を作りました。この命令を使って前ページで作成した足し算プログラムを改良してみます。
前ページで作成した足し算プログラムでは計算の対象となる数値はあらかじめメモリの中に書き込まれていました。ですので別の数値の足し算の結果が知りたい時にはプログラム自体を書き換える必要がありました。また計算の結果もメモリ内部に書き込まれているだけでしたのでコンピュータの外から直接答えを確認することができませんでした。今回のプログラムでは計算に用いる数値を外部から入力できるようにし、計算結果も端子から出力して確認できるようにします。なお、今回のプログラムではP3入力端子とP4入力端子に接続されたスイッチ回路等によって数値入力ができる環境が予め準備されているものとします。またP1出力端子にもLED等を接続し、出力結果が目視で確認できる環境にあるものとします。以下がそのプログラムのコードです。
【 0 】 INA 【 1 】 200
【 2 】 INB 【 3 】 201
【 4 】 LD 【 5 】 200
【 6 】 ADD 【 7 】 201
【 8 】 ST 【 9 】 203
【 10】 OUTA 【 11】 203
【 12】 JUMP 【 13】 0
まずINA命令によってP3入力端子から入力した数値を200番地へ保存し、続いてINB命令によってP4入力端子から入力した数値を201番地へ保存しています。数値を保存する番地については空いている番地であればどこでも構いません。プログラム自体が書き込まれている領域と数値の保存先が重ならないように、ここではかなり余裕を持たせて200番地以降のアドレス領域を数値の保存先として使用しています。
次にLD命令によって200番地に保存されてある数値(P3から入力された数値)をワーキングレジスタへと読み込みます。続くADD命令によってワーキングレジスタの値と201番地に保存されている数値(P4から入力された数値)が足し算されて計算結果がワーキングレジスタへと上書きされます。
ワーキングレジスタに書き込まれている足し算の計算結果が次のST命令によって203番地へと保存されます。
最後にOUTA命令によって203番地の値がP1出力端子へと出力された後、JUMP命令によってプログラムの最初(0番地)に戻ります。
このプログラムはJUMP命令によってプログラムの最初から最後までが繰り返し実行されるようになっています。この状態で入力端子の値が変化すると、それに応じて出力される計算結果も変化します。「信号入力→演算→信号出力」という一連の流れを繰り返し行う処理はコンピュータを使った機械制御などでもよく使用されます。このようなループ処理が常に動作していることで外部で起きた何らかの物理的現象に対し、即座に反応するようなシステムを作ることができます。例えばモーターの速度制御であれば「速度センサーからの信号を入力し→目標の速度と比較して出力を上げるべきか下げるべきかを判断し→モーターへかける電圧を指示する信号を出力する」といった具合です。その他にも人がコンピュータに対して何らかの操作を行うことを待っていて、その操作の内容に従って特定の仕事をする、といったプログラムでもこのようなループが存在しています。(タッチパネルを操作する→アプリを起動させる、ゲーム機の十字キーを押す→ゲームキャラクターを移動させる、等)
スポンサーリンク
次にアセンブリ言語で書かれたプログラムを以下の対応表に従って機械語へ変換します。
各命令の機械語への対応表
JUMP :1
JZC :2
LD :3
ST :4
SET :5
LHI :6
ADD :7
SUB :8
AND :9
OR :10
NOT :11
SL :12
SR :13
INA :14
INB :15
OUTA :16
OUTB :17
機械語へ変換されたプログラム
【 0 】 14 【 1 】 200
【 2 】 15 【 3 】 201
【 4 】 3 【 5 】 200
【 6 】 7 【 7 】 201
【 8 】 4 【 9 】 203
【 10】 16 【 11】 203
【 12】 1 【 13】 0
※「FPGAとVerilog HDLで作るCPU」の方で実際にFPGA上にCPUを作った方は”cpu.mif”に上記の機械語を書き込むことでプログラムを実行することができます。”cpu.mif”の変更を適用するには再度、Quartusプロジェクトのコンパイルを行う必要があります。
<戻る 次へ>