시프트 레지스터 마스터하기: 직렬에서 병렬로의 변환
시프트 레지스터는 D 플립플롭을 연결해 클록 펄스마다 데이터를 한 비트씩 이동시킵니다. SIPO, PISO, PIPO 변형을 만들고 UART와 LED 매트릭스 드라이버에서의 활용법을 알아봅니다.
요약: 시프트 레지스터는 각 단계의 출력을 다음 단계의 입력으로 연결한 D 플립플롭 체인입니다. 클록 에지마다 모든 비트가 한 자리씩 이동합니다. 구성에는 SISO, SIPO(직렬-병렬 변환, 74HC595 LED 드라이버에 사용), PISO(병렬-직렬 변환, UART 송신기에 사용), PIPO가 있습니다.
시프트 레지스터는 클록 주기마다 하드웨어 안에서 데이터를 한 비트씩 이동시킵니다. 직렬 전송과 병렬 저장 사이를 잇는 다리입니다. UART, LED 드라이버, 직렬화기, 역직렬화기, 일부 프로세서의 시프트 데이터 경로에도 관련 구조가 쓰입니다. 다만 고성능 시프터는 조합 논리 배럴 시프터 네트워크를 대신 사용할 수 있습니다.
시프트 레지스터란 무엇인가?
시프트 레지스터는 본질적으로 동기식 순차 회로입니다. 보통 D_FLIP_FLOP을 사슬처럼 이어 ‘버킷 브리게이드’ 방식으로 연결합니다. 체인의 각 단계는 정확히 한 비트의 데이터를 저장합니다. 클록 펄스가 도착하면 레지스터의 모든 비트는 기차에서 승객이 한 자리씩 옮겨 앉는 것처럼 오른쪽(또는 왼쪽)으로 한 칸 이동합니다.

digisim.io의 SHIFT_REGISTER 컴포넌트는 이 복잡성을 추상화하지만, 개별 D_FLIP_FLOP 유닛으로 직접 만들면 전파 과정을 가장 뚜렷하게 볼 수 있습니다.
수학적 기초
시프트 레지스터 한 단계의 동작은 D_FLIP_FLOP의 특성 방정식으로 결정됩니다.
다단 시프트 레지스터에서는 번째 단계의 입력 가 번째 단계의 출력 에 연결됩니다. 따라서 시각 에서 전체 레지스터의 상태는 다음과 같이 나타낼 수 있습니다.
이 단순한 관계 덕분에 데이터가 하드웨어를 따라 ‘흐를’ 수 있습니다.
데이터 이동의 네 가지 형태
모든 시프트 레지스터가 같은 것은 아닙니다. 데이터가 들어오고 나가는 방식에 따라 네 가지 주요 유형으로 나뉩니다. 어떤 응용에든 알맞은 구성을 고르려면 이 차이를 이해하는 일이 중요합니다.
1. SISO: 직렬 입력, 직렬 출력
입력: 클록 주기마다 한 비트. 출력: 지연된 한 비트를 클록 주기마다 출력.
SISO는 가장 단순한 형태입니다. 데이터는 한 번에 한 비트씩 들어가고 반대쪽 끝에서 한 번에 한 비트씩 나옵니다. 이는 디지털 주기 지연으로 동작합니다. 4비트 SISO 레지스터에서는 지금 들어온 비트가 네 번의 활성 클록 에지 뒤에 맨 끝 출력에 나타납니다. 그래서 SISO 레지스터는 이미 동기화된 제어 또는 데이터 스트림의 타이밍을 맞추는 데 유용합니다. 일반적인 시프트 레지스터만으로는 완전한 클록 도메인 교차 해법이 되지 않습니다.
2. SIPO: 직렬 입력, 병렬 출력
입력: 클록 주기마다 한 비트. 출력: 모든 비트를 동시에 이용 가능.
SIPO는 ‘확장’ 구성입니다. 직렬 비트 스트림을 입력하고 레지스터가 채워지면 모든 출력()을 동시에 읽습니다. 직렬 입력·병렬 출력 장치는 더 적은 컨트롤러 핀으로 여러 표시기를 제어하는 등 디지털 출력을 확장하는 데 흔히 사용됩니다. 아래에서 다루는 74HC595 IC는 시프트 레지스터와 별도의 출력 저장 레지스터를 결합합니다.
3. PISO: 병렬 입력, 직렬 출력
입력: 모든 비트를 동시에 로드. 출력: 클록 주기마다 한 비트.
PISO는 SIPO와 반대로 동작합니다. 데이터 버스의 8비트처럼 데이터 ‘워드’ 전체를 받아 개별 비트 스트림으로 직렬화합니다. UART 송신기에는 이 일반 기능이 들어 있으며, 그 주위에 프레이밍, 보드레이트, 패리티, 상태, 버퍼링 논리가 갖춰집니다.
4. PIPO: 병렬 입력, 병렬 출력
입력: 모든 비트를 동시에 로드. 출력: 모든 비트를 동시에 이용 가능.
PIPO는 데이터를 병렬로 로드하고 병렬로 출력할 수 있습니다. 그 자체로는 클록 에지에서 워드를 포착하는 표준 레지스터처럼 동작합니다. ‘범용’ 시프트 레지스터는 제어 신호로 선택하는 병렬 로드와 좌·우 시프트 모드를 결합합니다. 오버플로가 없는 부호 없는 값에서는 한 비트 논리 좌측 시프트가 두 배가 되고, 논리 우측 시프트는 2로 나눈 뒤 내림한 값이 됩니다. 부호 있는 산술과 오버플로에는 추가 주의가 필요합니다.

기술 사양: 4비트 SIPO 진리표
4비트 SIPO(직렬 입력, 병렬 출력)가 네 클록 주기에 걸쳐 어떻게 동작하는지 살펴보겠습니다. 가장 오른쪽 비트부터 시작하여 이진 수열 을 시프트 입력한다고 가정합니다.
| 클록 펄스 | 직렬 입력() | ||||
|---|---|---|---|---|---|
| 초기 상태 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 | 0 | |
| 1 | 1 | 1 | 0 | 0 | |
| 0 | 0 | 1 | 1 | 0 | |
| 1 | 1 | 0 | 1 | 1 |
에 들어온 ‘1’이 에서 , 을 거쳐 마침내 으로 이동한 것을 확인하세요. 이것이 시프트의 실제 동작입니다.
흔한 함정: 타이밍과 전파 지연
모든 단계는 같은 활성 에지에서 입력을 샘플링합니다. 플립플롭은 클록-대-Q 지연이 지난 뒤에야 출력을 바꾸므로, 이전에 저장된 값은 한 단계 앞으로 이동합니다. 올바른 동작을 위해서는 최대 지연에 대한 셋업 검사와 최소 지연에 대한 홀드 검사를 모두 만족해야 합니다.
중요한 매개변수는 세 가지입니다.
- 셋업 시간(): 클록 에지 이전에 데이터가 안정되어 있어야 하는 최소 시간입니다.
- 홀드 시간(): 클록 에지 이후에도 데이터가 안정적으로 유지되어야 하는 최소 시간입니다.
- 클록-대-Q 지연(): 활성 클록 에지부터 출발 단계의 출력이 바뀔 때까지의 시간입니다.
단계 간 직접 연결의 단순화된 홀드 조건은 다음과 같습니다.
여기서 양의 는 클록 스큐 안내서에서 사용하는 부호 규약에 따라 캡처 클록이 더 늦게 도착함을 뜻합니다. 셋업은 최대 클록-대-Q 지연과 배선 지연을 사용합니다. 정적 타이밍 분석은 대상 장치의 특성화된 지연으로 이 검사를 수행합니다. 기능 파형 뷰어만으로는 물리적 타이밍 클로저를 보장할 수 없습니다. 기본 제약은 셋업, 홀드, 메타안정성에서 확인하세요.
OSCILLOSCOPE_8CH로 동작 검증하기
SHIFT_REGISTER_8BIT를 만들 때 OUTPUT_LIGHT 컴포넌트만 봐서는 충분하지 않습니다. 높은 클록 속도에서는 너무 빠르게 깜박여 사람이 추적할 수 없기 때문입니다.
회로를 제대로 검증하려면 다음과 같이 하세요.
- CLOCK를 OSCILLOSCOPE_8CH의 채널 1에 연결합니다.
- 직렬 입력을 채널 2에 연결합니다.
- 병렬 출력(부터 까지)을 남은 채널에 연결합니다.
시뮬레이션을 실행하면 계단형 패턴이 나타나야 합니다. 샘플링된 직렬 비트는 첫 활성 에지 뒤 첫 단계에 나타나고, 이후 각 에지마다 한 단계씩 전진합니다. 이 화면으로 비트 순서, 인에이블, 리셋, 주기 수에서 발생한 논리 오류를 찾으세요. 모델에 특성화된 지연이 없다면, 겉으로 보이는 파형 정렬은 실제 하드웨어의 셋업 및 홀드 타이밍을 입증하거나 반증하지 못합니다.
실제 응용: 1978년부터 오늘까지
시프트 레지스터는 단순한 학습용 예제가 아닙니다. 전자 산업의 든든한 일꾼입니다.
1. 74HC595와 LED 제어
74HC595는 별도의 저장 레지스터가 있는 8비트 직렬 입력·병렬 출력 시프트 레지스터입니다. 컨트롤러는 데이터를 시프트한 뒤 래치 신호로 8개 출력 비트를 모두 함께 갱신할 수 있습니다. 장치를 직렬로 연결할 수는 있지만, 부하의 수와 종류는 출력 전류, 총 패키지 전류, 클록 속도, 신호 무결성, 갱신 요구 사항에 의해 제한됩니다. 대형 LED 시스템에는 무제한 직접 확장이 아니라 적합한 드라이버가 필요합니다.
2. Intel 8086과 UART/USART
Intel 8086에는 통합 UART가 없었습니다. 시스템은 Intel 8251A USART 같은 주변 장치와 함께 사용할 수 있었습니다. 개념적으로 프로세서는 바이트를 병렬로 주변 장치에 기록하고, 송신 논리는 프레임을 구성해 비트를 직렬선으로 시프트합니다. 수신 논리는 직렬 프레임을 샘플링하여 복원한 바이트를 병렬 버스에서 사용할 수 있게 합니다. 현대 UART 구현은 기본 시프트 동작 주위에 보드레이트 생성, 시작/정지 비트 처리, 상태 플래그, 버퍼링을 더합니다.
3. 곱셈과 나눗셈
이진수를 한 자리 왼쪽으로 시프트하는 것은 수학적으로 2를 곱하는 것과 같다는 사실을 알고 있나요?
현대 ALU(산술 논리 장치)는 이런 연산을 한 클록 주기에 수행하기 위해 고속 시프트 레지스터를 사용합니다.
digisim.io에서 첫 시프트 레지스터 만들기
직접 만들어 볼 준비가 되었나요? 다음 단계에 따라 4비트 SIPO 레지스터를 만들어 보세요.
- 단계 배치: 캔버스에 D_FLIP_FLOP 컴포넌트 네 개를 놓습니다.
- 데이터 체인 연결: 첫 번째 플립플롭의 출력을 두 번째 플립플롭의 입력에 연결합니다. 모든 단계에서 반복합니다.
- 공통 클록: CLOCK 컴포넌트를 놓고 네 개 모두의 플립플롭 클록 입력에 연결합니다. 이들은 반드시 동기식이어야 합니다.
- 입력과 출력: INPUT_SWITCH를 첫 플립플롭의 입력에 연결합니다. 각 출력에는 OUTPUT_LIGHT를 연결합니다.
- SimCast의 장점: SimCast 기능으로 회로의 동작을 녹화합니다. 입력 스위치를 토글하고 클록을 펄스한 뒤, ‘1’이 조명 사이를 이동하는 모습을 지켜보세요.
마무리
시프트 레지스터는 단순한 부품을 조합해 복잡한 동작이 나타날 수 있음을 가장 잘 보여 줍니다. 플립플롭 몇 개만 연결해도 데이터 형식을 변환하고, 신호를 지연시키며, 산술 연산을 수행할 수 있습니다.
각 단계 데이터 입력에 멀티플렉서를 배치해 SHIFT_REGISTER와 결합하고, 제어 스위치에 따라 왼쪽과 오른쪽 어느 방향으로나 시프트할 수 있는 4비트 양방향 시프트 레지스터를 만들어 보세요.
SISO, SIPO, PISO, PIPO 모드를 계속 살펴보거나, 이 교육 모델의 저장 요소를 다루는 D 플립플롭 컴포넌트 참조를 열어 보세요.


