简析
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,
全减器
Ci是借位输入,A是被减数,B是减数,D是差,Co是借位输出。
需要注意的是,当A=0,B=1,Ci=0时,被减数小于减数,借位得到2,所以借位输出Co=1,差D=2−1=1;当A=0,B=1,Ci=1时,借位得到2,所以借位输出Co=1,差D=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
结合3-8译码器的表达式可以得到:
{D=Y1n+Y2n+Y4n+Y7n,Co=Y1n+Y4n+Y5n+Y7n
也就是将减数B、被减数A和借位Ci分别连接到到3-8译码器的A0、A1和Ci,然后对输出Yin取反求和就可以得到全减器的输出。
代码
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