コンピューターシステムの理論と実装 3章 Bit回路設計あれこれ

コンピューターシステムの理論と実装(オライリージャパン)の3章のBit回路の実装課題で躓いたのでメモです

Bit回路とは

入力はinloadのふたつ、出力はout

書籍ではこのように書かれている

If load(t-1) then out(t)=in(t-1)
else out(t)=out(t-1)

loadが1ならinを保持し出力、loadが0ならinを無視して保持されている値を出力する。

Dフリップフロップ

このように記憶(状態)を必要とする回路を順序回路と言う。
逆に入力だけで出力が決まるものは組み合わせ回路と呼ばれ、ANDとかORとかの組み合わせで表現できる。

ではどのように状態を保持するかというと、書籍ではDフリップフロップを使うことになっている。
Dフリップフロップは、一つ前の入力を出力する回路で、DはDelay(遅延)を表す。

順序回路の設計

順序回路の構成

順序回路は

  • 状態決定回路
  • 記憶回路
  • 出力決定回路

から構成される。

f:id:kantarow:20201005153322j:plain
順序回路の構成

状態決定回路の出力をw、記憶回路の出力をy、出力決定回路の出力をzとする。

状態割当

yの値によって状態を割り当てる。0か1しかないので、それぞれS0S1とする。

状態決定回路

状態決定回路は論理関数で表現できる。
上の図から入力と状態で決定されることがわかる。
inx1, loadx2とする。
簡単な回路なので状態遷移表を書かずに整理すると、w=1となるのは

  • y・x1・x2
  • ~y・x1・x2
  • y・x1・~x2
  • y・~x1・~x2

(中点は論理積チルダ(~)は論理否定を表す。)

状態遷移表から求める場合は、w=1の行を探して、値が1ならそのまま、値が0なら否定して論理積をとればよい。加法標準形とかで検索すると良い記事がヒットするかも。

簡単化

ベイチ図を用いる。

f:id:kantarow:20201005155521j:plain
ベイチ図

この図から、w = y・~x2 + x1・x2が求められる。
論理回路で表すとこう。

f:id:kantarow:20201005160121j:plain
回路図

ちなみにこの回路はyzが等しいです。
つまりあとはHDLで書くだけ

**
 * This file is part of www.nand2tetris.org
 * and the book "The Elements of Computing Systems"
 * by Nisan and Schocken, MIT Press.
 * File name: projects/03/a/Bit.hdl
 */

/**
 * 1-bit register:
 * If load[t] == 1 then out[t+1] = in[t]
 *                 else out does not change (out[t+1] = out[t])
 */

CHIP Bit {
    IN in, load;
    OUT out;

    PARTS:
    And(a=in, b=load, out=s);
    Not(in=load, out=t);
    And(a=t, b=w, out=u);
    Or(a=s, b=u, out=v);
    DFF(in=v, out=w);
    Or(a=w, b=false, out=out);
}

これをシミュレーターに渡して付属のテストを動かすと通るはずです。
最後のOrDFFの出力をoutにつなげるために追加したのですが、もっとスマートな方法はないでしょうか。あったら教えてもらえると嬉しいです。