题解 | #使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器#
使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器
http://www.nowcoder.com/practice/dcfa838e43de4744bc976abee96dc566
使用两个8-3编码器实现,代码如下:
`timescale 1ns/1ns module encoder_83( input [7:0] I , input EI , output wire [2:0] Y , output wire GS , output wire EO ); reg [2:0] Y_reg; reg GS_reg; reg EO_reg; always @(*)begin if(~EI) begin Y_reg = 3'b000; GS_reg = 0; EO_reg= 0; end else begin casex(I) 8'b0000_0000: begin Y_reg = 3'b000; GS_reg = 0; EO_reg = 1; end 8'b1xxx_xxxx: begin Y_reg = 3'b111; GS_reg = 1; EO_reg = 0; end 8'b01xx_xxxx: begin Y_reg = 3'b110; GS_reg = 1; EO_reg = 0; end 8'b001x_xxxx: begin Y_reg = 3'b101; GS_reg = 1; EO_reg = 0; end 8'b0001_xxxx: begin Y_reg = 3'b100; GS_reg = 1; EO_reg = 0; end 8'b0000_1xxx: begin Y_reg = 3'b011; GS_reg = 1; EO_reg = 0; end 8'b0000_01xx: begin Y_reg = 3'b010; GS_reg = 1; EO_reg = 0; end 8'b0000_001x: begin Y_reg = 3'b001; GS_reg = 1; EO_reg = 0; end 8'b0000_0001: begin Y_reg = 3'b000; GS_reg = 1; EO_reg = 0; end default: begin Y_reg = 3'b000; GS_reg = 0; EO_reg = 0; end endcase end end assign Y = Y_reg; assign GS = GS_reg; assign EO = EO_reg; endmodule module encoder_164( input [15:0] A , input EI , output wire [3:0] L , output wire GS , output wire EO ); wire [3:0] Y1; wire GS_1; wire EO_1; wire [3:0] Y2; wire GS_2; wire EO_2; encoder_83 U1( .I(A[15:8]) , .EI(EI) , .Y(Y1[2:0]) , .GS(GS_1) , .EO(EO_1) ); encoder_83 U2( .I(A[7:0]) , .EI((EI)&&(~GS_1)) , .Y(Y2[2:0]) , .GS(GS_2) , .EO(EO_2) ); assign L = ((~GS_1) && (~GS_2)) ? 0 : (GS_1) ? ({1'b0,Y1[2:0]} + 8) : (GS_2) ? ({1'b0,Y2[2:0]}) : 0; assign GS = GS_1 || GS_2; assign EO = EO_1 && EO_2; endmodule