Demultiplexor をhdl で記述した際のメモ

avatar

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

初めにDMuxinsel[1] を渡してw1 w2 の 2 値にin を分割する。 後はDMuxw1sel[0] を与えれば{a, b} の値が、w2sel[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);
}