3 메모리
조합 칩 - 시간과 무관한 칩
순차 칩 - 시간에 무관한 조합 칩과 달리, 현재 시점의 입력 뿐만 아니라 이전에 처리했던 입력 및 출력에도 영향을 받음
클록
틱 톡 이라는 2진 신호를 연속적으로 생성하는 것 => 클록
틱의 시작과 톡의 종료 사이의 시간 => 주기
DFF(데이터 플립 플롭)
DFF란 out(t) = in(t-1) 이라는 식을 만족하는 칩
순차 칩의 가장 기본적인 형태
DFF는 이전의 입력을 기억하고, 현재 입력을 다음 클록 신호에 전달
즉, 현재 출력은 이전 클록 신호의 입력과 같음
ALU에 x + y를 계산하는 명령을 내렸다고 가정할 때, x는 근처 레지스터의 값이고 y는 멀리 위치한 RAM 레지스터의 값이라고 가정
x,y의 전기신호가 ALU에 도착하는 시점이 서를 다를 가능성이 높음
=> 컴퓨터 아키텍처 내에서 비트 하나가 가장 긴 경로를 따라 전송되는 시간과, 칩 내에서 가장 오래 걸리는 계산 시간을 더한 것보다 클록 주기가 더 길면 모든 연산이 올바르게 작동할 수 있음
레지스터
bit
Bit 레지스터의 역할
1비트 데이터 저장: 입력값을 클럭 신호의 상승 엣지(또는 하강 엣지)에 따라 저장한다.
상태 유지: 클럭 신호가 없으면 이전 상태를 유지한다.
load = 1이면 현재 입력값이 출력으로 저장,
load = 0이면 이전 출력값이 유지.
레지스터의 기본 단위: 여러 개의 Bit 레지스터를 조합해 다비트 레지스터(예: 8비트, 16비트)를 구성한다.
CHIP Bit {
IN in, load;
OUT out;
PARTS:
Mux(a=dffout, b=in, sel=load, out=muxout);
DFF(in=muxout, out=dffout);
Or(a=dffout, b=dffout, out=out);
}
register
레지스터의 역할
여러 비트 데이터 저장: 여러 비트 레지스터를 조합해 다비트 레지스터를 구성한다.
상태 유지: 클럭 신호가 없으면 이전 상태를 유지한다.
레지스터의 상태를 읽으려면 out값을 읽으면 된다.
레지스터의 상태를 v로 설정하려면 입력 in에 v를 넣고 load를 1로 설정하면 된다.
CHIP Register {
IN in[16], load;
OUT out[16];
PARTS:
Bit(in=in[0], load=load, out=out[0]);
Bit(in=in[1], load=load, out=out[1]);
Bit(in=in[2], load=load, out=out[2]);
Bit(in=in[3], load=load, out=out[3]);
Bit(in=in[4], load=load, out=out[4]);
Bit(in=in[5], load=load, out=out[5]);
Bit(in=in[6], load=load, out=out[6]);
Bit(in=in[7], load=load, out=out[7]);
Bit(in=in[8], load=load, out=out[8]);
Bit(in=in[9], load=load, out=out[9]);
Bit(in=in[10], load=load, out=out[10]);
Bit(in=in[11], load=load, out=out[11]);
Bit(in=in[12], load=load, out=out[12]);
Bit(in=in[13], load=load, out=out[13]);
Bit(in=in[14], load=load, out=out[14]);
Bit(in=in[15], load=load, out=out[15]);
}
RAM
RAM은 "랜덤 액세스(Random Access)"라는 이름에서 알 수 있듯, 모든 메모리 셀에 동일한 시간에 접근할 수 있도록 설계된 메모리
RAM의 랜덤 액세스가 가능한 이유는 어드레스 라인(Address Line)과 데이터 라인(Data Line)의 병렬 처리 덕분
RAM의 역할
여러 비트 데이터 저장: 여러 비트 레지스터를 조합해 다비트 레지스터를 구성한다.
상태 유지: 클럭 신호가 없으면 이전 상태를 유지한다.
주소 지정: 주소를 지정해 해당 주소에 데이터를 저장하거나 읽는다.
데이터 입력
주소를 지정하고 데이터를 입력하려면 in에 데이터를 넣고 load를 1로 설정하면 된다.
데이터 출력
주소를 지정하고 데이터를 읽으려면 load는 0이여야하고, address에 주소를 넣으면 된다.
CHIP RAM8 {
IN in[16], load, address[3];
OUT out[16];
PARTS:
DMux8Way(in=load, sel=address, a=loada, b=loadb, c=loadc, d=loadd, e=loade, f=loadf, g=loadg, h=loadh);
Register(in=in, load=loada, out=outa);
Register(in=in, load=loadb, out=outb);
Register(in=in, load=loadc, out=outc);
Register(in=in, load=loadd, out=outd);
Register(in=in, load=loade, out=oute);
Register(in=in, load=loadf, out=outf);
Register(in=in, load=loadg, out=outg);
Register(in=in, load=loadh, out=outh);
Mux8Way16(a=outa, b=outb, c=outc, d=outd, e=oute, f=outf, g=outg, h=outh, sel=address, out=out);
}
Counter
카운터는 주어진 제어비트에 입력 따라 카운트 값을 증가시키거나 특정 값으로 변경하거나 초기화하는 칩
카운터의 역할
카운트 값 증가: inc 신호가 1이면 카운트 값을 1 증가시킨다.
카운트 값 변경: load 신호가 1이면 카운트 값을 in 으로 변경한다.
카운트 값 초기화: reset 신호가 1이면 카운트 값을 0으로 초기화한다.
pc 값 확인 : out으로 pc값을 확인할 수 있다.
16-bit counter with load and reset controls.
If reset(t-1) then out(t) = 0
else if load(t-1) then out(t) = in(t-1)
else if inc(t-1) then out(t) = out(t-1) + 1 (integer addition)
else out(t) = out(t-1)
CHIP PC {
IN in[16],load,inc,reset;
OUT out[16];
PARTS:
Inc16(in=regout, out=plusone);
Mux16(a=false, b=plusone, sel=inc, out=incout);
Mux16(a=incout, b=in, sel=load, out=loadout);
Mux16(a=loadout, b=false, sel=reset, out=toload);
Or(a=load, b=reset, out=loadorreset);
Or(a=loadorreset, b=inc, out=loadflag);
Register(in=toload, load=loadflag, out=regout);
Or16(a=regout, b=regout, out=out);
}
'CS' 카테고리의 다른 글
컴파일러 VS 인터프리터 (0) | 2024.11.27 |
---|---|
RISC vs CISC: 컴퓨터 아키텍처의 두 가지 접근법 (0) | 2024.08.23 |
정적 배열(Static Arrays)과 동적 배열(Dynamic Arrays) (0) | 2024.07.12 |
하이퍼바이저(Hypervisor) (0) | 2024.07.07 |
도커와 VM의 차이 (0) | 2024.07.07 |