티스토리 뷰
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의 구조이다.
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
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
같은 방법으로 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
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가 항상 1씩 증가하지 않기때문에 MUX로 증가된 주소를 받을것인지 아닌지 결정
- Latch를 통해 제어신호에 level sensitive 하게 동작
PC 구성요소
- 8 bit Register(설계됨)
- 16to8 MUX
- 8 bit adder
- 3state buffer
register + 3 state buffer : latch 동작 가능
8 bit adder
PC+1을 하기위해 adder를 만들어야한다. half adder를 사용하여 설계하였다.
module ha(
output s,c,
input x,y
);
assign s=x^y;
assign c=x&y;
endmodule
HA를 8개 모아 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_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_inc = 1일때, PC값이 1씩 증가하는 것을 볼 수 있다.
load_pc = 1일때, PC+1이 아닌 pc_input을 받는다.(MUX)
결론
8bit, 4bit register, PC를 설계했다. 다음은 ALU를 설계하겠다.
참고자료
- IDEC 강의
- Verilog HDL 설계와 합성의 길잡이
generate 구문 : p.158
'프로젝트 > 4bit CPU' 카테고리의 다른 글
[4bit CPU #6] control unit(2) (control block) - 18EE (0) | 2023.07.21 |
---|---|
[4bit CPU #5] Control unit(1) (Decoder / Ring counter) - 18EE (0) | 2023.07.17 |
[4bit CPU #4] ALU+ACC (feat.MUL/DIV) - 18EE (0) | 2023.07.16 |
[4bit CPU #3] ALU - 18EE (0) | 2023.07.15 |
[4bit CPU #2] ACC(Universal shift register) - 18EE (0) | 2023.07.12 |
- Total
- Today
- Yesterday
- data gating
- VLSI 전력소모
- VTCMOS
- acc
- CPU
- VLSI dynamic power consumption
- Stack effect
- power gating
- static power
- clock gating
- 굿노트 내보내기
- DVFS
- 4bit CPU
- vlsi
- 굿노트 mp3 내보내기
- delay
- Verilog
- MTCMOS
- CMOS power
- switching power
- Control Unit
- 4bit
- ALU
- 굿노트 mp3파일 추출
- 굿노트 녹음파일
- leakage
- mp3파일 추출
- VLSI power
- level shifter
- dynamic power
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |