`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,那么低三位应该由高优先编码器给出。