この章ではメモリを実装する模様。プリミティブな回路として 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