티스토리 뷰

 IDEC 강의 영상을 보고 정리한 내용입니다.

https://www.idec.or.kr/vod/apply/view/?pay=&search_val=CPU&no=273 

 

반도체설계교육센터

강의제목 CPU 설계 및 응용 구분 부산대 / 설계강좌 / 초급/중급 / 이론+실습 강의시간 13시간 열람기간 16일 이용료(일반) 무료 이용료(학생) 무료 강의개요 SoC 설계를 위해서 CPU를 설계하고 응용할

www.idec.or.kr

이번에 설계할 CPU의 구조이다.

4bit CPU 구조

Register

Register는 범용 register와 특수목적 register로 나뉜다. 둘을 구분하는 것은 제작사마다 다르다.

 

General purpose register : TEMPREG, CREG, DREG, RREG

Specific register : MDR, MAR, IR, BREG, KETCH, INREG, OUTREG, KOUTREG,ACC 

(*강의에서 정의함)

 

위의 register 는 4bit/8bit로 구성되어있다.

4bit/8bit register

4bit register

input : data_in, inen, oen, clk, clr

output : data_out

 

 inen, oen 제어신호 통해 input,output을 제어할 수 있다.

inen input enable
oen output enable
clr clr = 1 => 0
module reg4(
    input [3:0] data_in,
    input inen,
    input oen,
    input clk,
    input clr,
    output [3:0] data_out
    );
    
    reg [3:0] st;
    
    always@(posedge clk, posedge clr) begin
    if(clr) st=4'b0;
    else if(inen) st = data_in;
    else st=st;
    end
    assign data_out = (oen)?st:4'bz; // oen = 1 => data_out = st

endmodule
`timescale 1ns / 1ps

module tb_reg4;
    reg [3:0] data_in;
    reg inen, oen, clk, clr;
    wire [3:0] data_out;
    
    reg4 reg4_uut (
    .data_out(data_out),
    .data_in(data_in),
    .inen(inen),
    .oen(oen),
    .clk(clk),
    .clr(clr)
    );
    
    always #50 clk = ~clk;
    initial begin
    clr = 1;
    inen = 0;
    oen = 1;
    clk=0;
    data_in = 4'b0101;
    #100; clr = 0;
    #100; inen=1; oen=1;
    #200; data_in=4'b1101;
    #200; inen=1; oen = 1;
    #200; clr = 1;
    #100;
    end 
    
endmodule

4bit register behavioral simulation

같은 방법으로 8bit register를 설계한다.

module reg8(
    input [7:0] data_in,
    input inen,
    input oen,
    input clk,
    input clr,
    output [7:0] data_out
    );
    
    reg [7:0] st;
    
    always@(posedge clk, posedge clr) begin
    if(clr) st=8'b0;
    else if(inen) st = data_in;
    else st=st;
    end
    assign data_out = (oen)?st:8'bz; // oen = 1 => data_out = st

endmodule
`timescale 1ns / 1ps

module tb_reg8;
    reg [7:0] data_in;
    reg inen, oen, clk, clr;
    wire [7:0] data_out;
    
    reg8 reg8_uut (
    .data_out(data_out),
    .data_in(data_in),
    .inen(inen),
    .oen(oen),
    .clk(clk),
    .clr(clr)
    );
    
    always #50 clk = ~clk;
    initial begin
    clr = 1;
    inen = 0;
    oen = 1;
    clk=0;
    data_in = 8'h48;
    #100; clr = 0;
    #100; inen=1; oen=1;
    #200; data_in=8'h32;
    #200; inen=1; oen = 1;
    #200; clr = 1;
    #100;
    end 
    
endmodule

4bit register behavioral simulation

posedge 에서 register 값이 갱신되는 것을 볼 수 있다. 또한 inen, oen 제어신호 통해 input,output을 제어할 수 있다.

 

Program Counter

Program counter : 다음번에 실행할 명령어 주소를 기억하는 register

 

PC이후 흐름

1. Program counter -> MAR(memory address register) 주소 전송

2. 해당 주소 ROM -> MDR(memory data register) data(instruction)을 전송

3. IR(instruction register)에 저장된 후 countrol unit 제어

 

PC 구조

PC 구조

특징

- PC가 항상 1씩 증가하지 않기때문에 MUX로 증가된 주소를 받을것인지 아닌지 결정

- Latch를 통해 제어신호에 level sensitive 하게 동작

PC 구조

PC 구성요소

- 8 bit Register(설계됨)

- 16to8 MUX

- 8 bit adder

- 3state buffer

 

register + 3 state buffer : latch 동작 가능

 

8 bit adder

PC+1을 하기위해 adder를 만들어야한다. half adder를 사용하여 설계하였다.

HA (half adder)

module ha(
output s,c,
input x,y
    );
    assign s=x^y;
    assign c=x&y;
endmodule

HA를 8개 모아 8bit adder를 구현했다.

8bit adder

module ha8(
input [7:0] data_in,
input pc_inc,
output[7:0] data_out);
wire [7:0] a;
genvar i;

generate 
ha ha0(data_out[0],a[0],pc_inc,data_in[0]);
for(i=1;i<8;i=i+1) begin:hagen
ha ha1(data_out[i],a[i],a[i-1],data_in[i]);
end
endgenerate

endmodule

generate 구문을 확용하여 코드 길이를 줄였다.

 

PC

PC

pc_inc adder에서 pc + pc_inc 이므로 pc_inc = 1 => pc+1
load_pc 분기 명령어(pc+1증가X)에서 MDR내용을 8bit register에 래치하는 제어신호
pc_oen 8bit register에 저장된 PC내용을 MAR로 전송하는 제어신호

 

8bit adder와 8bit register는 완료했다. MUX와 Latch(register + 3state buffer)는 pc.v에서 구현한다.

module pc(clk,clr,pc_inc,load_pc, pc_oen, pc_input,pc_out);
input clk, clr, pc_inc, load_pc, pc_oen;
input [7:0] pc_input;
output [7:0] pc_out;

wire [7:0]a;
wire [7:0]b;
wire [7:0]c;
//ha8(data_in, data_inc, data_out)
ha8 u0(.data_in(a),.pc_inc(pc_inc), .data_out(b));
//MUX
assign c=(load_pc)?pc_input:b;
//reg8(data_in, inen, oen, clk, clr, data_out)
reg8 u1(c,1'b1,1'b1,clk,clr,a);
//tri-state buffer
assign pc_out = (pc_oen)?a:8'bz;
endmodule
`timescale 1ns / 1ps
module tb_pc();
//inputs
reg pc_oen;
reg pc_inc;
reg load_pc;
reg [7:0] pc_input;
reg clr;
reg clk;

//Output
wire [7:0] pc_out;
//instantiate
pc UUT(
        .pc_out(pc_out),
        .pc_oen(pc_oen),
        .pc_inc(pc_inc),
        .load_pc(load_pc),
        .pc_input(pc_input),
        .clr(clr),
        .clk(clk));

//Initialize inputs
always #50 clk = ~clk;
initial begin
pc_oen = 1;
pc_inc = 0;
load_pc = 0;
pc_input = 8'h13;
clr = 1;
clk = 0;
#100 clr=0;
#100; pc_inc = 1;
#500; pc_inc = 0;
#100; load_pc = 1;
#100; load_pc = 0;
#400; pc_oen = 0;
#100; pc_oen = 1;
#100; clr = 1;
#100; clr = 0;
#100;
end
endmodule

PC behavioral simulation

pc_inc = 1일때, PC값이 1씩 증가하는 것을 볼 수 있다.

load_pc = 1일때,  PC+1이 아닌 pc_input을 받는다.(MUX)

 

결론

8bit, 4bit register, PC를 설계했다. 다음은 ALU를 설계하겠다.

 

참고자료

- IDEC 강의

- Verilog HDL 설계와 합성의 길잡이

generate 구문 : p.158

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함