[12주차 1강]
프로그램을 실행시킬 때 거치는 과정 Instruction Cycle
첫 번째 작업이 Fatch - 메모리에서 데이터를 가져오는 것
두 번째 작업이 Decode - Instruction의 목적
세 번째 작업은 주소를 읽어온다 만약 간접주소일 경우 effective address를 읽는다
마지막 작업이 실행한 후 결과를 저장, HALT명령이 내려지기 전까지 실행
Fetch and Decode
가장 먼저 Program Counter안에 주소가 들어간다. 그리고 클럭으로 동기화 될 때마다 1씩 증가
오른쪽 회로 그림은 SC가 0일 때 시작을 한다, 4비트에 0이 모두 들어간다. Decoder이기에 하나만 1로 출력, SC의 입력값이 모두 0이었기에 t0만 1로 된다. 클럭이 동기화되고 Increment가 1 증가하게 되면 오른쪽 끝부터 1000이 들어가게 된다. 그 후 T0, T1에서 일어나는 작업을 위에 설명해놓은 것이다
위에 설명과 그림 모두 왼쪽에 있는 T0, T1, T2에 대한 설명이므로 그림을 보면서 이해해보자
T0이 발생하게 되려면 위에서도 적었듯이 4비트 모두 0이 들어온다. 그리고 T0가 어디에 물려있냐면 S1에 물려있다.
그렇게 되면 T0의 상황에서는 S2=0, S1=1, S0=0이 되고 이 값은 2가 된다. 이것은 PC에 해당하고 PC가 Bus를 사용가능
그리고 T0는 AR의 Load단자와 연결되어있다. 왼쪽 설명을 보면 PC값이 -> AR로 이동하게 된다. 즉 PC값이 Bus를 타고
이동하며 AR의 Load단자 또한 활성화 되기 때문에 Bus에 존재하는 값이 Load단자를 타고 AR로 이동하게 되는 것이다.
또 하나는 SC+1인데 이건 Increment에 1이 들어가게 되어 증가하게 된다
다음은 T1. Address Register에 존재하는 주소값을 이용해서 메모리가 읽어 IR로 이동시킨다. 또 PC+1, SC+1이 있어 다음에 T2로 넘어가게 한다. 위 그림에서 보면 T1은 S2, S1, S0과 모두 연결되어있어 모두 1을 전달해준다. 그러면 값은 7이 되고 그림에서도 보이듯이 MU가 버스를 이용한다. 그리고 T1이 연결된 것이 IR에 Load로 들어간다. 그러므로 IR는 버스에서 받아들인다. 이것이 첫번째 IR <= M[AR]에 해당. T1이 PC와도 연결되어있으므로 PC는 PC+1이 된다.
다음은 T2. 그림에서는 T2가 보이지 않지만 IR의 12-14까지 Decoding이 된다. 그래서 D0-D7까지 하나의 값만 1로 들어가게 되는 것 (오른 쪽 작은 그림의 빨간 동그라미 부분), 그 다음으로 IR에 들어가있는 주소값(0-11)이 AR로 옮겨진다. 또한, IR의 15에 해당하는 값은 I로 들어가게 되는데 I는 직접주소방식인지 간접주소방식인지 결정해주는 곳. 그리고 SC+1로 증가
Instruction을 가져와서 Instruction Register에 집어넣으면 제일 먼저 해야할 것이 무슨 유형의 Instruction인지 알아야한다. 저번 시간에 Instruction의 3가지 유형을 배웠다. 그것을 어떻게 구분하냐?
IR의 12, 13, 14의 값이 3X8 Decoder입력으로 들어간다. 그리고 그 결과로 하나의 값이 1로 나오게 되는데, 가장 먼저 봐야할 것이 D7이 1이냐 아니냐를 봐야한다. 만약 D7이 0이 나왔다면 나머지 부분(D0-D6) 중 하나가 1이라는 뜻, 또한 메모리와 관련된 Instruction이라는 것을 알 수 있다. 그리고 I가 1인지 아닌지 확인
그리고 또 봐야할 것이 D7이 1이면 12, 13, 14bit값이 모두 1이다. 그렇게 되면 D7부터 12, 13, 14가 모두 1로 되어 1111형태이면서 이것은 Input/Output 관련된 Instruction이라는 것을 알 수 있다.
그렇지 않은 경우는 맨 왼쪽이 0이 라는 것이고 남은 Instruction인 Register Instruction이라는 것을 알 수 있다.
SC가 0부터 시작, T0 시그널이 발생하면 PC에 있는 값을 AR로 보내고 그 주소를 이용해서 메모리에서 읽어서 IR로 보내고 그것과 동시에 PC+1 (Petch), 이제 Decode가 일어나는데 IR의 (12-14)를 Decode하여 D7이 1이냐 0이냐를 따져준다.
그것과 동시에 IR(0-11) 정보를 AR로 옮기고 맨 마지막 IR(15)을 I로 옮긴다.
만약 D7이 0이라면 I가 0이면 직접주소, 1이면 간접주소, 간접주소인 경우 메모리에 한 번 더 접근해야 AR를 구할 수 있다. 위 과정이 다 지나면 메모리 관련된 Instruction (7가지) 유형이 있을 텐데 각 주소 방법에 따라 실행시킨다.
반면에 D7이 1이었다면 I를 확인하고 I값이 1이라면 1111이 되므로 I/O Instruction에 해당, 0이라면 Register Instruction
D7이 0이고 I가 1이면, 간접 주소 방식으로 Memory Instruction, 위에서 설명한 것과 같은 개념이지만
간접주소인 경우 Memory에 한 번 더 접근해서 effective address를 구해야한다. 그렇지만 직접주소인 경우 AR로 옮긴 것이 이미 effective address가 되기 때문에 Nothing이 되는 것.
이번에는 Register-Reference Instruction. Register와 관련된 것은 항상 I가 0으로 시작
위 숫자들을 보면 0111은 고정되어있지만 나머지 비트에서 1은 항상 하나만 존재하기 때문에 각 위치가 달라질때마다 같은 Register-Reference라고 하더라도 약간의 차이가 존재한다. 위에 T0, T1, T2는 항상 같지만 I'D7T3B11은 B11에 1이 존재한다는 뜻이고 B11에 연결되면 Clear AC 기능을 하게 된다. 또 다른 기능으로는 Error flag가 존재하는데 overflow와 carryout 유무를 확인한다. S flag는 0은 stop, 1은 start로 기능
B0-4까지는 모두 PC값이 PC+1로 되는데 이것은 다음 Instruction으로 건너띄라는 뜻
여기서 헷갈리는 것이 PC의 위치인데 왼쪽 아래 그림처럼 현재 101번째를 수행중이면 현재 PC는 102로 들어가있다. 만약 여기서 PC+1이 되면? 102에서 1 증가시킨 103이 되고 다음 수행은 103에서 하게 되는 것이다.
-> PC의 위치는 현재 수행 중인 곳이 아닌 다음 공간
위에 그림은 모두 왼쪽비트가 0이므로 직접 주소 방식
첫 번째 D0면 왼쪽 4개 비트 모두 0이기에 다른 비트가 1로 나온다. 이 때는 AC와 M[AR]을 ^연산을 취한 후 AC에 저장
D1이 뜨면 +연산, D2가 뜨면 Loading, 메모리의 값을 읽어서 AC에 전달, D3가 뜨면 저장 등등 (36분 설명만 다시보면 될듯)
그림을 통해 설명
메모리는 맨 위에 존재, 거기서 데이터를 읽고 AC로 옮기는데 그 때 당연히 Bus를 이용, 하지만 Bus를 통해 AC로 직접 연결된 path는 존재 x, 대신에 DR연결이 되고 DR에 있는 Special Path를 통해 AC로 연결이 된다. 버스에서 AC로 직접 연결이 되지 않는 이유는 혹시라도 그 앞에 있는 Adder Logic Part에서 뭔가 작업을 해야한다면 이건 한 Cycle안에 끝나지 않을 가능성이 크기 때문에, DR에 저장해두고 다음 Cycle에 연산 작업을 수행. 그 결과가 다시 AC에 저장
D4의 경우 AR에 있는 값을 PC로 옮겨주면 다음 Instruction은 PC에서 제공하는 주소를 이용해서 메모리에서 읽어온다.
D5는 위 경우와 비슷한데 돌아올 곳의 주소를 저장해주는 것이 추가, 먼저 PC에는 돌아올 곳의 주소가 저장되어있을 것
근데 이제 그 값을 M[AR]에 저장하고, AR+1을 시킨 후 PC로 넘겨준다. BSA는 subroutine이나 procedure call을 사용할 때 많이 쓰이는데 그것에 대한 설명이 아래 빨간 세모 그림
아래 표를 보면 왼쪽은 전, 오른쪽은 후를 나타냄
D6은 ISZ, 0110
우선 메모리에서 데이터를 읽고 DR로 가져온다, 그리고 그 값을 1 증가, 그 값을 다시 M[AR]에 저장하는데 그 값이 0인지 아닌지 체크를 해서 0이면 PC는 PC+1(다음 instruction을 건너띄어라)
마지막에는 모두 SC를 0으로 만드는 microoperation이 존재한다.
keyboard로부터 비트 단위로 입력을 받아 Transmitter Interface가 처리를 해 INPR로 넘겨주고 여기서 어느 정도 차면 FGI가 1로 된다. 그럼 AC로 넘겨주고 다시 FGI는 0으로 된다. 그럼 AC가 OUTR로 보내고 이 때 FGO는 1에서 0으로 된다. OUTR에 있는 값을 Receiver Interface가 받아 Printer가 작업을 수행하게 되면 다시 FGO는 1로 된다.
I/O Instruction은 D7 =1, I = 1 (앞 4비트가 모두 1) : 뭐가 있는지 살펴보는 파트
Program Interrupt를 설명하는 파트
CPU 통제로 I/O 처리를 하는 것은 매우 비효울, 위에 ex에서 이 내용을 설명 CPU가 flag값을 체크하는데 너무 많은 시간을 소모하게 되어 비효울적
그래서 만들어진 개념이 Interrupt : 외부 divice가 interrupt를 발생시켜 컴퓨터에게 알려줌 (CPU가 flag값을 체크하는 과정을 생략)
아래 그림 -> CPU는 Instruction작업을 수행하다가 interrupt가 발생 -> 우선적으로 interrupt처리를 위해 Interrupt Service Routine에서 처리 -> 다시 되돌아와서 작업 수행
IOF : IEN이 clear된 상태라면 interrupt 발생 x
ION : IEN이 set된 상태라면 interrupt 발생o
위에서 설명한 Interrupt발생 여부가 위 그림에서 R로 설명된다. R이 1이면 Interrupt가 발생해 cycle로 들어간다.
PC의 값이 다음에 실행해야 할 Instruction의 주소값이므로 M[0번지]에 그 값을 저장켜준다. 그리고 1번지에 있는 값을 PC가 받는다. 그러면 IEN은 0, R로 0이 된다. 이 뜻은 Interrupt처리 중에 다른 Interrupt발생을 허용하지 않는다는 뜻
왼쪽은 Interrput발생 전 오른쪽은 후
0번지 비어있고 1번에는 1120번으로 뛰라는 명령이 들어있음 255번을 수행 중(255을 수행 중이므로 PC값은 256) 이 때 Interrput가 발생. 그럼 256을 0번지에 저장, 그럼 이 때 PC는 1이 되어 1120으로 뛰게 된다. 1120으로 뛰어 수행을 하다 마지막에 넘어가면 간접주소 방식으로 0으로 접근하라는 명령이 존재. 그럼 0번지 안에 들어가 있는 256으로 넘어간다.
R이 0이면 Instruction cycle이 진행되다가 그 도중에 interrupt가 발생하면 다음 cycle은 Interrupt cycle로 돌게 된다.