コンピュータシステム
の理論と実装①
本の概要
• コンピュータを一から作っていくこと
で、コンピュータの仕組みを学ぶ(ボト
ムアップ式)
• 前半はハードウェア、後半はソフト
ウェアを扱う
• コンピュータ作成後、テトリスを作る
nand2tetris (nand to tetris)
→ nandからtetrisへ
第1章 ブール論理
コンピュータは、電気信号を用いる
→ オン:1、オフ:0 として, 「0と1」の2つのラベルで表さ
れる数(2進数)で情報処理
2進数について学ぶ必要がある!
2進数に関する学問 → ブール代数
ブール代数
ブール値 ・・・ 2つのラベルを持った値
ex) on/off 、 true/false 、 1/0
ブール関数 ・・・ ブール値を引数に持つ関数
ex) fが引数xを反転して返すブール関数の場合
f(x) = തx ⇔ ቊ
f 0 = 1
f 1 = 0
ブール関数の基本要素
・10進数では四則演算が関数の基本要素
→ 一般的な関数は四則演算が複数合わさって構成
・2進数では次の3つが基本要素
・And
・Or
・Not
→ 一般的な関数はAnd、Or、Notが複数合わさって構成
基本ブール関数(And)
And(x,y)=ቊ
1 x = y = 1
0 others
イメージ図
x y And(x,y)
0 0 0
0 1 0
1 0 0
1 1 1
x y
基本ブール関数(Or)
Or(x,y)=ቊ
0 x = y = 0
1 others
イメージ図
x y Or(x,y)
0 0 0
0 1 1
1 0 1
1 1 1
A
A B
基本ブール関数(Not)
Not(x)=ቊ
0 x = 1
1 x = 0
イメージ図
x
x Not(x)
0 1
1 0
ブール関数の表現方法
• 真理値表
引数とブール関数の値を対応させた表
• ブール式
+ や ・のような演算子を用いた表現
ブール関数の表現方法(真理値表)
真理値表
全てのブール変数の組み合わせとブール関数の値を対応させた表
Andは2つの引数が1の場合1、それ以外の場合0をとるブール関数
x y And(x,y)
0 0 0
0 1 0
1 0 0
1 1 1
ブール関数の表現方法(ブール式)
・ブール式
+ や ・のような演算子を用いた表現
・基本的なブール式
・And(x,y) ≡ x・y
・Or(x,y) ≡ x+y
・Not(x) ≡ തx
→ 右辺のような演算子を用いると便利
正規表現
正規表現・・・複数のブール値を1つのブール式にまとめた表現
ex) 2要素ブール値集合の正規表現
x+y
x , y x・y
തx+y
⋮
変数x,yと演算子+,・, ഥ の組み合わせ
※ 要素数が𝑛個の場合、正規表現は22 𝑛
通り存在
ブール値集合 正規表現
全部で16通り
ブール関数と正規表現
任意のブール関数は少なくとも1つの正規表現で表すことができる
ex) ブール関数f(x,y) → ブール関数fはブール値x,yを持つ
x+y, x・y, ・・・
計16個
→ ブール関数fは16個の正規表現の内
どれかで表せる!
正規表現
ブール関数と正規表現
任意のブール関数は少なくとも1つの正規表現で表せる
任意のブール関数は、・(And)と+(Or)と ഥ (Not)を用いて表せる
新たなブール関数Nandを使って表せる
Nandとは
Nand ・・・ Not and の略
Nand(x,y) = x・y = ቊ
0 x = y = 1
1 others
x y Nand(x,y)
0 0 1
0 1 1
1 0 1
1 1 0
Nandと基本ブール関数
Nandのみを用いてAnd、Or、Notを表すことができる。
Not(x) = തx = x・x = Nand(x,x)
And(x,y) = x・y = x・y = Nand(x, y)
= Nand(Nand(x,y),Nand(x,y))
Or(x,y) = x + y = തx・തy (∵ド・モルガンの法則)
= Nand(Nand(x,x),Nand(y,y))
最後の資料参照
Nandとブール関数
任意のブール関数は少なくとも1つの正規表現で表せる
任意のブール関数は、・(And)と+(Or)と ഥ (Not)を用いて表せる
任意のブール関数はNandを用いて表せる
論理ゲート
(論理)ゲート ・・・ ブール関数を物理的に実現したデバイス
Orゲート(p.6参照)
基本ブール関数(And、Or、Not)に対応する論理ゲートを基本論
理ゲートという。
And
Not
複合ゲート
複合ゲート ・・・ 複数の基本論理ゲートを組み合わせたもの
ex) Andゲート2つを組み合わせた複合ゲート
And
And
論理設計
2種類の回路構成図
・インターフェイス ・・・ 外部構成
・実装 ・・・ 内部構成
インターフェイス 実装
And
And
And
回路の仮想構築
・PC上で仮想的な回路を構築することができる
・PC上で回路構築するためのツール
→ハードウェア記述言語(Hardware Description Language:HDL)
ハードウェアシミュレータ(ここではHSと略す)
・HDLで構築したい回路の内容を記述 → HSで回路を仮想構築
作業
1. 必要フォルダをダウンロード
2. hdlファイルの記述
3. シミュレーション
1. フォルダのダウンロード
・公式ホームページhttps://www.nand2tetris.org
にアクセス
・Software → Download から
Download the Nand2tetris Software Suite
をクリックしダウンロード
ダウンロードフォルダ
① projectsフォルダ → hdlファイル、tstファイル、cmpファイル
などが含まれる
・hdlファイル ・・・ ゲート内容を記述する(各自で記述)
・tstファイル ・・・ シミュレータが行うテスト内容(記述済)
・cmpファイル ・・・ 正しい出力結果(記述済)
② toolsフォルダ → シミュレータやコンパイラなどが含まれる
2. hdlファイルの記述
ゲート名.hdl のファイルをテキストエディタで記述
・メモ帳
・Visual Studio
・・・・
ハードウェア記述言語(HDL)
HDL ・・・ ゲート(回路)の構造を記述するための言語
Andゲートの記述例
→ ゲートの名前、インターフェイス情報、実装情報で構成
HDLの具体例
AndゲートをHDLで記述してみる!
projectsディレクトリ → 01 → And.hdl を開く
・ゲート名
CHIP ゲート名 (記述済)
次に論理設計(インターフェイス部と実装部)を考える!
・インターフェイス部
インターフェイス(外部構造) → 2入力と1出力
入力端子、出力端子それぞれに名前を付ける
・入力 a,b
・出力 out
{}内の初めに
IN 入力端子名;
OUT 出力端子名;
(記述済)
And
a
b
out
• 実装部
Andゲートはブール関数で表すと
And(a,b) = Nand(Nand(a,b),Nand(a,b))
→Nandゲートにa,bを入力して,その出力値を再びNand
に入力
Andゲートの実装(内部構造)
※上図の端子Nand(a,b)の名前をout1としている
NandNand
a
b
Nand(a,b)=out1
And(a,b)=out
• 実装部
既に作成済みゲート(パーツ)への接続手順
→ 今の例だと、Nandがパーツ
・NandゲートのHDLに記述されたインターフェイス部を確認
Nandの入力端子名 a,b
Nandの出力端子名 out
・Nand(Nandの端子名=Andの端子名)で接続
Nand(a=a, b=b, out=out1) Nand
a
b
o
u
t
out1
a
b
• 実装部
PARTS:
パーツ名(パーツ端子名=チップ端子名);
NandNand
a
b
out
out1
HDL全体の構成
CHIP ゲート名{
IN 入力端子名;
OUT 出力端子名;
PARTS:
パーツ名(パーツ端子=チップ端子);
}
3. シミュレーション
・シミュレーションファイルを開く
toolsディレクトリ → HardwareSimulator.bat (windows)
HardwareSimulator.sh (Linux)
・ファイルの読み込み
Load Script をクリック
↓
シミュレートしたい
tstファイルを選択
・シミュレート
Runをクリックすると
シミュレート開始
(黄色線が現在シミュレート
してる箇所)
最後までシミュレートできれば
下に 「End of Scipt ~~~」が
表示される
• 画面説明
各ピンの値
HDL
プログラムがシミュ
レートしてる箇所の
表示
各ピンの値の表現方法 下記に表示するファイル
基本論理ゲートの作成
・Notゲート
Not(in) = Nand(in,in)
• Orゲート
Or(a,b)= Nand(Nand(a,a),Nand(b,b))
Nandin out
Nand
Nand
Nand
a
b
out
その他の論理ゲートの作成
• Xorゲート
2つの値が異なる場合に1、それ以外は0
a b Xor(a,b)
0 0 0
0 1 1
1 0 1
1 1 0
• Xorゲート
<正規表現を求めるテクニック>
1. 出力値が1のものに着目
2. それぞれのブール式を考える
3. 2の全ての要素を論理和で結合
1. 右表の黄色2つ
2. 1つ目: out = തa・b 、 2つ目: out = a・തb
3. Xor(a,b) = തa・b + a・തb
a b Xor(a,b)
0 0 0
0 1 1
1 0 1
1 1 0
最後の参考資料参照
• Xorゲート
Xor(a,b) = തa・b + a・തb
And
And
Or
Not
Not
a
b
out
• マルチプレクサ(Mux)
3つの入力 = 2つのデータビット+1つの選択ビット
選択ビットの値によって、出力値が決まる
・sel=0のとき、aを出力
・sel=1のとき、bを出力
Mux
a
b
out
sel
a b sel out
0 0 0 0
0 1 0 0
1 0 0 1
1 1 0 1
0 0 1 0
0 1 1 1
1 0 1 0
1 1 1 1
• マルチプレクサ(Mux)
Muxの正規表現は?
<正規表現を求めるテクニック>
1. 出力値が1のものに着目
Muxの場合、右表の黄色4つ
2. それぞれのブール式を考える
1つ目,2つ目 → out=a・sel
3つ目,4つ目 → out=b・sel
3. 2の全ての要素を論理和で結合
out = a・sel + b・sel
a b sel out
0 0 0 0
0 1 0 0
1 0 0 1
1 1 0 1
0 0 1 0
0 1 1 1
1 0 1 0
1 1 1 1
• マルチプレクサ(Mux)
Muxの真理値表を右のように見やするすることで、
正規表現が求めやすくなる!
1行目のブール式 : a・sel
2行目のブール式 : b・sel
→ out = a・sel + b・sel
sel out
0 a
1 b
• マルチプレクサ(Mux)
out = a・sel + b・sel
And
And
Not
Or outsel
b
a
• デマルチプレクサ(DMux)
Muxの逆で、1つの入力に対して選択ビットの値によって
2つの出力に分ける。
・sel=0のとき、a=in, b=0
・sel=1のとき、a=0, b=in
DMux
a
b
in
sel
sel a b
0 in 0
1 0 in
• デマルチプレクサ(DMux)
a = in・sel 、 b = in・sel
And
And
Not
sel
in
a
b
sel a b
0 in 0
1 0 in
・多ビットゲート
ハードウェアでは複数ビットからなる配列(バス)を操作する
ことが一般的
→ 多ビットゲートが必要
・多ビットゲート
1入力に対して、複数ビットを扱える
ex) 16ビットバスのゲート
16入力 1入力
ゲート16個 ゲート
1ビットの
情報 16ビットの
情報
・多ビットNotゲート
多ビットNotゲートをHDLで記述する!
多ビットになっても、基本的に回路図は変わらず!
16ビットバス
入力
Not
16
16ビットバス
出力
・多ビットNotゲート
入出力端子名[ビット数]
ビット数分のNotゲート
※初めのビット番号は0
使いたいパーツが完成していない場合の対処
多ビットNotゲートのパーツで
Notゲートを使いたい!
↓
Notゲート完成してない。。。
↓
ビルトイン回路(既に完成済の回路)
を使う!
使いたいパーツが完成していない場合の対処
・ビルトイン回路の管理場所
ダウンロードファイルの
tools → builtInChips
に多くのビルトイン回路がある。
使いたいパーツが完成していない場合の対処
・シミュレータの動作
projectsフォルダ内のhdlファイルを読み込む
↓
対象ファイルが見つからない場合、 builtInChipsの
hdlファイルを読み込む
⇒ ビルトイン回路を使う場合、projectsフォルダの
hdlファイルを別の場所に移しておく!
・多ビットAnd, 多ビットOr,多ビットマルチプレクサ
→ 各自で!
・多入力Orゲート
多入力の場合でも、バスのように
入力端子名[入力数]
で宣言
Or
Or
In[0]
In[1]
In[2]
・多入力/多ビットマルチプレクサ
4入力16ビットマルチプレクサ
out = a・sel[0]・ sel[1] + b・sel[0]・ sel[1]
+ c・ sel[0]・sel[1] + d・sel[0]・sel[1]
sel[1] sel[0] out
0 0 a
0 1 b
1 0 c
1 1 d
Mux
a
b out
sel[1]
c
d
sel[0]
・多出力デマルチプレクサ
4出力デマルチプレクサ
a = in・sel[0]・ sel[1] 、 b = in・sel[0]・ sel[1]
c = in・ sel[0]・sel[1] 、 d = in・sel[0]・sel[1]
sel[1] sel[0] a b c d
0 0 In 0 0 0
0 1 0 In 0 0
1 0 0 0 In 0
1 1 0 0 0 in
DMux
a
bin
sel[1]
c
d
sel[0]
・ 、8入力16ビットマルチプレクサ, 8出力デマルチプレクサ
→ 各自で!
参考資料(ド・モルガンの法則)
ここでは和集合と積集合を次のように定義します。
・和集合 ・・・ A+B (Or(A,B)に対応)
・積集合 ・・・ A・B (And(A,B)に対応)
和集合 積集合
A B A B
参考資料(ド・モルガンの法則)
ド・モルガンの法則
・ A + B = ഥA ・ ഥB
・ A・B = ഥA + ഥB
A B 否定 A B
A B 否定 A B
参考資料(正規表現を求めるテクニック)
<正規表現を求めるテクニック>
1. 出力値が1のものに着目
2. それぞれのブール式を考える
3. 2の全ての要素を論理和で結合
の簡単な証明
2変数ブール関数X(a,b)に関して𝑘個の出力値が1となるとする。
さらに、
X 𝑎, 𝑏 = σ𝑖=0
𝑘
𝐴𝑖(𝑎, 𝑏)
※σ は論理和の
X 𝑎, 𝑏 =1となる 𝑎, 𝑏 の集合をM、 X 𝑎, 𝑏 =0となる 𝑎, 𝑏 の集合
をNとする。
このとき、任意のMの要素mに対して
X m = σ𝑖=0
𝑘
𝐴𝑖(𝑚) = 1
は明らかに成り立つ。
また、任意のNの要素nに対して
X n = σ𝑖=0
𝑘
𝐴𝑖(n) = 1
∴ 𝐴0 n + 𝐴1 n + ・・・ + 𝐴 𝑘 n = 0
参考資料(正規表現を求めるテクニック)
<正規表現を求めるテクニック>
1. 出力値が1のものに着目
2. それぞれのブール式を考える
3. 2の全ての要素を論理和で結合
で、本当に正規表現になってる?
黄色のブール式をA(a,b)とB(a,b)とする。
このとき、
Xor(a,b) =A(a,b)+B(a,b)
が本当にあってるか確認!
⇒ Xor=0になる(a,b)の組み合わせで AとBが0になることを
確認できれば十分!
a b Xor(a,b)
0 0 0
0 1 1
1 0 1
1 1 0
A(a,b)
B(a,b)
Xor(0,0)=0なので
A(0,0)+B(0,0) = 0
∴ A(0,0)=B(0,0) = 0 (※ +は論理和)
同様に、 Xor(1,1)=0なので
A(1,1)=B(1,1) = 0
つまり、 Xor=0となる(a,b)の組み合わせでは
AもBも0になる!
a b Xor(a,b)
0 0 0
0 1 1
1 0 1
1 1 0
A(a,b)
B(a,b)
一般的なお話
あるゲートGに関して、G=1を満たすGの変数の集合をKとする。
(つまり、G(K)=1ということ)
さらに、Kの各要素𝑘𝑖に対するブール式を𝐴𝑖とする。
(前ページでは、 𝐴1 =A, 𝐴2 = B)
このとき、
G = ራ
𝑖
𝐴𝑖
が成り立つ。ここで、 ‫ڂ‬ は全ての要素を論理和で結合するこ
とを表す記号である。
・任意のKの要素では、 𝐴𝑖のどれか一つが1になる
・G=0となる変数集合では, 𝐴𝑖全てが0になる

コンピュータシステムの理論と実装1