{{위키데이터 속성 추적}}
'''시프트 레지스터'''(shift register)는 [[디지털 회로]]에서 선형 방식으로 설치된 [[프로세서 레지스터]]의 집합이며, 회로가 활성화되었을 때 데이터를 줄 아래로 이동시키는 것과 같은 방법으로 입출력을 서로 연결하고 있다.

== 종류 ==
시프트 레지스터는 '''직렬 입력, 병렬 출력'''(SIPO)과 '''병렬 입력, 직렬 출력'''(PISO) 형태를 포함하여 [[직렬 통신|직렬]]과 [[병렬 통신|병렬]]로 입출력을 결합할 수 있다. 또한 직병렬 입력을 가진 형태와 직병렬 출력을 가진 형태가 있다. 또한 시프트 레지스터의 방향을 다르게 할 수 있는 '''양방향''' 시프트 레지스터도 있다. 그리고 레지스터의 직렬 입력과 출력은 '''원형 시프트 레지스터'''를 만들기 위해 서로 연결할 수도 있다. 하나의 시프트 레지스터는 더 복잡한 연산을 수행할 수 있는 다차원 시프트 레지스터를 만들 수 있다.

=== 직렬 입출력 ===
==== 파괴 판독 ====
이것들은 가장 간단한 종류의 시프트 레지스터이다. 데이터 문자열은 "데이터 입력"에 나타나고, "데이터 상승"이 높아질 때마다 한 단계씩 오른쪽으로 이동한다. 각각 상승되었을 때, 맨 왼쪽("데이터 입력")에 있는 비트는 첫 번째 [[플립플롭]]의 출력으로 이동한다. 맨 오른쪽("데이터 출력")에 있는 비트는 밖으로 이동해서 출력되고 손실된다.

{|align=right border="1" cellpadding="2"

|-
| 0 || 0 || 0 || 0 
|-
| 1 || 0 || 0 || 0 
|-
| 1 || 1 || 0 || 0
|-
| 0 || 1 || 1 || 0
|-
| 1 || 0 || 1 || 1
|-
| 0 || 1 || 0 || 1
|-
| 0 || 0 || 1 || 0 
|-
| 0 || 0 || 0 || 1 
|-
| 0 || 0 || 0 || 0 
|}

데이터는 'Q' 출력의 각각의 [[플립플롭]] 뒤에 저장되므로 이 배열에서 4개의 저장 "슬롯"을 사용할 수 있으며, 따라서 4비트 레지스터이다. 이동하는 모양을 이해하기 위해서, 레지스터가 0000를 유지하고 있다고 상상해 보자.(그래서 모든 저장 슬롯은 비어 있다) "데이터 입력"이 레지스터에 1, 1, 0, 1, 0, 0, 0, 0(각 시간에 "데이터 상승" 펄스마다 이 순서대로. 이것을 클러킹 또는 스토브라고 부른다)을 나타내면, 결과는 오른 쪽 표와 같다. 왼쪽 열은 가장 왼쪽 플립플롭의 출력에 대응되며, 되풀이된다.

그래서 전체 레지스터의 직렬 출력은 00001011(마지막 단계는 세지 않음)이다. 보이는 것과 같이 데이터를 계속 입력한다면, 정확히 입력한 그대로 결과를 얻을 것이지만, 4개의 "데이터 상승" 주기에 의하여 상쇄된다. 이 배열은 [[큐 (자료 구조)|큐]]와 동일한 하드웨어다. 또한, 어떠한 경우에도 전체 레지스터는 리셋(R) 핀을 증가시키면 모든 데이터를 0으로 설정할 수 있다. 이 배열은 "파괴 판독"을 수행한다. 데이터는 맨 오른쪽 비트 바깥으로 이동되면 손실되고 만다.

{{-}}

==== 비파괴 판독 ====
비파괴 판독은 아래에 보이는 설정을 이용하여 얻을 수 있다. 다른 입력 줄이 추가된다 - 읽기(0)/쓰기(1) 제어. 이것이 1(즉, 쓰기)이면 시프트 레지스터는 정상적으로 동작하며, 입력 데이터는 모든 클럭 주기마다 한 칸씩 상승하고, 레지스터의 끝에서 손실된다. 그러나 R/W 제어 신호가 0(즉, 읽기)으로 설정되었으면, 오른쪽 레지스터의 바깥으로 이동하여 출력되는 모든 데이터는 왼쪽의 다음 입력이 되고, 시스템에 저장된다. 그러므로 R/W 제어 신호가 0으로 설정되는 한, 데이터가 시스템으로부터 손실될 수 없다.

이 애니메이션에서, 마지막 4개의 출력 비트는 맨 오른쪽에 보인다. R/W 제어신호가 0으로 설정되었을 때 데이터는 출력되고 레지스터의 입력으로 불러들이지만, R/W가 1이면 데이터는 시프트 바깥으로 나가고 손실된다.

=== 직렬 입력, 병렬 출력 ===
이 설정은 직렬 형태에서 병렬 형태로 변환할 수 있다. 데이터는 위의 직렬 입력, 직렬 출력 (SISO) 부분에서 설명한 것처럼 직렬로 입력된다. 한번 데이터가 입력되면, 각 출력을 동시에 읽어들이거나 바깥으로 이동해 대체될 수 있다.

[[파일:4-Bit SIPO Shift Register.png|frame|center|4비트 직렬 입력 병렬 출력 시프트 레지스터]]

{{-}}

=== 병렬 입력, 직렬 출력 ===
이 설정은 병렬 형태로 D1에서 D4까지 줄에 데이터를 입력한다. 데이터를 레지스터에 기록하기 위해서, 쓰기/시프트 제어신호는 반드시 1으로 고정되어야 한다. 데이터를 이동하기 위해서, W/S 제어 줄은 1 이고 레지스터는 클럭이 입력된다. 배열은 데이터 입력의 D1과 함께 직렬 입력, 직렬 출력(DISO) 시프트 레지스터처럼 동작한다. 그러나 클럭 주기의 횟수가 데이터 문자열의 길이보다 크지 않는 한, 데이터 출력, Q는, 순서대로 병렬 데이터를 읽어들일 것이다. 

[[파일:4-Bit PISO Shift Register.png|frame|center|4비트 병렬입력, 직렬출력(PISO) 시프트 레지스터]]

아래의 애니메이션은 시프트 레지스터의 내부 상태를 포함하여, 쓰기/시프트 순서를 보여준다.

[[파일:4-Bit PISO Shift Register Seq.gif|center]]

{{-}}

이 종류의 시프트 레지스터는 병렬 입력(D0 - D3)로부터 데이터를 취하고 레지스터가 클럭이 입력될 때 일치하는 출력(Q0 - Q3)으로 이동시킨다. 새로운 정보가 준비될 때까지, 시스템의 나머지 부분의 입력인 오래된 정보를 보존하면서, 시프트 레지스터는 "역사"의 종류처럼 사용될 수 있으며, 그래서 레지스터는 클럭이 입력되고, 새로운 데이터는 "통과된다".

[[파일:4Bit PIPO ShiftRegister.svg|frame|center|4 비트 병렬입력 병렬출력 시프트 레지스터]]

{{-}}

주의: 입력 D0 - D3는 Q1 - Q4로 정확하지 않게 표시되었고 가장 높은 열을 뜻한다.

== 사용 ==
시프트 레지스터는 직렬과 병렬 인터페이스를 전환하는 데 가장 일반적으로 사용된다. 이것은 많은 회로가 병렬 비트의 집합으로 동작하기 때문에 유용하지만, 직렬 인터페이스의 구성이 더 간단하다. 시프트 레지스터는 간단한 지연 회로처럼 사용될 수 있다. 몇몇 양방향 시프트 레지스터는 [[스택]]의 하드웨어 구현을 위해서 병렬로 연결할 수도 있다.

시프트 레지스터는 펄스 확장기로 사용할 수도 있다. 단안정 멀티바이브레이터와 비교해서 타이밍은 구성요소의 값에 의존하지 않으나 외부 클럭이 요구되고 타이밍 정확성은 클럭의 입상도(granularity)에 의해 제한된다. 예시 - [[로냐 트위스터]]는 다섯 개의 74164 시프트 레지스터가 이 방법으로 타이밍 논리의 코어를 생성한다.([http://ronja.twibright.com/schematics/twister.png 회로도]).

== 역사 ==
제일 처음 알려진 시프트 레지스터의 사례는 [[1940년대]]의 암호 해독 장비인 [[콜로서스 컴퓨터]]에서 사용된 것이었다. 이것은 [[진공관]]으로 만들어진 5-단계 소자였다.

== 같이 보기 ==
* [[지연선 기억기]]
* [[선형 되먹임 시프트 레지스터]]
* [[원형 버퍼]]
== 외부 링크 ==
{{위키공용분류}}
* [http://www.allaboutcircuits.com/vol_4/chpt_12/index.html 시프트 레지스터] - AllAboutCircuits.com

{{전거 통제}}

[[분류:디지털 레지스터]]