x0FANSA-hk 님의 블로그

디코더와 3×8디코더인 74HC138 사용해보기 본문

Planet

디코더와 3×8디코더인 74HC138 사용해보기

x0fansa-hk 2026. 7. 15. 15:11

인코딩과 디코딩

인코딩: 사람이 직관적으로 알아볼 수 있는 정보를 디지털데이터로 바꿉니다.

디코딩: 디지털데이터를 사람이 알아볼 수 있는 정보로 바꿉니다.

 

 이것이 인코딩과 디코딩입니다만, 일반적으로의 사용은 좀 더 상대적입니다. 통상적으로는 보기 쉽게 바꾸면 디코딩, 보기 어렵지만 특정 규칙으로 바꾸면 인코딩이라고 합니다.


Binary Decoder

 위의 설명한내용처럼, 2진수 데이터를 사람이 보기 편하게 바꿔주는 것입니다. 한가지 예시를 들어볼게요. 두더지잡기 게임기가 2개 있습니다. 여러분이 망치 한개로 두더지를 잡아야 합니다.

 

3구 게임기: 두더지 구멍이 3개 있습니다. 두더지가 0~3개가 무작위로 동시에 튀어나옵니다. 또한 각 경우마다 점수가 다릅니다.(특정 구멍에 특정 갯수 두더지마다 전부 점수가 다름)

8구 게임기: 두더지 구멍이 8개나 있습니다. 단 두더지가 반드시 1개만 튀어나옵니다. 역시 각 경우마다 점수가 다릅니다만 두더지가 반드시 1개만 나오기에, 사실상 구멍마다 각자의 점수가 정해져있다고 보면 되는 것이죠.

 뭐가 더 점수계산하기 편할까요? 3구 게임기의 경우 점수표를 외우지 않았다면 매번 갯수를 세고 덧셈을 해야합니다. 8구 게임기의 경우는 구멍마다 각자의 점수가 정해져 있기에, 두더지가 튀어나온것만 보고 점수를 바로 알 수 있습니다. 그러나 게임기를 만드는 회사입장에서는 3구 게임기가 구멍이 5개나 적기에 만들기가 편합니다.

 데이터도 마찬가지 입니다. 같은 양의 데이터를 보내더라도, 데이터라인 3개면 전선 3개로 끝나고, 저장할 비트가 3개면 됩니다. 하지만 각 경우가 뭘 의미하는지 추가적인 해석이 필요합니다. 반대로 데이터라인이 8개라면 전선이 8개나 필요하지만, 추가적인 해석없이 바로 의미를 알 수 있습니다.

 

 여기에서 3구 게임기를 8구 게임기 로직으로 바꿔주는 것을 바이너리 디코더(Binary Decoder)라고 합니다.(보통 논리회로에서 아무런 언급없이 디코더라고 하면 보통 이러한 바이너리 디코더를 지칭합니다.) 어쨌든 두개의 게임기 모두 한턴에 나올 수 있는 경우는 총 8개이니까요. 다만 컴퓨터가 직접 표를 보고 데이터를 해석하는거보다는, 결과만 바로 알려주는게 훨씬 편할때 사용하게 됩니다. (이거대로라면 인코더는 8구 게임기를 3구 게임기로 바꿔주는거라고 봐도 되겠죠?)

 물론 꼭 3비트를 8비트로 바꿔주는것 뿐만아니라, 1비트를 2비트로(1×2디코더), 2비트를 4비트로(2×4디코더), 4비트를 16비트로(4×16디코더)바꿔주는 등 여러 상황마다 다양한 바이너리 디코더가 존재합니다. 


다양한 상황에서의 디코더

 디코더라는 이름이 공학계열에서는 보기 드물게 추상적이기도 합니다. 물론 보통 디코더라고 하면 앞서 설명드린 바이너리 디코더만 따지지만, 다른 상황에서 아예 다른역할을 하는, 그러나 결과적으로 인간이 직관적으로 보기 편하게 해주는 다양한 종류의 디코더도 존재합니다. 여기서는 그런 디코더들을 '간략하게' 다뤄보겠습니다.


7-Segment Decoder

0 1 2 3 4 5 6 7 8 9

(이미지는 위키백과 '7세그먼트 표시 장치'문서의 이미지를 사용하였습니다. 퍼블릭도메인이지만, 덕분에 글에 살을 더할 수 있어서 표기하였습니다.)

 

 위 표처럼 소위 디지털숫자라고 부르는, 7개의 획으로 문자 하나를 표시하는 장치7-Segment라고 합니다. 아마 이름은 몰라도, 일반적으로 7-Segment한자리로 0~9까지를 표현하는걸 본적이 있을 것입니다. 그런데 생각을 해보면, 2진수로 0~9까지는 4비트만으로도 표현이 됩니다.(0b0000 ~ 0b1001) 즉, LED 4개로 숫자를 표현할 수는 있지만, 직관적으로 보기는 어렵습니다. 따라서 LED를 7개 사용하는 대신, 아라비아 숫자 문자와 비슷하게 표현하게 되었습니다. 즉, 인간이 보기는 편하지만, 4비트대신 7비트의 데이터를 입력해야하는(각 LED당 1비트, 총 7비트) 단점이 있습니다. (참고로 7-Segment가 꼭 LED를 사용하는건 아닙니다. 플랩식 등 다양한 방식이 있지만, 여기서는 편의상 LED로 했습니다.)

 따라서 4비트로 0~9까지를 입력받고, 출력으로는 7-Segment에 맞는 7비트를 출력하는 디코더도 존재합니다. 위 회로도의 예시에 있는 74LS46, 47이 대표적인 7-Segment Decoder입니다. 회로도에서 보시다시피, 분명 4비트를 입력했지만, 출력은 A~G까지 7비트가 출력됨을 확인할 수 있습니다.


Instruction Decoder

atmega128 CPU의 Instruction Decoder. 출처: atmel-8151-8-bit-avr-atmega128a_datasheet

 현대 모든 CPU가 사용하는 어셈블리어를 생각해봅시다. 'ADD RAX, 8' 같은 명령어의 경우 레지스터를 건들고 이후 덧셈회로를 진행합니다. 보시다시피, 코드는 순차실행이기 때문에, 동시에 한번에 하나만 동작하고, 나머지는 아무것도 안합니다. 즉 디코더 출력과 비슷한 구조이죠. 그러나 이러한 연산장치 하나를 제어하기 위해 비트 한개가 쓰인다면, 연산기가 n개(ADD, <<, OR ... 등 생각보다 종류가 많아요.)라면 명령어는 n비트가 되어야 합니다. 이게 비효율적이거든요. 그렇다고 명령어 한번에 반전된 비트가 두개 이상을 넣자면, 의도치않은 다른 하나의 연산기가 동작하게 되기에 반드시 디코더출력처럼 반전된 비트는 하나이하여야 합니다. 따라서 이러한 명령어를 짧은 비트로 디코더에 입력하고, 디코더 출력결과로 연산기를 하나만 사용하게 하는 방법을 사용합니다. 이때 명령어를 디코딩하는게 Instruction Decoder입니다. (물론 현대에서는 CPU가 이러한 디코더를 여러개 두고, 중앙 스케쥴러랑 연동되어 한번에 여러 작업을 하는 슈퍼스칼라방식을 사용합니다.)


Video Decoder

RTX4050의 내장된 비디오 디코더. 이 디코더도 각 코덱별로 다시 나뉜다.

 압축된 코덱의 비디오 데이터를 사람이 알아볼 수 있는 시각적 데이터 형태로 디코딩해주는 장치입니다. 혹은 다른 코덱으로 인코딩을 할 때 압축된 데이터를 빠르게 풀기 위해서 사용하기도 합니다. 현대의 동영상을 보여주는 어지간한 기기에서는 대부분 h.264디코더정도는 들어갔다고 봐도 과언은 아닙니다. 당연히 CPU가 소프트웨어로도 디코딩을 할 수는 있습니다만, 비디오 인/디코딩이라는게 상당히 CPU입장에선 괴로운 일인지라(물량 자체가 많고, 코덱이라는게 이전 이후 데이터를 자주 참조해요.) 전력소모와 CPU자원소모가 큰데, 이걸 입력하면 바로 출력이 나오는 디코더회로로 우회해버리니, 전력소모도 줄어들고, CPU도 입력을 넣고 출력만 받으면 되기 때문이죠. (CPU한개만 쓰면서 CPU로만 디코딩을 하는거보다, CPU랑 디코더 둘다쓰지만 디코딩을 디코더가 전담하는게 훨씬 전력효율이 좋아요. 이러한 목적으로 쓰는 특수회로를 ASIC이라고 하는데 이건 나중에 다룰 것입니다.)


74HC138 디코더

https://www.alldatasheet.co.kr/datasheet-pdf/pdf/520307/DIODES/74HC138.html

 

74HC138 데이터시트(PDF)

부품명: 74HC138. 다운로드. 파일 크기: 193Kbytes. 페이지: 10 Pages. 상세설명: 3 TO 8 LINE DECODER DEMULTIPLEXER. 제조업체: Diodes Incorporated.

www.alldatasheet.co.kr:443

 오늘 사용할 IC는 74HC138이라는 디코더 입니다. 3비트의 입력을 받으면 8비트로 출력을 하되, 8비트중 하나만 값이 다르게 출력하여 경우를 구별하게 해주는 논리IC입니다. 아래는 74HC138의 진리표 입니다.

A2 A1 A0 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
0 0 0 0 1 1 1 1 1 1 1
0 0 1 1 0 1 1 1 1 1 1
0 1 0 1 1 0 1 1 1 1 1
0 1 1 1 1 1 0 1 1 1 1
1 0 0 1 1 1 1 0 1 1 1
1 0 1 1 1 1 1 1 0 1 1
1 1 0 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1 1 0

 단, 헷갈리지 말아야 할게 있습니다. 직관적으로 생각하면 8개중 하나만 나오니까 0은 7개, 1이 1개일거 같은데... 74HC138은 반대입니다. 뭔소리냐면 기본적으로 출력 8비트 다 1이고, 선택되는 비트 하나만 0으로 떨어지는, 즉 0이 1개, 1이 7개인 디코더 입니다. (8구 두더지 게임 비유를 하면 두더지가 한번에 7마리가 튀어나오는것(...)이 아니라 두더지가 들어가있으면 1, 튀어나오면 0이라는 것이지요.)


74HC138 디코더의 EN핀

 단, 74HC138도 정상적인 동작을 하기 위한 조건이 있습니다. NE555타이머가 반드시 Reset핀에 High를 넣어야 동작하는 것처럼, 74HC138또한 4,5번핀에는 Low(GND), 6번핀에는 High(VCC)를 입력시켜야 정상적으로 동작합니다. 만약 이 3가지중 하나라도 다르게 연결되어 있다면 입력과는 상관없이 출력은 '11111111'으로 고정됩니다.

 

cf) 왜 굳이 EN핀을 3개나 만들었을까요?

 이번 회로실험에서는 입력을 3비트만 받을 거기에 별 문제가 없지만, 만약 입력이 4비트 이상인데도 3×8 디코더만 사용가능한 경우가 있을수도 있습니다. 이때, 단순히 74HC138을 두개쓴다면 16개의 출력중 하나가 아니라 두개의 0을 가지게 됩니다. 즉, 디코더 기능을 못하는거죠. 그러나 3비트 이상을 각 디코더의 입력과 적절한EN핀에 연결한다면 이러한 문제없이(왜냐하면 여러개의 디코더 중 하나빼고는 반드시 '11111111'만을 출력하게 되니까) 디코더를 확장시킬 수 있습니다.

 


회로실험

 역시 간략한 회로실험을 해보았습니다.

버튼의 경우 위에 올린 사진기준, 왼쪽부터 순서대로 A2, A1, A0입니다. 버튼은 눌리지 않으면 풀다운저항으로 0을 입력하고, 눌리면 VCC직결로 1을 입력합니다. 또한 EN핀은 풀업/다운 저항으로 적절하게 처리하였습니다. 출력장치는 이전에 만들었던, 8비트 LED버스를 사용하였습니다.(출력이 매우 편리합니다!) 사진의 왼쪽LED부터 순서대로 Y0, Y1 ... Y7핀이 연결되어 있습니다.


아무것도 안누름

 아무것도 안눌렀으면 A2, A1, A0 순서대로 '000'이 입력된 상황입니다. 진리표에 따라 '01111111'이 출력되었습니다. 진리표대로 출력됨을 볼 수 있습니다.


가운데 버튼만 누름

 가운데 버튼만 눌렀다면 A2, A1, A0 순서대로 '010'이 입력된 상황입니다. 진리표에 따라 '11011111'이 출력되었습니다 . 진리표대로 출력됨을 볼 수 있습니다.


왼쪽, 오른쪽 버튼만 누름

 왼쪽, 오른쪽 버튼만 눌렀다면 A2, A1, A0 순서대로 '101'이 입력된 상황입니다. 진리표에 따라 '11111011'이 출력되었습니다 . 진리표대로 출력됨을 볼 수 있습니다.


보시다시피 예상대로 결과가 다 잘 나옴을 확인할 수 있습니다.

000 → 01111111 001 → 10111111 010 → 11011111 011 → 11101111
100 → 11110111 101 → 11111011 110 → 11111101 111 → 11111110

 

시연영상


번외. 4번핀을 floating시키고 입력시켜보기

 EN핀중 하나를 조건에 맞지 않게 floating시켜버렸습니다. 그러면 결과는 입력과는 상관없이 반드시 '11111111'이 나와야 겠지요. 버튼을 누르더라도 '11111111'만 출력됨을 볼 수 있습니다.


decoders.zip
0.12MB