4장의 내용은 - Register Transfer, Microoperations
; Register Transfer는 레지스터 사이의 데이터를 주고 받는 것 또는 레지스터와 메모리 사이에 데이터를 주고 받는 것
Microopeartions는 말 그대로 아주 기본적인 종류의 오퍼레이션
microoperations는 4가지 종류가 있다.
첫 번째로, Register transfer microopeations ; 레지스터 사이의 데이터 transfer
두 번째로, 연산을 수행
세 번째로, logic(논리회로)
네 번째로, shfit opeartions
우선, Digital module구성 요소
-> 안에서 사용되고 있는 레지스터, 그들이 어떤 기능을 갖고 있는지
-> 아주 작은 단위의 마이크로오퍼레이션으로 만들어지는 프로그램
-> 마이크로오퍼레이션이 어떤 순서로 제어되어야하는지를 나타내는 제어 부분
Microopeations : 어떤 레지스터 안에 저장된 데이터를 대상으로 벌어지는 가장 기본적인 opeartions.
Register Tranfer Languege : 레지스터 사이에서 데이터를 주고 받기 위해 알아야하는 가장 기본적인 표현
보통 Register를 표현할 때 대문자로 표현
MAR : 메모리의 주소를 제공
MDR : 메모리 데이터 저장할 때 거쳐야하는 데이터 레지스터 또는 메모리를 읽어야 할 때
PC : Program Counter 다음에 실행시킬 instructions 주소를 가지고 있음
IR : 메모리에서 instructions을 읽어서 가지고 오면 IR에 저장해두고 어떤 기능을 하는지 decoding하는 작업이 일어남
a) Register의 이름, 몇 비트짜리 레지스터인지는 적혀있지 않음
b) 숫자가 적혀 있음, 레지스터의 비트 위치를 표현, 전체적인 레지스터 크기를 나타내기도함 -> 8비트
c) Register의 이름과 길이를 동시에 제공
d) 반으로 나누어서 프로그램 카운터 (H/L) 2개가 이어붙여져 있음 전체적 크기는 16비트인데 반은 PC High, 반은
PC Low를 표현
< 오른쪽 표 >
대문자를 이용해서 레지스터의 이름 표시
괄호를 사용해서 특정 레지스터의 일부분 ( R2 레지스터의 0-7비트, Low)
화살표를 이용해서 방향 ( R1레지스터에서 R2레지스터로 이동 )
콤마를 사용해서 두 개 또는 그 이상의 마이크로오퍼레이션이 사용된다는 걸 보여줌
당연히 레지스터 사이에서 주고 받는 데이터는 binary로 표현
Source쪽에 들어가있는 레지스터의 데이터는 변하지 않는다.
모든 Transfer는 Parrallel하게 이동
밑에 쪽에 있는 Block Diagram을 보면 Control Circuits에서 P값이 1이 되는 조건이 만족이 되었는지부터 봐야한다. P가 1이 되어 나오면 P Load를 통해 R2값에 1이 물리게 된다. 그렇게 되면 다음 Clock값이 동기화 될 때 R1값이 R2로 옮겨간다. /n으로 되어있는데 n비트짜리 정보가 parallel하게 이동한다는 뜻.
ex) T : R2 <- R1, R3 <- R4 ; 콤마를 이용하여 2개의 마이크로오퍼레이션을 보여주고 T는 조건을 의미, 즉 T의 결과값이 1이 되면 R1의 값이 R2로 R4의 데이터값이 R3로 이동한다는 것을 나타낸다.
ex) P : R2<- R1, R1<-R2 ; P조건이 만족하면 exchange ( 가능한가? 서로 다른 path를 가지고 있고, edge triggered FF를 가지고 있으면)
ex) S ; R2<-R1, R2<-R3 : 이건 불가능, 동시에 같은 R2, 서로 다른 값이 이동하기 때문
위 그림으로 보면 R1에서 한 번에 한 비트 씩 왼쪽으로 밀어내는 것, R2에서는 한 번에 한 비트씩 들어온다.
R1에 8비트 정보가 있다면 클럭이 8번 동기화 될 경우 R1의 레지스터 값이 모두 사라져 0으로 채워진다. 만약 그대로 값을 유지하고 싶다면 feedback형태로 다시 들어오게 해야한다.
만약에 8비트짜리 레지스터 4개가 있다. 그들 사이에 데이터를 주고 받고자 한다면 많은 lines가 필요하다. 그래서 더 효율적인 방법이 뭘까 하다가 만든게 Bus형태이다.
Bus구조 : 밑에 4개의 레지스터 존재 (A,B,C,D) 그 위에는 4x1 MUX 존재, 그 위에는 4-line이 존재. 그리고 Bus 존재
Bus는 구리선들의 집합. 위에서는 4개의 구리선으로 만들어진 BUS를 보고 있는 것이다. Bus가 데이터를 가지고 한 바퀴 돌아서(아래 방향으로) 데이터를 Bus에 실었는데 목적지가 비었다? 그럼 빈 쪽에서 Bus를 모니터링 하고 있는 것, 4비트짜리 버스가 쭉 돌고 있을텐데 여기를 모니터링 하고 있다가 레지스터 B가 목적지네? 그럼 레지스터 B에서 4비트짜리 정보를 감지하고 수신하는 것 이렇게 데이터 전송이 이루어진다.
만약 레지스터가 8비트라면, MUX 8개 필요
버스를 이용할 때는 한 번에 하나밖에 이용못함
R1<-C ; C 레지스터에서 R1레지스터로 옮긴다 C는 Source, R1는 목적지
Three-State ; Control input이 1이면 출력값은 입력값 그대로, 만약 0이면 출력값에 아무것도 나오지 않는다
Three-State를 이용해서 어떻게 버스를 구현하냐면 (밑에 2x4 DEC ; 출력값 4개 중 하나만 1, 어떤값이 1이 나오는지는 Select bit에 의해 결정) DEC에서 나온 값이 4개의 Three-State의 Control input으로 들어가게 된다. 그러면 위에서 말한대로 출력값이 입력값 그대로 나오게 된다. 다른 것들은 출력x
1) 만약 읽기 작업이다? 그러면 memory에서 밖으로 나간다는 것
DR <- M
2) 쓰기 작업이다? 밖에서 memory쪽으로
M <- R1
산술 연산에 대해 배울 건데 빼기는 전에 배웠던 2의 보수 값을 이용
R3 <- R2' + 1 : 2의 보수로 만드는 것
R3 <- R1 + R2' + 1 ; R1 레지스터 값에 R2의 2의 보수값을 더하는 것
FA 하나는 A,B를 입력을 받고 S, C을 출력값을 내보내는 형태 -> 3개의 입력(전에서 올라오는 캐리값 포함) , 출력값 2개
만약 16비트 더하기 연산을 한다고 하면 FA 16개 필요함
더하기는 쉬운데 빼기는 어떻게 할까
먼저 2의 보수를 구한다(R2' (1의 보수) +1) 2의 보수를 구하고 더하면 빼기 연산과 동일
B에 XOR 게이트를 두고 Control bit로 M값을 두었다. M값이 0이면 첫 단에 올림수 0(C0), 그러면 XOR을 통해 결국에는 adder를 하게 된다. M값이 1이면 B값과 1이 XOR, 그럼 결국 나오는 값이 B's Complement. 그럼 C0값이 1. 결국 B'+1 즉, 빼기연산
Increment는 Half Adder를 사용한다.
Function Table을 보면 Select bit 2bit 존재, Cin값은 올림수 값, 이 조합이 어떻게 되냐에 따라서 선택적으로 다양한 연산이 가능하다.
Transfer는 입출력값이 같은것