简析

3-8译码器

先看一下3-8译码器的真值表和表达式。不知道为什么牛客把3-8译码器的基础题目安排在这道题后面...
真值表

A2 A1 A0 Y0_n Y1_n Y2_n Y3_n Y4_n Y5_n Y6_n Y7_n
0 0 0 0 1 1 1 1 1 1 1
0 0 1 1 0 1 1 1 1 1 1
0 1 0 1 1 0 1 1 1 1 1
0 1 1 1 1 1 0 1 1 1 1
1 0 0 1 1 1 1 0 1 1 1
1 0 1 1 1 1 1 1 0 1 1
1 1 0 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1 1 0

表达式: 本题给出的3-8译码器只有一个使能端口E。当E==1时,译码器正常工作;当E==0时,译码器输出为8'b1111_1111

{Y0n=A2 A1 A0,Y1n=A2 A1 A0,Y2n=A2 A1 A0,Y3n=A2 A1 A0,Y4n=A2 A1 A0,Y5n=A2 A1 A0,Y6n=A2 A1 A0,Y7n=A2 A1 A0,\left\{ \begin{array}{lr} Y0_n=\overline{\overline{A_2}\ \overline{A_1}\ \overline{A_0}}, \\ Y1_n=\overline{\overline{A_2}\ \overline{A_1}\ A_0}, \\ Y2_{n}=\overline{\overline{A_2}\ A_1\ \overline{A_0}}, \\ Y3_{n}=\overline{\overline{A_2}\ A_1\ A_0}, \\ Y4_{n}=\overline{A_2\ \overline{A_1}\ \overline{A_0}}, \\ Y5_{n}=\overline{A_2\ \overline{A_1}\ A_0}, \\ Y6_{n}=\overline{A_2\ A_1\ \overline{A_0}}, \\ Y7_{n}=\overline{A_2\ A_1\ A_0}, \\ \end{array} \right.

全减器

CiC_i是借位输入,AA是被减数,BB是减数,DD是差,CoC_o是借位输出。
需要注意的是,当A=0A=0B=1B=1Ci=0C_i=0时,被减数小于减数,借位得到22,所以借位输出Co=1C_o=1,差D=21=1D=2-1=1;当A=0A=0B=1B=1Ci=1C_i=1时,借位得到22,所以借位输出Co=1C_o=1,差D=211=0D=2-1-1=0
真值表

C_i A B D C_o
0 0 0 0 0
0 0 1 1 1
0 1 0 1 0
0 1 1 0 0
1 0 0 1 1
1 0 1 0 1
1 1 0 0 0
1 1 1 1 1

表达式:

{D=Ci AB+Ci AB+CiA B+CiAB,Co=Ci AB+CiA B+CiA B+CiAB\left\{ \begin{array}{lr} D = \overline{C_i}\ \overline{A} B+\overline{C_i}\ A \overline{B}+C_i\overline{A}\ \overline{B}+C_iAB ,\\ C_o = \overline{C_i}\ \overline{A} B+C_i\overline{A}\ \overline{B}+C_i \overline{A}\ B+C_iAB \end{array} \right.

结合3-8译码器的表达式可以得到:

{D=Y1n+Y2n+Y4n+Y7n,Co=Y1n+Y4n+Y5n+Y7n\left\{ \begin{array}{lr} D = \overline{Y1_n}+\overline{Y2_n}+\overline{Y4_n}+\overline{Y7_n} ,\\ C_o = \overline{Y1_n}+\overline{Y4_n}+\overline{Y5_n}+\overline{Y7_n} \end{array} \right.

也就是将减数BB、被减数AA和借位CiC_i分别连接到到3-8译码器的A0A0A1A1CiCi,然后对输出YinYi_n取反求和就可以得到全减器的输出。

代码

module decoder1(
    input  wire       A,
    input  wire       B,
    input  wire       Ci,
    
    output wire       D,
    output wire       Co
);
    wire [7:0] Y;
    assign D  = ~Y[1] + ~Y[2] + ~Y[4] + ~Y[7];
  assign Co = ~Y[1] + ~Y[4] + ~Y[5] + ~Y[7];
    decoder_38 myDecoder(
        .E  (1   ), 
        .A0 (B   ), 
        .A1 (A   ), 
        .A2 (Ci  ), 
        .Y0n(Y[0]),
        .Y1n(Y[1]),
        .Y2n(Y[2]),
        .Y3n(Y[3]),
        .Y4n(Y[4]),
        .Y5n(Y[5]),
        .Y6n(Y[6]),
        .Y7n(Y[7])
    );
endmodule