Lesson 4. A decoder in a package: 74HC138 and a running light
In picturesAfter this lesson the library has the 74HC138 — a 3-to-8 decoder — and the canvas has 16 lamps and a running light: a counter chooses the number, two 74HC138 put out the right lamp.
4.1. The idea: number → one wire
Three wires A0 A1 A2 are a number 0–7. The decoder chooses the one output of eight with this number. That is how a processor chooses a memory chip or a device by its address: the top address bits go to a decoder, its outputs go to the "select" inputs of the chips.
4.2. The idea: active 0
The chosen 74HC138 output is 0, the others are 1. In the datasheet Y0…Y7 have a bar. It is more convenient this way: the "select" input of memories and devices also acts on a zero, so the wire goes straight. The enable inputs differ: E1, E2 act on a zero, E3 on a one. That is done on purpose.
4.3. The idea: 4 → 16 from two 3 → 8
The top bit of the number goes to E1 of one chip and to E3 of the other: at 0 the first works, at 1 the second. No extra gates — that is why the 74HC138 has three enable inputs. Decoders with 32 and 64 outputs are built the same way.
4.4. Building
The same project as in lesson 3: the library has the gates and the chips of lessons 1–3.
Step 1. Chip 74HC138 — 3-to-8 decoder
Package pins from the datasheet: 1 A0, 2 A1, 3 A2, 4 E1, 5 E2, 6 E3, 7 Y7, 9 Y6, 10 Y5, 11 Y4, 12 Y3, 13 Y2, 14 Y1, 15 Y0; 8 — GND, 16 — VCC. A0 A1 A2 is a number (0–7); the output with this number becomes 0, the others are 1 (the outputs are active 0). Enable: E1, E2 — active 0, E3 — active 1; when not enabled, all outputs are 1. Inside — packages from lessons 1–2: 74HC04 (inverters), two 74HC08 (combinations and enable), two 74HC00 (outputs).
| Part | Pin | Label |
|---|---|---|
| Input port | output | A0 |
| Input port | output | A1 |
| Input port | output | A2 |
| Input port | output | E1 |
| Input port | output | E2 |
| Input port | output | E3 |
| Output port | input | Y7 |
| Output port | input | Y6 |
| Output port | input | Y5 |
| Output port | input | Y4 |
| Output port | input | Y3 |
| Output port | input | Y2 |
| Output port | input | Y1 |
| Output port | input | Y0 |
| 74HC04 | 1A 1Y 2A 2Y 3A 3Y 4Y 4A 5Y 5A 6A | A0 nA0 A1 nA1 A2 nA2 nE1 E1 nE2 E2 GND |
| 74HC08 | 1A 1B 1Y 2A 2B 2Y 3Y 3A 3B 4Y 4A 4B | nA1 nA0 t0 nA1 A0 t1 t2 A1 nA0 t3 A1 A0 |
| 74HC08 | 1A 1B 1Y 2A 2B 2Y 3Y 3A 3B 4Y 4A 4B | nE1 nE2 g g E3 G G0 G nA2 G1 G A2 |
| 74HC00 | 1A 1B 1Y 2A 2B 2Y 3Y 3A 3B 4Y 4A 4B | G0 t0 Y0 G0 t1 Y1 Y2 G0 t2 Y3 G0 t3 |
| 74HC00 | 1A 1B 1Y 2A 2B 2Y 3Y 3A 3B 4Y 4A 4B | G1 t0 Y4 G1 t1 Y5 Y6 G1 t2 Y7 G1 t3 |
Ctrl+G → name 74HC138. Legs: inputs A0, A1, A2, E1, E2, E3; outputs Y7, Y6, Y5, Y4, Y3, Y2, Y1, Y0.
Step 2. Clock and reset
Clock — 2Hz. The Reset button is CLR, through a 74HC04: the 74HC74 reset acts on a zero.
| Part | Pin | Label |
|---|---|---|
| Clock | output | CLK |
| Button «Reset» | output | CLR |
| 74HC04 | 1A 1Y 2A 3A 4A 5A 6A | CLR nCLR GND GND GND GND GND |
Step 3. Counter 0–15
Two 74HC74 — the same divider as in lesson 2: Q3 Q2 Q1 Q0 count 0–15.
| Part | Pin | Label |
|---|---|---|
| 74HC74 | 1RD 1D 1CP 1SD 1Q 1QN 2QN 2Q 2SD 2CP 2D 2RD | nCLR Q0N CLK VCC Q0 Q0N Q1N Q1 VCC Q0N Q1N nCLR |
| 74HC74 | 1RD 1D 1CP 1SD 1Q 1QN 2QN 2Q 2SD 2CP 2D 2RD | nCLR Q2N Q1N VCC Q2 Q2N Q3N Q3 VCC Q2N Q3N nCLR |
Step 4. Two 74HC138
The three low bits are the number within a group of eight, on A0 A1 A2 of both. The top bit Q3 chooses which one works: on the first it goes to E1 (works at 0), on the second to E3 (works at 1). That is what the enable inputs are for: two 3-to-8 decoders make a 4-to-16 without a single extra gate.
| Part | Pin | Label |
|---|---|---|
| 74HC138 | A0 A1 A2 E1 E2 E3 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 | Q0 Q1 Q2 Q3 GND VCC L0 L1 L2 L3 L4 L5 L6 L7 |
| 74HC138 | A0 A1 A2 E1 E2 E3 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 | Q0 Q1 Q2 GND GND Q3 L8 L9 L10 L11 L12 L13 L14 L15 |
Step 5. 16 lamps
Lamps L0–L15 go straight to the outputs. Put them side by side, in order.
| Part | Pin | Label |
|---|---|---|
| LED | input | L0 |
| LED | input | L1 |
| LED | input | L2 |
| LED | input | L3 |
| LED | input | L4 |
| LED | input | L5 |
| LED | input | L6 |
| LED | input | L7 |
| LED | input | L8 |
| LED | input | L9 |
| LED | input | L10 |
| LED | input | L11 |
| LED | input | L12 |
| LED | input | L13 |
| LED | input | L14 |
| LED | input | L15 |
4.5. Check
Clock—2Hz. Press Reset: all lamps are lit exceptL0.- The dark lamp runs:
L1,L2…L15, thenL0again — one perCLKedge. - At
L7→L8the shadow jumps to the second 74HC138:Q3became 1.
Why a shadow runs and not a light: the 74HC138 output is active 0, the chosen output goes out. On a real board an LED is connected to VCC through a resistor — and it lights exactly on a zero. There a light would run.
| What you see | What it is |
|---|---|
| dark lamp | the chosen 74HC138 output = 0 |
| L0–L7 | first 74HC138 — while Q3 = 0 |
| L8–L15 | second 74HC138 — when Q3 = 1 |
Lesson 4 paste (Cmd+I)
On top of lesson 3.
# Lesson 4 — 74HC138: a 3-to-8 decoder; a running light on 16 lamps (two 74HC138, a counter on two 74HC74).# Paste: Cmd+I on top of lesson 3. chip 74HC138 { portIn(A0) portIn(A1) portIn(A2) portIn(E1) portIn(E2) portIn(E3) portOut(Y7) portOut(Y6) portOut(Y5) portOut(Y4) portOut(Y3) portOut(Y2) portOut(Y1) portOut(Y0) 74HC04(1A=A0, 1Y=nA0, 2A=A1, 2Y=nA1, 3A=A2, 3Y=nA2, 4Y=nE1, 4A=E1, 5Y=nE2, 5A=E2, 6A=GND) 74HC08(1A=nA1, 1B=nA0, 1Y=t0, 2A=nA1, 2B=A0, 2Y=t1, 3Y=t2, 3A=A1, 3B=nA0, 4Y=t3, 4A=A1, 4B=A0) 74HC08(1A=nE1, 1B=nE2, 1Y=g, 2A=g, 2B=E3, 2Y=G, 3Y=G0, 3A=G, 3B=nA2, 4Y=G1, 4A=G, 4B=A2) 74HC00(1A=G0, 1B=t0, 1Y=Y0, 2A=G0, 2B=t1, 2Y=Y1, 3Y=Y2, 3A=G0, 3B=t2, 4Y=Y3, 4A=G0, 4B=t3) 74HC00(1A=G1, 1B=t0, 1Y=Y4, 2A=G1, 2B=t1, 2Y=Y5, 3Y=Y6, 3A=G1, 3B=t2, 4Y=Y7, 4A=G1, 4B=t3)} clock(CLK)button{label="Reset"}(CLR)74HC04(1A=CLR, 1Y=nCLR, 2A=GND, 3A=GND, 4A=GND, 5A=GND, 6A=GND)74HC74(1RD=nCLR, 1D=Q0N, 1CP=CLK, 1SD=VCC, 1Q=Q0, 1QN=Q0N, 2QN=Q1N, 2Q=Q1, 2SD=VCC, 2CP=Q0N, 2D=Q1N, 2RD=nCLR)74HC74(1RD=nCLR, 1D=Q2N, 1CP=Q1N, 1SD=VCC, 1Q=Q2, 1QN=Q2N, 2QN=Q3N, 2Q=Q3, 2SD=VCC, 2CP=Q2N, 2D=Q3N, 2RD=nCLR)74HC138(A0=Q0, A1=Q1, A2=Q2, E1=Q3, E2=GND, E3=VCC, Y0=L0, Y1=L1, Y2=L2, Y3=L3, Y4=L4, Y5=L5, Y6=L6, Y7=L7)74HC138(A0=Q0, A1=Q1, A2=Q2, E1=GND, E2=GND, E3=Q3, Y0=L8, Y1=L9, Y2=L10, Y3=L11, Y4=L12, Y5=L13, Y6=L14, Y7=L15)led(L0)led(L1)led(L2)led(L3)led(L4)led(L5)led(L6)led(L7)led(L8)led(L9)led(L10)led(L11)led(L12)led(L13)led(L14)led(L15)Stuck? Something doesn't work →