`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
module encoder_164(
input [15:0] A ,
input EI ,
output wire [3:0] L ,
output wire GS ,
output wire EO
);
wire E01;
wire GS0;
wire [2:0] Y0 ;
wire [2:0] Y1 ;
encoder_83 encoder_83_u0(
.I (A[7:0]),
.EI (E01),
.Y (Y0),
.GS (GS0),
.EO (EO)
);
encoder_83 encoder_83_u1(
.I (A[15:8]),
.EI (EI),
.Y (Y1),
.GS (GS1),
.EO (E01)
);
assign L[3] = GS1;
assign L[2] = Y1[2] | Y0[2];
assign L[1] = Y1[1] | Y0[1];
assign L[0] = Y1[0] | Y0[0];
assign GS = GS1 | GS0;
endmodule
注:EI是表示编码器是否工作,为1工作。
GS是当EI为1且至少有一个输入为高电平时GS=1,表面编码器处于工作状态,否则GS=0。在164中,GS还能表示如果高位编码器有使用则L[3]=GS的功能。
1,assign GS= GS1 | GS0; 由83优先编码器可知,此题目中的E0表示输出给下一级的选中信号 而 GS表示本级有无输入;因此无论使用哪两块83优先编码器 GS都应该拉高
2,如果高位优先编码器没有用到,即输入的数是0~7,即高位优先编码器输入为7'b000_0000.高位优先编码器没有用到,GS1为0 ,即L[3]为0 ;
如果高位优先编码器用到了,即输入的数是8~15,即高位优先编码器输入不是全0. 高位优先编码器被使用 GS1为1 ,即L[3]为1;
因此 assign L[3]= GS1 ;
3、assign L[2:0]=Y1 | Y2 ; 0-15这16个数的二进制最高位已经被GS1所表示,那么剩下的第三位则是完全一致 如果数小于8 那么应该由低位优先编码器给出;如果数大于等于8,那么低三位应该由高优先编码器给出。
标签:编码器,VL16,EI,优先,wire,GS,assign From: https://www.cnblogs.com/Wenz-Mouse/p/18361168