레지스터
int a;
int b;
int c = a + b;
- 여기서 c를 계산하기 위해선 a와 b를 레지스터로 가져와야 한다.
4-bit 레지스터의 구현
- D 플립플롭 4개를 사용한다.
- LOAD ( Write ) 신호를 이용해 레지스터에 값을 새로 설정할 타이밍을 정할수 있다.
- LOAD가 0일시 값이 변하지 않고 유지된다.
- 각각의 flip-flop 또한 preN과 clrN 통해 값을 설정할수 있다.
- 모든 레지스터의 output은 ALU에 연결되기도 하는데, 공유버스에서 여러 레지스터가 얽히는것을 방지 하기 위해
tri state buffer를 설치한다.
- 이를 통해 버스 중재를 한다.
Shift register
- n-bit 레지스터에 Shift bit 입력을 받아 레지스터 동작 또는 시프트 동작을 하도록 할수 있다.
-
개별 입력에 4*1 MUX를 구성하고
- Sh : 0 / L : 0 일시 원래 값 유지 >> Q 출력을 그대로 가져와 D 입력에 넣는다.
- Sh : 0 / L : 1 일시 새로운 값 load >> 새로운 값을 병렬로 입력 받는다.
- Sh : 1 / L : ? 일시 직렬 입력을 받는다 >> 즉 맨 왼쪽은 새로운 비트 입력, 나머지에는 쉬프트가 일어난다.
Binary counter
- Counter
- Binary Counter
- 한번 동작 시 마다 2진수가 1씩 증가하는 카운터.
- 3bit counter의 동작 예시
- 000 > 001 > 010 > 011 > 100 > 101 > 110 > 111 > 000
- 다시 0으로 되돌아온다.
3-bit Binary counter의 구현
- 3개의 T Flip-flop을 사용한다.
- 3번째 비트 : 계속 반전되기 때문에 1을 넣는다.
- 2번째 비트 : 이전의 3번째 비트가 1일때 반전되기에 3번째 비트를 그대로 넣는다
- 1번째 비트 : 이전의 2, 3 번째 비트가 둘 다 1일때 반전되기에 둘을 AND 하여 넣는다.
용도
- 프로그램 카운터에 사용될수 있다.
- 분기 명령어에 도달할시 임시 값으로 지정할수도 있다.
3-bit Binary counter 구현의 접근
1. 트랜지션 테이블의 작성
- 이전 상태의 3비트와 다음 상태의 3비트 및 변화를 위해 필요한 T 플립플롭의 입력을 테이블로 작성한다..
2. 카르노 맵 만들기
- 이를 각각 C, B, A 입력에 대한 TC, TB, TA 출력으로 간주해 카르노맵을 작성한다.
TA=1
TB=A
TC=AB
3-bit Binary counter를 3개의 D Flip-flop 으로 구현하기
DC=CBA+CB′+CA′
DB=B′A+BA′ - B와 A의 XOR 과 동일하다.
DA=A′
SR / JK 플립플롭에 대해 카운터 구성하기
- C 에서 C+ 로 값이 변하는데 사용되는 Sc 와 Rc 비트를 찾으면 된다, 즉 최우측의 길이가 2배가 된다.
- 여기서 중요한 점은 각각의 Transition에 사용되는 S와 R 비트인데
- Transition시 두가지의 SR 비트가 존재하는 경우가 있는데, 이 경우
- S나 R중 다르게 사용되는 비트를 Don't care로 간주하면 된다.
- 0이나 1중 아무거나 들어와도 상관이 없기 때문이다.
- 결과
이를 이용해 SR 플립 플롭으로 커스텀 카운터를 구현한 예시
010과 011은 상태에 포함되지 않아 전부 Don't care로 되어 있다
Don't care를 고려해 카르노맵을 작성 및 Prime implicant를 뽑아낸다
JK 플립플롭 또한 사용되는 J/K 비트를 확인해 Don't care로 바꿀 필요가 있다.
Counter
- 임의의 순서로 반복하는 카운터 또한 만들수 있다.
- Ex. 000 > 100 > 111 > 010 > 011 > 000 ( 반복 )
- 위의 방식대로 트랜지션 테이블과 카르노맵을 이용해 구현할수 있다.
- 입력으로 들어올수 없는 / 상태로 될수 없는 경우는 Don't care로 처리한다.