コンピューターシステムの理論と実装(オライリージャパン)の3章のBit回路の実装課題で躓いたのでメモです
Bit回路とは
入力はin
とload
のふたつ、出力は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(遅延)を表す。
順序回路の設計
順序回路の構成
順序回路は
- 状態決定回路
- 記憶回路
- 出力決定回路
から構成される。
状態決定回路の出力をw
、記憶回路の出力をy
、出力決定回路の出力をz
とする。
状態割当
y
の値によって状態を割り当てる。0か1しかないので、それぞれS0
とS1
とする。
状態決定回路
状態決定回路は論理関数で表現できる。
上の図から入力と状態で決定されることがわかる。
in
をx1
, load
をx2
とする。
簡単な回路なので状態遷移表を書かずに整理すると、w=1
となるのは
- y・x1・x2
- ~y・x1・x2
- y・x1・~x2
- y・~x1・~x2
状態遷移表から求める場合は、w=1
の行を探して、値が1ならそのまま、値が0なら否定して論理積をとればよい。加法標準形とかで検索すると良い記事がヒットするかも。
簡単化
ベイチ図を用いる。
この図から、w = y・~x2 + x1・x2
が求められる。
論理回路で表すとこう。
ちなみにこの回路はy
とz
が等しいです。
つまりあとは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); }
これをシミュレーターに渡して付属のテストを動かすと通るはずです。
最後のOr
はDFFの出力をout
につなげるために追加したのですが、もっとスマートな方法はないでしょうか。あったら教えてもらえると嬉しいです。