An encoder converts an active input signal into a binary code representation.
A priority encoder assigns priority to the highest-order input if multiple inputs are active at the same time.


Example: 8-bit Priority Encoder

Input Output
1XXX_XXXX (111)2
01XX_XXXX (110)2
0000_0001 (000)2
0000_0000 Valid = 0

K-Maps for 4-Bit Priority Encoder

Dout[0]

Din[3][2][1][0] 00 01 11 10
00 X 0 1 1
01 0 0 0 0
11 1 1 1 1
10 1 1 1 1

Simplified Expression:
Dout[0]=Din[3]+Din[2]Din[1]
Valid=|Din

Dout[1]

Din[3][2][1][0] 00 01 11 10
00 X 0 0 0
01 1 1 1 1
11 1 1 1 1
10 1 1 1 1

Simplified Expression:
Dout[1]=Din[2]+Din[3]
Valid=|Din

Verilog Implementation

module PENC4(Din, Dout, Valid);
    input  [3:0] Din;
    output [1:0] Dout;
    output       valid;

    assign Dout[0] = Din[3] | ((!Din[2]) & Din[1]);
    assign Dout[1] = Din[2] | Din[3];
    assign Valid   = |Din;   // reduction OR on Din
endmodule