`timescale 1ns/1ns
module decoder_38(
input E ,
input A0 ,
input A1 ,
input A2 ,
output reg Y0n ,
output reg Y1n ,
output reg Y2n ,
output reg Y3n ,
output reg Y4n ,
output reg Y5n ,
output reg Y6n ,
output reg Y7n
);
always @(*)begin
if(!E)begin
Y0n = 1'b1;
Y1n = 1'b1;
Y2n = 1'b1;
Y3n = 1'b1;
Y4n = 1'b1;
Y5n = 1'b1;
Y6n = 1'b1;
Y7n = 1'b1;
end
else begin
case({A2,A1,A0})
3'b000 : begin
Y0n = 1'b0; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
end
3'b001 : begin
Y0n = 1'b1; Y1n = 1'b0; Y2n = 1'b1; Y3n = 1'b1;
Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
end
3'b010 : begin
Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b0; Y3n = 1'b1;
Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
end
3'b011 : begin
Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b0;
Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
end
3'b100 : begin
Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
Y4n = 1'b0; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
end
3'b101 : begin
Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
Y4n = 1'b1; Y5n = 1'b0; Y6n = 1'b1; Y7n = 1'b1;
end
3'b110 : begin
Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b0; Y7n = 1'b1;
end
3'b111 : begin
Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b0;
end
default: begin
Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1;
Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;
end
endcase
end
end
endmodule
module decoder1(
input A ,
input B ,
input Ci ,
output wire D ,
output wire Co
);
wire Y0n,Y1n,Y2n,Y3n,Y4n,Y5n,Y6n,Y7n;
assign D = ~Y1n | ~Y2n | ~Y4n | ~Y7n;
assign Co = ~Y1n | ~Y4n | ~Y5n | ~Y7n;
decoder_38 decoder_38(
.E (1'b1) ,
.A0(B) ,
.A1(A) ,
.A2(Ci) ,
.Y0n(Y0n) ,
.Y1n(Y1n) ,
.Y2n(Y2n) ,
.Y3n(Y3n) ,
.Y4n(Y4n) ,
.Y5n(Y5n) ,
.Y6n(Y6n) ,
.Y7n(Y7n)
);
endmodule
首先需要知道全减器的原理
真值表如下图。输入值是 低位向本位的借位borrow_in(简称in),被减数a,减数b
输出值为差值diffrent(简称d)和本位向高位的借位borrow_out(简称out)(只有被减数才需要借位,所以in,out都是相对于a来说的)输入值in,a,b的状态组合有八种。
详细分析如下:
in=0,b=0,a=0时,d=a-b=0,此时a的值足够减b,因此不需要向高位借位,所以out=0.
in=0,b=0,a=1时,d=a-b=1,同样的a的值足够减b,因此不向高位借位,所以out=0.
in=0,b=1,a=0时,此时a<b,a的值不足以减b,因此a必须向高位借位,所以out=1,二进制的借位规则是借1当2(就像十进制运算中向上一位是借1当10运算),借完之后a=2,则d=a-b=1.
in=0,b=1,a=1时,d=a-b=0,同样的a的值足够减b,因此a不向高位借位,所以out=0.
in=1,b=0,a=0时,原本a是够减b的,但是这里in=1,表示a的低位向a借位了,可是a=0没有办法借给它,因此a需要向自己的高位借位,所以out=1,a向高位借位之后为2,借给a的低位要减1,所以a=1,d=a-b=1.
in=1,b=0,a=1时,in=1表示a的低位向a借位了,a被借走1,a=0,足够减b,不需要向高位借位,所以out=0,d=a-b=0.
in=1,b=1,a=0时,in=1表示a的低位向a借位了,a=0没有办法借给它,因此a需要向自己的高位借位,所以out=1,a向高位借位之后为2,再借给a的低位要减1,所以a=1,d=a-b=0.
in=1,b=1,a=1时,in=1表示a的低位向a借位了,a=1可以借给低位,借完之后a=0,不足以减b,a要向自己的高位借位out=1,借完之后a=2,d=a-b=1.
原文链接:https://blog.csdn.net/weixin_43400722/article/details/100714046
然后需要知道译码器真值表
然后根据全减器真值表可以得到表达式:

京公网安备 11010502036488号