Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

336 views

Published on

第1回目の勉強会で使う資料です。

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

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

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

×