Demultiplexor をhdl で記述した際のメモ
Yuji Matsumoto / September 16 2019
(この記事は別のブログサイトに掲載していた記事を移植したものです)
「コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方」の「1 章 ブール論理」より、Demultiplexor をいくつか hdl で書いてみたので、考え方のメモ。
DMux
a が 1 になるのはin=1 sel=0の時のみであることを考えると、a の値を出すにはsel の値を反転してAnd に渡せば良い。b が 1 になるのはin=1 sel=1 の時なのでそのままAnd に渡す。
CHIP DMux {
IN in, sel;
OUT a, b;
PARTS:
Not (in=sel, out=nsel);
And (a=in, b=nsel, out=a);
And (a=in, b=sel, out=b);
}
DMux4Way
初めにDMux にin とsel[1] を渡してw1 w2 の 2 値にin を分割する。
後はDMux にw1 とsel[0] を与えれば{a, b} の値が、w2 とsel[0]を与えれば{c, d} の値が得られる。
CHIP DMux4Way {
IN in, sel[2];
OUT a, b, c, d;
PARTS:
DMux (in=in, sel=sel[1], a=w1, b=w2);
DMux (in=w1, sel=sel[0], a=a, b=b);
DMux (in=w2, sel=sel[0], a=c, b=d);
}
DMux8Way
DMux4Way の実装と考え方は同じで、初めにin を 2 値に分割し、それぞれをDMux4Way に与えれば良い。
CHIP DMux8Way {
IN in, sel[3];
OUT a, b, c, d, e, f, g, h;
PARTS:
DMux(in=in, sel=sel[2], a=t1, b=t2);
DMux4Way(in=t1, sel=sel[0..1], a=a, b=b, c=c, d=d);
DMux4Way(in=t2, sel=sel[0..1], a=e, b=f, c=g, d=h);
}