/var/log/messages

debugging with sixth sense

Sequential Logic (Nand to Tetris(7))

この章ではメモリを実装する模様。プリミティブな回路として DFF が用意されているとのこと。これを基にして

  • レジスタ (DFF を基礎とする)
  • メモリ (レジスタを基礎とする)
  • カウンタ回路 (レジスタを基礎とする)

を実装していくとのことです。

とりあえず

リポジトリを作成。以下です。

作成用の branch を作成して実装着手。とりあえずレジスタは作れそう。

Binary cell (2 値素子)

ええと DFF は DFF なのか。つうか

Mux(a=in, b=out, sel=load, out=tmp);
DFF(in=tmp, out=out);

みたいな書き方したら叱られたぞ。これ、out な端子をゲイトの入力にしては駄目らしい。ので以下?

Mux(a=in, b=dfftmp, sel=load, out=muxtmp);
DFF(in=muxtmp, out=dfftmp);
Or(a=dfftmp, b=dfftmp, out=out);

なんというか微妙。でもこれをシミュレータに読ませると無問題だった。でも試験にはパスしません。マルチプレクサへの入力が逆なのかな。

引数逆にしたら試験パスしました。うーん。ちゃんと .cmp なソレを読めとorz

レジスタ

Bit ができたので Register 作成着手。これは Bit を並べれば良いはず。つうか試験の output 見てて思ったんですが flip-flop て凄いなぁ。

メモリ

あれ、領域確保ってどうするんだろ。テキスト確認すると「組み合せ回路」とありますね。これは ALU の時と同様に Mux8Way16 使えば良いのか。

なんとなく条件分岐って分岐した後に計算なイメージなんですが、並列で動くから先に答え出しちゃって問題ないのね、ってあたりの感覚にまだちょっと慣れません。

や、最初に操作しちゃうと書込んでしまいますね。RAM に内在する「調節アクセスロジック」ですか。つうか時間に依存しない操作というあたりもヒントなのかどうか。

どうも感覚的に記述してる順番に、ってのが身に染みているので微妙。

カウンタ

ここで必要な機能は 2 章で構築済み、とあります。インクリメンタ、というヤツかな。あ、ゼロ取得が ALU でできますね。場合分けってどうするのか。

とりあえず、なんとなく読みこんでエラーが出ない状態にできはしたのですが、フラグが全部立ってる状態を想定しておらず玉砕。PC.cmp 見るに

  • load と inc 両方指定だと load 優先
  • reset と inc 両方指定だと reset 優先
  • どうやら reset 最優先

確かに「関数」な記述として

if reset(t-1) then
else if load(t-1) then
else if inc(t-1) then

て書き方になってますねorz

最終的に場合分けは三つということで reset, load, inc な並びの 8 進で場合分けを表現しました。

  • 001 だとインクリメント
  • 010 だと load
  • 011 だと load
  • 100 だと reset でこれ以降全部 reset

という形ですがなんとなく微妙。テストにはパスしてますがorz

Comments