📚

Nand2Tetris読書会(3章)

2021/05/29に公開

概要

Nand2Tetris読書会 の第3回を開催しました。
今回取り上げるのは、3章『順序回路』です。

前の記事は こちら

内容

1~2章で学んだ回路は 組み合わせ回路 と呼ばれるが、これらは状態を保つことはできない。
状態を記憶するための記憶素子は 順序回路 から構築される。
3章では、フリップフロップ を最小単位として記憶素子を実装していく。

一般的なコンピュータでは、時間の表現にクロックを用いる。

  • ハードウェアでは、オシレーター( 発振回路 )を使って実現。
  • オシレーターは、常に2値(0/1, tick/tock, etc.)を行き来し続ける。
  • 周期: tickの始まりから次のtockの終わり(=次のtickの始まり)の間の時間。
  • タイムユニット(単位時間): クロックの1周期。

コンピュータで使われる順路回路の基本は フリップフロップ である。

  • D型フリップフロップ(data flip-flop, DFF): 1ビットのデータ入力と1ビットのデータ出力、クロック入力を持つ。ひとつ前のタイムユニットの入力値を出力する。
  • 構造や機能によって種類が分類され、D型以外にもRS型、JK型、T型がある。(予習メモ))

レジスタは、データを格納/呼び出しできる記憶装置である。

  • 1ビットレジスタ(ビット、2値素子): 1ビットの入力と1ビットの出力、読み込みビット(load)を持つ。loadが1のときは新しい値(入力)を読み込み、0のときは前の値を保持する。
  • 多ビットレジスタ: 1ビットレジスタを必要な個数だけ配列状に並べたもの。多ビットレジスタの持つ値はワードと呼ばれる。

任意の長さのワードを記憶するのがメモリである。
レジスタを積み重ねるとRAM(Random Access Memory)ユニットを構築できる。

  • アドレス: RAMの各ワードに割り当てられた 0 から n-1 までのユニークな番号。
  • RAMの入力は3つ:
    • データ入力
    • アドレス入力: どのレジスタにアクセスするか。RAMのサイズを n とすると、アドレス入力は log{_2}{n} ビットになる。
    • ロードビット: 読み込み/書き込みのどちらのメモリ操作をするか。
  • RAMの設計:
    • 幅: 各ワードの幅。一般的なコンピュータでは32か64ビット幅。
    • サイズ: RAMに存在するワードの個数。

タイムユニットが進むごとに一定の整数値を加算していく順路回路を、カウンタと呼ぶ。
1を加算していくカウンタが一般的。

  • プログラムカウンタ: CPUで、この出力を次に実行されるプログラム演算(命令)のアドレスとして扱う。(第2回 にも記載済み)

組み合わせ回路と順序回路の大きな違いは、時間の概念があるかである。

組み合わせ回路 順序回路
時間の概念 ない ある
フィードバックループ 不可
出力値の変わるタイミング 入力値が変わった直後 クロック周期が移行したとき(周期の間は不安定な状態)
出力値の同期 不可
ALU DFF

予習メモ

フリップフロップの種類

  • RS型(Reset-Set): 二つの入力のうち、入力Sに1が入ると出力が1、入力Rに1が入ると出力が0になる。それ以外のときは値を保持する。SR両方に1を入力するのは禁止。
  • JK型: 二つの入力と二つの出力を持ち、一方の出力を反転したものがもう一方の出力となる。RS型の禁止を解消しており、二つの入力がどちらも1のとき、出力は現在の値を反転したものになる。
  • D型(Data/delay): クロックの立ち上がり(または立ち下がり)エッジで入力が出力に反映され、それ以外は値が保持される。
  • T型(Toggle): クロック信号が入力されるたびに出力が反転する。

カウンタの機能

  • アップ・ダウン機能: 加算だけでなく減算もできる。あるいは、加算と減算を切り替えられる。
  • プリセット機能: あらかじめセットされた0以外の初期値から、加算/減算をする。

ディスカッションメモ

クロックを作るときに遅延とか考慮しなくていいの?

実際はクロックの時間や誤差を考慮しないといけないが、シミュレータでは遅延のことは考慮しなくて大丈夫。

実際にクロックを作るときの、周期のチューニングの一例:

  • 原振クロック(master clock)を決めて、そこから分周してクロック数を減らす。
    • 周波数高いほど消費電力が大きくなるので、周波数(クロック数)は少ない方が理想的。
  • クロックの1周期の間にゲートの処理を終えられるように設計する。

DFFでinとoutが同じ内部ピンで有効なのはなぜ?

Not (in=loop1, out=loop1)

では、loop1=0のときにin=0となり、out=1となる。
このとき、loop1=1すなわちin=1となるべきであるが、これでは矛盾が生じる。
これがデータレースと呼ばれる状態である。

一方、

DFF (in=loop1, out=loop1)

では、loop1=0のときにin(t)=0となり、out(t+1)=0となる。
このとき、loop1=0となるが、この値はin(t)ではなくin(t+1)になるので矛盾は生じない。
したがって、順路回路ではinとoutが同じ内部ピンで有効と言える。

感想

3章は当初あまり質問が出ていなかったため、質問表の確認はすぐに終わってしまいました。
ですが、内容自体は簡単ではないので翌週から全員で3章をじっくり読み返しました。
読書会の中で書籍を読み直す時間を設けたことで新たに気づくこともあり、ディスカッションが盛り上がりました。

これに伴い、読書会の進め方を少し変えています。
詳細については、こちらの記事 に追記しました。

最後に

Nand2Tetris読書会始めました』の記事でも紹介していますが、読み進めているのはこちらの本です。
https://www.oreilly.co.jp/books/9784873117126/

初学者なりに書籍やその他に調べた内容をまとめていますが、理解が足りておらず間違ったことを書いているかもしれません。
そのような箇所を見つけた場合はコメントなどで指摘していただけると助かります。

次の記事は こちら

GitHubで編集を提案

Discussion