daisuzz.log

"コンピュータシステムの理論と実装 第3章 順序回路" を読んだ

「コンピュータシステムの理論と実装」を読んだメモを書いていきます。

前回は↓

iikanji.hatenablog.jp

メモ

組み合わせ回路

  • 算術演算や論理演算をおこなう回路
  • ANDやORだったり、AdderやALUなど
  • 状態をもつことはできない

順序回路

  • 状態を持つ回路
  • 順序回路は複雑な仕組みが必要だが、今回はフリップフロップをプリミティブな回路として使うことで複雑さを下位レベルに落とし込む

クロック

  • マスタクロックが継続的に変化する信号を送ることで時間の経過を表す
  • 電気信号は0/1, low/high, tick/tockなどと呼ばれる2つの状態を行き来する
  • tickの始まりからtockの終わりまでの時間を周期と呼ぶ
  • 1周期を単位時間(time unit)とする
  • 順序回路は、次のクロック周期の始まりにおいて正しい値を出力すればよく、クロック周期の期中は不安定な状態でもよい
  • クロックを作るときはクロック周期の間隔を、アーキテクチャの中で最も遠い回路間を移動するのに必要な時間より長くすることが必要

フリップフロップ

  • いくつか種類がある
  • D型フリップフロップ(DFF)
  • 入力
    • 1ビット
    • クロック入力
  • 出力 1ビット
  • out(t)=in(t-1)
  • 各クロック周期の始まりに、1つ前の単位時間における入力値 が送信される

レジスタ

  • データの格納と呼び出しができる記憶装置
  • if load(t-1) out(t)=in(t-1) else out(t)=out(t-1)
  • load bitが1のときinを格納
  • load bitが0のとき値を読み込む
  • 1ビットのレジスタをビットと呼ぶ
  • 多ビットのレジスタは1ビットのレジスタを配列上に並べればよい
  • 多ビットのレジスタが持つ値をwordと呼ぶ

メモリ

  • 任意の長さのワードを記憶する
  • wビットのレジスタをn個積み重ねることでRAMを構築できる
  • RAM中のワードは格納されている場所にかかわらず同じ時間でアクセスできる
  • 入力
    • データ入力
    • アドレス入力
    • ロードビット
    • 出力
      • ロードビットが0(読み込み)の場合、入力したアドレスのレジスタの値をすぐに出力する
      • ロードビットが1(書き込み)の場合、次のサイクルで、入力したアドレスのレジスタに値が送られる
  • RAMの設計では幅とサイズを指定する
      • 各ワードの幅=レジスタのビット数
      • 一般的なコンピュータでは32, 64ビット
    • サイズ
      • RAMに存在するワードの個数
      • 一般的なコンピュータでは百万オーバー

カウンタ

  • out(t)=out(t-1)+c
  • 単位時間が進むごとに整数が加算される

実装

Bit(1ビットのレジスタ), Register(幅16ビットのレジスタ), RAM8, RAM64, PC(プログラムカウンタ), RAM512, RAM4K, RAM16Kを実装する。 実装は以下。

github.com

感想

  • フリップフロップをプリミティブな回路としているため、記憶素子の具体的な複雑さはいまいち理解していない
  • プログラムカウンタの実装が難しい
  • Registerに入力するloadをtrue固定にするという設計方法が思いつかなかった
  • 普段メモリを抽象的に捉えていることが多いので、実際にメモリを回路として実装することでメモリの仕組みを理解することができた
  • 入力に対して処理を切り替えたい場合は、さきに切り替え候補の処理の実行結果を出しておき、それをマルチプレクサに入力することで、selの値に応じて実行結果の切り替えを行なうことができる

次章はこちら

iikanji.hatenablog.jp