-
[SRC 설계] Data Path 설계 및 구현 (1)Digital Processor Design 2013. 6. 27. 15:30반응형
2. 설계 및 구현
2.1 Data Path 설계
다음은 32bit SRC의 1-BUS Data Path이다. 크게 ALU, 32bit Register, Instruction Register, Memory와 여러 instruction을 수행하는 도중에 필요한 Con값을 내보내는 블록, SHIFT instruction을 수행하는데 필요한 Shift Counter 블록이 있다.
2.1.1 Register
다음은 PC값을 저장하는 Register, ALU 출력을 저장하는 C register, 그리고 R1~R31까지의 register를 설계한 것이다. D F/F을 사용했으며 CLK는 모두 공통으로 들어간다. 그리고 Data path에 올라와 있는 데이터가 곧바로 register에 들어가는 것을 막기 위해, 그리고 register에 들어있는 값이 곧바로 Data path에 나가게 되는 것을 방지하기 위해 입출력을 제어할 수 있는 SRin, GRout 핀을 정의한다.
예를 들어 만일 GRout 핀이 없다면 Register 출력은 1을 보내고 다른 쪽 register에서 동시에 0을 보낸다면 쇼트가 일어나서 하드웨어가 타버리는 일이 발생할 수 있다. 따라서 Register의 입출력은 반드시 SRin, GRout과 같은 컨트롤신호에 의해서 통제되어야 한다.
다음은 register의 시뮬레이션 결과 파형이다. 입력에 27이라는 값을 싣고 나서 SRin 신호를 주면 다음 CLK 상승 엣지에서 Q라는 출력에 값이 나가는 것을 볼 수 있다. 그러나 이 Q 값은 Register의 출력이 아니다. GRout신호를 주면 곧바로 Register 출력 Out에 27이라는 값이 실리는 것을 볼 수 있다.
위의 register는 ALU의 두 개의 입력중 하나에 들어갈 값을 임시 저장하는 register이다. 이 레지스터는 출력을 통제하는 컨트롤 신호가 존재하지 않는다. 왜냐하면 A 레지스터의 출력은 ALU 앞에서 기다리고 있고 다음 CLK의 상승 엣지에서 또 다른 ALU의 입력 신호가 도착하기 전까지 사용하지 않기 때문이다.
다음은 32개의 Register를 담고 있는 Register file이다. 좌측에 Ra, Rb, Rc입력이 각각 5bit씩 들어가고 있으며, Gra, Grb, Grc의 3개의 select bit이 들어가고 있다. Ra_Rb_Rc_field_selecter 블록은 들어온 Ra, Rb, Rc 중에 어떤 것을 선택해서 출력으로 내보낼지 결정하는 일종의 Multiplexer이다. 이 때 Gra, Grb, Grc는 셋 중에 하나만 1이 들어오며 2개 이상 1이 들어올 수 없다. 들어온 Ra or Rb or Rc field에 의해서 5bit이 5x32 디코더의 입력으로 들어가게 되고 해당하는 bit의 register가 선택되게 된다.
그리고 모든 레지스터에 공통으로 CLK가 들어가고 있으며 위에서와 마찬가지로 레지스터의 입출력을 통제하는 Rin, Rout 컨트롤 신호가 입력으로 들어간다. 마지막으로 입력은 모든 레지스터에 공통으로 32bit 신호가 들어간다. 그러나 이 입력은 오직 Rin이 주어질 때만 레지스터 안으로 들어가게 된다.
다음은 Register file의 시뮬레이션 결과파형이다. 입력에 3233 값을 주고 있고 컨트롤 신호를 조절해서 출력으로 3233 값이 나가는 것을 확인했다. Rout 신호가 없을 때에는 출력핀은 Floating 상태이므로 Hi-Z 상태가 되는 것 역시 확인할 수 있었다.
다음은 R0 레지스터이다. 위의 레지스터들과 달리 BAout이라는 컨트롤 신호가 추가되었다. 이 BAout 신호는 0번 Register에만 존재하는 컨트롤 신호이며, 0번 register의 값을 출력으로 내보낼 때 추가로 필요한 신호이다.
다음은 메모리로부터 읽어들여온 Instruction을 저장하는 Register이다. 이 레지스터는 IRin이라는 컨트롤신호를 받아서 instruction을 레지스터에 저장하고 그 instruction을 분해해서 OP code, Ra, Rb, Rc 그리고 필요에 따라서 c1, c2, c3 값을 만들어주는 역할을 한다.
위의 그림은 SRC에서 사용되는 instruction의 종류별로 어떤 포맷으로 bit을 쪼개고 주소값을 만드는지 잘 정리된 표이다. ld, st, addi 같은 instruction은 c2를 사용하고 ldr, str같은 instruction은 c1을 사용한다. c1, c2가 필요한 instruction의 경우 c1out, c2out의 컨트롤 신호를 추가로 필요로 하며 후에 설계할 Control Unit에 이 부분을 추가한다.
2.1.2 Memory
CPU와 Memory의 경계에 있는 중요한 블록이다.
우선 CPU에서 Memory로 data가 이동하는 경우를 살펴보면, 출력이 MB_OUT[31..0]으로 나가야 하기 때문에 MDwr 컨트롤 신호가 들어와야 한다. 그리고 들어오는 입력은 CB_IN[31..0]을 통해서 들어오기 때문에 이 값을 선택하기 위해서 MDbus 컨트롤 신호가 들어와야 한다. 입력은 OR gate를 통해 레지스터의 앞에서 기다리고 있지만 이 값을 저장하기 위해서 SRin 신호가 필요하다. 이 신호는 MDbus나 MDrd 신호중 하나가 1이고, Strobe 신호가 1일 때 SRin으로 들어가는 신호가 1이 된다. 즉 CPU를 통해 data가 BUS에 실리고, 다시 Memory로 나가게 된다.
이번에는 Memory에서 CPU로 data가 이동하는 경우를 살펴보면, 이번엔 출력이 CB_OUT[31..0]으로 나가야 하므로 MDout 컨트롤 신호가 들어와야 한다. 그리고 들어오는 입력은 MB_IN[31..0]을 통해서 들어오기 때문에 이 값을 선택하기 위해서 MDrd 컨트롤 신호가 들어와야 한다. 입력은 OR gate를 통해 레지스터에 들어갈 준비를 하고 있고 이번에도 MDbus나 MDrd 신호중 하나가 1이고, Strobe신호가 1이 들어오면 SRin으로 들어가는 신호가 1이 되고 Memory에 저장된 data는 CPUBUS로 나가게 된다.
다음은 위 블록의 시뮬레이션 파형이다. CPU입력은 2, Memory입력은 1로 준 상태에서 여러 가지 컨트롤 신호를 바꿔가며 동작을 확인하였다. 우선 Strobe, MDbus, MDout 신호를 주면 CPU 입력 data가 CPU bus로 나가게 된다. 따라서 상승 클락엣지에서 CB_OUT에 2가 나오는 것을 확인하였다. 이번엔 Strobe, MDrd, MDwr 신호를 주면 Memory 입력 data가 상승 클락엣지에서 MB_OUT으로 1이 나가는 것을 확인하였다. 그리고 이 때 MAin 컨트롤 신호를 준 상태에서 상승 클락엣지가 들어오면 CPU_IN 값인 2가 ADDR에 실리는 것을 확인하였다.
위 블록은 .mif 파일을 통해 주소가 출력으로 나가게 하는 역할을 한다. 이 때 IN[31..0]에 값을 넣고 WE 신호를 주면 해당하는 번지의 주소값을 쓸 수도 있다. 입력 ADDR은 7bit으로 정의했으며, 후에 완성된 Data Path에서는 7bit의 ADDR을 왼쪽으로 2번 shift 한 효과를 내도록 해서 ADDR이 1씩 증가할때마다 실제 값은 4가 증가하도록 설계를 할 것이다. 왜냐하면 32bit SRC에서 PC값은 한번 증가할 때마다 4씩 증가하기 때문이다.
위 블록을 시뮬레이션 한 파형이다. ADDR 값을 1씩 증가시킬때마다 mif 파일에 저장되어있던 값들이 하나씩 출력되는 것을 확인하였다.
2.1.3 SHIFT Control
다음은 SHIFT와 관련된 Instruction을 수행하기 위한 블록이다.
다음은 SHIFT Right Instruction이다. 위의 Concrete RTN을 살펴보면, T3에서 Instruction의 최하위 5bit을 n에 넣고 그 값이 0이라면 R[rc]의 값을 n에 저장하고 Instruction의 최하위 5bit이 0이 아니었다면 그 값을 n으로 사용하게 된다.
Rb 레지스터 값을 우선 C로 옮기고 나서 shr Instruction을 수행한다. 즉 왼쪽으로부터 0을 하나 밀어넣고 기존의 [31..1]에 해당하는 bit를 그 뒤에 붙여주면 shr이 1번 이루어진 것이다. 그리고 n을 1 감소시키고 계속해서 shr Instruction을 반복 수행한다. 이 때 중요한 것은 n이 0이 아닌 동안에만 계속해서 shr Instruction을 반복하고, step은 T6를 계속해서 유지한다. 즉, n=0인 지점을 찾아야 언제까지 shift를 할 것인지를 CPU가 파악할 수 있다. 따라서 n=0이 되는 순간을 알려주는 컨트롤 신호를 만들어야 하는데, 바로 위의 블록이 그 역할을 수행하게 된다.
위의 블록을 다시 보면, ENT신호에 Decr이 물려 있으므로 Decr 신호가 들어오면 5bit Down Counter가 Enable이 되고 Clk가 뛸 때마다 하나씩 감소한다. 이 때 카운터의 값은 VAL[4..0]의 5bit(위에서 언급한 n)으로 계속 들어가 있는데, Ld 신호가 1이 들어오면 카운터에 실리게 된다. 들어온 값이 1씩 계속 감소하다가 모두 0이 되면 NOR5 게이트를 거쳐 NEQZ 출력은 1이 나가게 된다.
다음은 시뮬레이션 파형이다. VAL값을 3으로 주고 Ld값을 1로 주니까 그 다음 상승 클락엣지에서 NEQZ가 바로 0으로 떨어졌다. Counter의 값에 3이 실렸기 때문이다. 그 이후에 Decr 신호를 주니까 클락엣지가 3번째 들어오는 순간 카운터의 출력은 3이 되고 NEQZ의 출력은 다시 1로 올라가게 된다.
2.1.4 Condition Code Logic
위의 블록은 Branch Instruction 에서 6개의 branch 조건을 정하기 위한 용도로 사용된다. 좌측에는 32bit NOR gate가 있고 Instruction의 최하위 3bit(IR[2..0])은 3x8 디코더의 입력으로 들어가서 각각 출력을 내보낸다. 디코더 출력은 반드시 하나만 1이므로 각 경우의 출력을 OR5 gate로 묶어서 출력 레지스터에 보내고, 이 때 CONin 이라는 컨트롤신호가 들어와야 레지스터에 Condition 값이 저장된다. 저장된 CON 값은 다음 상승클락엣지에서 CON 출력으로 나가게 된다.
다음은 Instruction 하위 3bit IR[2..0]의 값, 즉 c3[2..0] 값에 따라서 CON 값이 어떻게 나뉘는지를 나타낸 것이다. c3=0 이면 CON은 항상 0이고, Branch가 일어나지 않기 때문에 위의 블록에서는 이 경우의 디코더 출력을 내보내지 않았다. 그리고 c3=4, c3=5인 경우에는 입력의 MSB가 0인지 1인지를 검사하기 때문에 이 부분을 빼서 gate에 연결하였고, c3=2, c3=3인 경우에는 R[rc]전체의 값이 0인지 아닌지를 따져야 하기 때문에 32bit NOR gate의 출력을 활용하였다.
다음 파형을 보면 입력이 F000_0001인 경우에 IR[2..0](c3)가 5인 경우, 즉 R[rc]의 최상위 bit이 1인 경우에 CON이 1이 되는 것을 볼 수 있다. 그리고 입력이 0FFF_FFFF인 경우 c3가 3일때와 4일 때 모두 CON이 1이 되는 것을 확인하였다.
반응형'Digital Processor Design' 카테고리의 다른 글
[SRC 설계] Data Path 검증 및 시뮬레이션 (0) 2013.06.27 [SRC 설계] 1BUS 구조 SRC 설계 및 구현 (0) 2013.06.27 [SRC 설계] Control Unit 설계 및 구현 (0) 2013.06.27 [SRC 설계] Data Path 설계 및 구현 (2) (0) 2013.06.27 [SRC 설계] 32Bits 1BUS SRC 설계 개요 (0) 2013.06.27