A decoder is used to convert from an N-bit binary code to one of at most 2N possible outputs. The decoder is a common example of a combinational logic circuit.
The following truth table shows a 3 to 8 decoder, a.k.a. an octal decoder.
The three input variables A2
, A1
, and A0
form the binary code,
and the variables X0
to X7
are the eight output variables (23=8).
As can be seen, for any given input only one output variable has the value 1
and all others are 0
.
Note that some decoders have outputs that are the dual of this example, i.e. only one output variable has the value 0
and all others are 1
.
A2 |
A1 |
A0 |
X0 |
X1 |
X2 |
X3 |
X4 |
X5 |
X6 |
X7 |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 |
1 | 0 | 0 | 0 |
0 | 0 | 0 | 0 |
0 | 0 | 1 |
0 | 1 | 0 | 0 |
0 | 0 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 0 | 0 |
0 | 1 | 1 |
0 | 0 | 0 | 1 |
0 | 0 | 0 | 0 |
1 | 0 | 0 |
0 | 0 | 0 | 0 |
1 | 0 | 0 | 0 |
1 | 0 | 1 |
0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 |
1 | 1 | 0 |
0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 |
1 | 1 | 1 |
0 | 0 | 0 | 0 |
0 | 0 | 0 | 1 |
The decoder essentially translates a binary code input into a minterm.
Because of this, any Boolean expression in a sum of products form can be implemented
with a decoder and OR gates.
For example, if we look at the full adder's truth table, we see that the S
output
is 1
for minterms m1, m2, m4 and m7.
Now using the octal decoder described above, we could connect A
, B
, and Cin
to the decoder inputs
A2
, A1
, and A0
in that order, then take the decoder outputs X1
, X2
,
X4
, and X7
as input to an OR gate, the output of which would be S
.
Below is the Verilog code for a structural model of an octal decoder with an enable input. An enable input is found on many decoders and can be used, for example, to link two 3 to 8 decoders to build a 4 to 16 decoder.
module octal_decoder(X0, X1, X2, X3, X4, X5, X6, X7, A2, A1, A0, E);
output X0; // Minterm 0
output X1; // Minterm 1
output X2; // Minterm 2
output X3; // Minterm 3
output X4; // Minterm 4
output X5; // Minterm 5
output X6; // Minterm 6
output X7; // Minterm 7
input A2; // Input binary code most significant bit
input A1; // Input binary code middle bit
input A0; // Input binary code least significant bit
input E; // Enable signal
wire A2n; // A2 negated
wire A1n; // A1 negated
wire A0n; // A0 negated
not(A2n, A2);
not(A1n, A1);
not(A0n, A0);
and(X0, A2n, A1n, A0n, E); // Minterm 0: 000
and(X1, A2n, A1n, A0, E); // Minterm 1: 001
and(X2, A2n, A1, A0n, E); // Minterm 2: 010
and(X3, A2n, A1, A0, E); // Minterm 3: 011
and(X4, A2, A1n, A0n, E); // Minterm 4: 100
and(X5, A2, A1n, A0, E); // Minterm 5: 101
and(X6, A2, A1, A0n, E); // Minterm 6: 110
and(X7, A2, A1, A0, E); // Minterm 7: 111
endmodule
A simulation with test inputs gave the following wave form:
Kleitz, W. Digital Microprocessor Fundamentals. 3rd Edition. Prentice Hall, 2000.
Mano, M. Morris, and Kime, Charles R. Logic and Computer Design Fundamentals. 2nd Edition. Prentice Hall, 2000.
Copyright © 2014 Barry Watson. All rights reserved.