`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 [2:0] y0 , y1 ; wire gs0 , eo0 , gs1 , eo1 ; // HIGH LEVEL encoder_83 enc1( .EI ( EI), .I (A[15:8] ), .Y ( y1), .GS ( gs1), .EO ( eo1) ); // LOW LEVEL encoder_83 enc0( .EI (eo1), .I ( A[7:0]), .Y ( y0), .GS ( gs0), .EO ( eo0) ); assign L[3] = gs1 ; assign L[2:0] = gs1 ? y1 : y0; assign GS = gs0 | gs1 ; assign EO = eo0 & eo1 ; endmodule
优先编码策略 , 若高位部分 , 有有效输入 , ,则优先输出高位编码 , 否则,编码低位部分 。
EO , enable output , 无有效输入时,EO=1 , 表示可以启动下一级编码器 ;
画图可以发现 , 把16位分成高8低8 , 则高8是否有任何一个1决定Y[3]是否等于1 , 2^4 = 16 , 2^3 = 8 ..
如果高8位有有效输入,则优先输出它的编码 , 如果高位没有有效输入 , 输出低位编码 。 Y3=0;
其实看这张图就能理解 , 假设原来是 4选2 。当变成8选3的时候 , 如果高位有效 , 那Y[2]就一直是1 ,Y[1:0]则等于4选2的输出....