`timescale 1ns/1ns
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
//当高八位I15-I8都为0的时候代表高位的8-3编码器没用到,代表该用低位的8-3编码器 此时高位的EO为1 正好联通低位的EI作为使能信号 这样也能构造高位优先的思想
//总分析,我们编码器是要编码0000-1111 而我们用的8-3编码器去级联8-3编码器的输出是000-111 所以我们级联新增一个高位就行了 因为如果输入全为000的话 输出也全是0 所以当高位片I15-I8全为0 假设是I7为1使用的低位片时 高位的输出是全0 而低位的输出是111 那么16-4编码器的输出是0111要构造为0111 那么 两个芯片的低三位应该是相或的形式,那么高位怎么获得呢,经过分析当我们使用低位片的时候此时高位片的GS是0 当我们使用高位片的时候高位片的GS是1所以用GS来形成高位是最方便的。
//那么最终输出的GS怎么形成呢,也是通过或的形式
module encoder_164(
input [15:0] A ,
input EI ,
output wire [3:0] L ,
output wire GS ,
output wire EO
);
wire [2:0] L_HIGH;
wire [2:0] L_LOW ;
wire GS_HIGH;
wire GS_LOW ;
wire EO_HIGH;
wire EO_LOW;
encoder_83 encoder_83_high(
.I (A[15:8]) ,
.EI (EI) ,
.Y (L_HIGH) ,
.GS (GS_HIGH) ,
.EO (EO_HIGH)
);
encoder_83 encoder_83_low(
.I (A[7:0]) ,
.EI (EO_HIGH) ,
.Y (L_LOW) ,
.GS (GS_LOW) ,
.EO (EO_LOW)
);
assign L = {GS_HIGH,(L_HIGH | L_LOW)};
assign GS = GS_HIGH | GS_LOW ;
assign EO = EO_LOW ;
endmodule
