QurioWork

日常思ったことと好奇心の追求

NandGameのALUについて

概要

NandGame(https://nandgame.com/)の補足説明です。

NandGameは、最初に電気式リレー(現実世界はMOSトランジスタ)でNANDゲートを作り、NANDゲートを基礎として徐々に複雑なコンピュータを作るパズルゲームで、デジタルロジックとコンピュータアーキテクチャの基本を学べる。 そんな、NandGameがいつの間にかリニューアルされてたので、自分が気になるところをまとめた。

ALUについて

ALU(Arithmetic Logic Unit)とは

ALUは、コンピュータ(CPU)の演算を担う中心的なコンポーネント。 これまでの章で作ったセレクタや各種ユニットを組み合わせ様々な演算を実行できる。 よく出来た仕組みでとても面白いと思う。

NandGameのALU

NandGameのALUでは、5bitの命令を使って全部で32通りの演算が実行できる。 大まかに分類すると算術演算、論理演算、オペランド操作が実行できる。 とりあえず作ったALUの回路 ↓↓

nandgame/NandGame_ALU.png

ALUの入力信号

u

"u" は "unit" の略で、ALUが算術演算を実行するか(u=1)、論理演算を実行するか(u=0)を決定する制御信号。

op1,op2

"op1" と "op2" は、ALUに与えられる実行する演算を判別するビットフラグとして機能する。op1,op2 を使って4通りの演算が実行できる。

zx

"zx" は "zero extension" の略(多分)で、zx=1の場合、ALUはop1をゼロにセットする。zx=0の場合、op1 はそのまま使用される。

sw(swap): 入力操作数の入れ替え制御

"sw" は "swap" の略で、sw=1の場合、X と Y を入れ替える。 sw=0の場合、X と Y は入力値の通り使用される。"sw" があることでより柔軟な演算ができる。

ALUで実行できる演算

論理演算

表記 演算名 説明
X and Y 論理積 ビットごとのAND演算
X or Y 論理和 ビットごとのOR演算
X xor Y 排他的論理和 ビットごとのXOR演算
invert X 否定 ビットごとのNOT(否定)演算

算術演算

表記 演算名 説明
X + Y 加算 2つの操作数(op1とop2)の加算
X - Y 減算 2つの操作数(op1とop2)の減算
減算は、2の補数表現を利用して、引き算を加算で計算する
X + 1 インクリメント op1 + 1 を実行する
X - 1 デクリメント op1 -1 を実行する

ALUの出力

Output

実行された演算結果(16bit)が出力される。 加算、減算、論理演算、シフト演算など、入力信号とオペランドの値に基づいて計算された値が出力される。

ALUの回路構成

リニューアルに伴いALUの内部構成がユニットごとに分かりやすくなった。 NandGameでのALU回路構成は、下記要素から成り立っている。

オペランド入れ替え

「sw」の入力値に応じて、オペランド「X」「Y」の値が切り替わるようにする

ゼロ置換

「zx」の入力値に応じて、「0」と オペランド(X,Y 入れ替え後の結果)が切り替わるように作成

算術演算ユニット(Arithmetic Unit)

このユニットは前問題で作成したユニットを利用する。 入力値は「zx」「sw」の効果を反映したオペランドを使う

論理演算ユニット(Logic unit)

このユニットは前問題で作成したユニットを利用する。 入力値は「zx」「sw」の効果を反映したオペランドを使う

最後のセレクタ

「u」の値に応じて、求められている演算が採用されるように配線する。

まとめ

NandGameのALUはとても単純だけど、基本的な仕組みを学ぶのに丁度良い。ALUのオペランドのデータ型やパラメータ入力bitを増やせば、より複雑な演算が実現できることが容易に想像できる。また ALU を理解しないと、後々のProcessor構築で確実に行き詰まるので確実に理解したい。