题目:使用两片8-3译码器拼接成一片16-4译码器
其中8-3译码器真值表如下图所示:
8-3译码器的代码 如下:
module encoder_83(
input [7:0] I ,
input EI ,
output wire [2:0] Y ,
output wire GS ,
output wire EO
);
assign Y[2] = EI & (I[7] | I[6] | I[5] | I[4]);
assign Y[1] = EI & (I[7] | I[6] | ~I[5]&~I[4]&I[3] | ~I[5]&~I[4]&I[2]);
assign Y[0] = EI & (I[7] | ~I[6]&I[5] | ~I[6]&~I[4]&I[3] | ~I[6]&~I[4]&~I[2]&I[1]);
assign EO = EI&~I[7]&~I[6]&~I[5]&~I[4]&~I[3]&~I[2]&~I[1]&~I[0];
assign GS = EI&(I[7] | I[6] | I[5] | I[4] | I[3] | I[2] | I[1] | I[0]);
//assign GS = EI&(| I);
endmodule
或者使用 case语句的方式:
module encoder_83(
input [7:0] I ,
input EI ,
output reg [2:0] Y ,
output reg GS ,
output reg EO
);
always@(*)
begin
casex({EI,I})
9'b0_xxxx_xxxx: {Y,GS,EO} =5'b000_0_0;
9'b1_0000_0000: {Y,GS,EO} =5'b000_0_1;
9'b1_1xxx_xxxx: {Y,GS,EO} =5'b111_1_0;
9'b1_01xx_xxxx: {Y,GS,EO} =5'b110_1_0;
9'b1_001x_xxxx: {Y,GS,EO} =5'b101_1_0;
9'b1_0001_xxxx: {Y,GS,EO} =5'b100_1_0;
9'b1_0000_1xxx: {Y,GS,EO} =5'b011_1_0;
9'b1_0000_01xx: {Y,GS,EO} =5'b010_1_0;
9'b1_0000_001x: {Y,GS,EO} =5'b001_1_0;
9'b1_0000_0001: {Y,GS,EO} =5'b000_1_0;
default: {Y,GS,EO} =5'b000_0_0;
endcase
end
endmodule
16-4译码器相对于8-3译码器来说,区别在于:4-16对于3-8逻辑是:3-8有一块有输入,4-16就有输入(GS为逻辑或),3-8两块都没输入,4-16才没输入(EO为逻辑与),Y的选择按照优先编码器的规则,先判断高位,再判断低位。
根据功能表可以画出16-4译码器电路图与各个接口之间的关系:
根据上面的电路图即可通过例化两个8-3译码器模块来实现16-4译码器:
module encoder_164(
input [15:0] A ,
input EI ,
output wire [3:0] L ,
output wire GS ,
output wire EO
);
wire EO1;
wire [2:0] Y1;
wire GS1;
wire EO2;
wire [2:0] Y2;
wire GS2;
encoder_83 encoder_83_m1(
.I(A[15:8]),
.EI(EI),
.Y(Y1),
.GS(GS1),
.EO(EO1)
);
encoder_83 encoder_83_m2(
.I(A[7:0]),
.EI(EO1),
.Y(Y2),
.GS(GS2),
.EO(EO)
);
assign L[0] =Y1[0]|Y2[0];
assign L[1] = Y1[1]|Y2[1];
assign L[2] =Y1[2]|Y2[2];
assign L[3]= GS1;
assign GS = GS1|GS2;
endmodule
至此实现16-4译码器。