`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]  Y1;
wire        GS1;
wire        EO1; 
encoder_83 encoder_83_high(A[15:8],EI,Y1,GS1,EO1);

wire [2:0]  Y2;
wire        GS2;
wire        EO2; 
encoder_83 encoder_83_LOW(A[7:0],EO1,Y2,GS2,EO2);



assign GS= GS1|GS2;

assign EO= EO2 ;

assign L[3]= GS1 ;//如果高位优先编码器被使用那么这个数必然大于等于8

assign L[2:0]=Y1 | Y2 ;
 


endmodule

使用两块优先编码器,分别为高8位优先编码器,低八位优先编码器。来表示0-15

通过观察0-7和8-15的二进制发现规律

数字范围8~15时 最高位为1,数字范围0~7时 最高位为0,低三位一模一样,具有对应关系

此代码最重要的是最后四行

1,assign GS= GS1 | GS2; 由83优先编码器可知,此题目中的E0表示输出给下一级的选中信号 GS表示本级有无输入;

因此无论使用哪两块83优先编码器 GS都应该拉高

2,assign EO= EO2 组成16-4编码器后 输出应该是低位的E02 因为高位优先编码器的EO1给到了低位优先编码器的输入EI

3,如果高位优先编码器没有用到,即输入的数是0~7,即高位优先编码器输入为7'b0000000.高位优先编码器没有用到,GS1为0 ,即L[3]为0 ;

如果高位优先编码器用到了,即输入的数是8~15,即高位优先编码器输入不是全0. 高位优先编码器被使用 GS1为1 ,即L[3]为1;

因此 assign L[3]= GS1 ;

4、assign L[2:0]=Y1 | Y2 ; 0-15这16个数的二进制最高位已经被GS1所表示,那么剩下的第三位则是完全一致 如果数小于8 那么应该由低位优先编码器给出;如果数大于等于8,那么低三位应该由高优先编码器给出。