순차진행과 제어기
CAQ : carry, product(AQ), 승수(Q)
P 카운터
제어기
승산기 ASM
초기연산 : B <-피승수, Q <- 승수
IDLE
MUL0
if Q0=1 이면 addition C, A <- A+B, goto MUL1
MUL1
C || A || Q <- sr C || A || Q, C<-0
P <- P-1
if Z=1 goto IDLE
else goto MUL0
데이터처리장치기능
A 레지스터 :병렬로드, 시프트, 동기클리어
Q 레지스터 :병렬로드, 시프트
C 플립플롭 : 로드, 동기클리어
B 레지스터 :병렬로드
P 카운터 :병렬로드,하강카운터
예시
Control sequencer
모드제어신호
상태신호
컴퓨터 구조
Instruction
Instruction format
ex)
branch-on-zero R6(SA) 35(AD) <- 현재 PC가 55일때 –20을 AD에 저장, R6값이 0이면 55+(-20)으로 PC는 35
가 되고 R6=0이면 PC=56번지
*** AD주소를 자리확장시 부호비트를 확장(sign extension)함에 유의
7비트 opcode 명령어 + 9비트 operand
더 큰(32~64)비트 컴퓨터
간단한 컴퓨터의 메모리 구조
사용자의 입장에서 사용할 수 있는 저장자원
-Instruction memory : CPU 명령어 저장
-Data memory : 프로그램실행시 데이터저장
-16비트 PC
-8개의 16비트 레지스터
한 클럭 사이클에 한 개의 명령어 실행
Multi cycle 마이크로 프로그램 제어
Multi cycle computer의 구조적 변화
M 메모리 : 데이터 및 명령어 저장
레지스터 파일
IR (instruction register)
PC 제어신호
Control memory
CAR : CM의 주소값 지정,
다수사이클 컴퓨터에 대한 마이크로 명령어의 형식
ALU 코드와 관련 DP 제어신호
MUX S에 대한 선택값과 제어정보
마이크로 명령어 실행 단계
uI에 대한 ASM
IF 상태
EX0 상태
그림 예는 3개 사이클에 한 명령어 실행하는 ASM
각 Instruction에 대한 마이크로프로그램과 이진코드값 예
실습 ALU 설계
ALU는 산술 연산과 논리 연산 중 하나의 모드를 선택하며, 이때, Z(0), V(오버플로우), N(음수), C(캐리)의 여부를 출력한다.
우선 산술연산자를 설계해보자
산술 연산자는 조합회로와 Full adder로 이루어져 있다.
조합회로 code
module inp_logic (s, b, y);
input b;
input [1:0] s;
output reg y;
always @ (s,b) begin
case(b)
1: if(s == 2'b11)begin
y = 1;
end
else if(s == 2'b01)begin
y = 1;
end
else if(s == 2'b10)begin
y = 0;
end
else begin
y = 0;
end
default:
if(s == 2'b11)begin
y = 1;
end
else if(s == 2'b01)begin
y = 0;
end
else if(s == 2'b10)begin
y = 1;
end
else begin
y = 0;
end
endcase
end
endmodule
full adder 코드
module fa1 (a, b, ci, co, s);
input a, b, ci;
output co, s;
assign co = (a&b) | (ci&a) | (ci&b);
assign s = a^b^ci;
endmodule
산술 연산자
테스트 벤치를
Falg에서 Overflow를 판독해야하는 V flag에 대한 의문이 생길 수 있다. 왜 이전 carry와 현재 carry가 1일 경우, 0으로 하여 over flow라고 하지 않는지 의문이 생긴다.
-> 이는 몰루?
ex) 1 - 0을 해보면 0001 + {1111 + 0001}(0의 2의 보수)일때, 0001이며, 이때, 최상위 carry와 그 이전 carry가 발생한다.
unsinged에서 덧샘을 할 경우, carry가 발생하면
unsigned의 경우, 계산이 옳고 그름의 여부를 C flag를 통해 판독하며, signed의 경우, V flag를 통해 연산의 옳고 그름을 판단한다.