상세 컨텐츠

본문 제목

Digital Logic Enhanced Processor (Add Instruction memory load and store)_HEX

설계공부/Advance Verliog

by 썽심 2023. 12. 27. 21:25

본문

728x90

16 BIT_RISC Processor CPU 설계

11.27~01.05

 

12.27

 

기존 16 bit simple cpu에 

peripheral(LED)을 추가하여 불빛이 나올 수 있도록 하였다.

 

and / add / sub에 맞게 hex가 정해지고, 그결과가 led로 나오게 된다.

 

 

 

기존 PART3에 적용했던 부분에

SEG_7을 추가로 적용

 

 

 

SEG_7


 

PROC부분은 기존에 했던 부분 그대로 가져왔다.


INST_mif_file

 

address 및 변수

0x0000 : mem

0x1000 : LED

0x2000 : SEG <-R0

0x3000 : SW

R5 : ADDRESS(PC backup)

R7 : PC(program counter) ->next inst

R2 : SEG

R4 : SW

 

위 내용을 상기하며, simulation을 확인하면 좋다.

 


RTL_VIEW


State Machine

 

TRANSITIONS / ENCODING

TRANSITIONS / ENCODING


SIMULATION 및 해석

 

TEST_BENCH

 

HEX0에 LED가 켜지기 까지 나타낸 SIMULATION

 

 

ASAMBLY

 

 

MIF파일과 대조하여 SIMULATION을 분석해 보자.

CLK이 Risingedge일 때 state 시작.

 

T0일에서 SEL에 SEL_PC로 PC값선택

ADDRin = 1'b1로 address 에 pc값을 넣을 준비를함

(1CLK뒤에 들어옴)

0선택 됨

inst_mem에 저장되어있는 0번의 data인 0a07이 선택

선택된 data를 D_in이 받음

--- --- --- --- ---

다음 STATE T1

T1은 1CLK 대기하게 된다. 왜 ? 나중에도 설명하겠지만 쓰레기 값을 지우기 위해 1CLK 대기

PC는 0가 되고

ADDR은 0

 

--- --- --- --- ---

그 다음 STATE로 넘어감

T2

T2에서  IR_IN이 1이 됨.

IR에 0a07값을 넣을준비가 된다.

 

--- --- --- --- ---

그 다음 STATE

T3

예정된 IR값을 받음

III에 따라서 Instruction이 정해짐

 

0a07 이니까

III     M  rX    DATA

000  0  101  000000111이 된다.

 

III : 000(MV)

M : 0

rX : 5

DATA : 000000111

 

IMM에 따라서 rX에 받는 값이 바뀐다.

IMM이 1인지 0인지에 따라

 

 

따라서 M은 0이니까 sel는 rY선택

rX에 rY를 집어넣게 된다.

rX는 5, 따라서 R5

 

rY는 IR[2:0] IR의 최하위 3BIT값이다.

따라서 0000101000000111에서

111을 불러옴

R5는 111이 저장되는게 맞지만, 

 

REG에 저장된 코드를 보면

R7을 R5에 저장하게 된다.

R7은 PC(Program counter) 따라서 1이된다.

그 다음은 Done signal이 1이 된 후 

다시 0 state로 돌아감.

--- --- --- --- ---

그다음 STATE

T0

sel = sel_pc로 pc값 선택

ADDRin = 1'b1로 address 에 pc값을 넣을 준비를함

1선택 됨

inst_mem에 저장되어있는 1번의 data인 1e0c이 선택

pc+1 // 2될 준비

--- --- --- --- ---

그다음 STATE

T1

PC는 2가 되고

ADDR은 1

대기

 

--- --- --- --- ---

그다음 STATE

T2

Reg에 저장되어있는 1번 address의 1e0c이 선택되고

T2에서  IR_IN이 1이 됨.

IR에 1e0c값을 넣을준비가 된다.

D_IN 1e0c

 

--- --- --- --- ---

그다음 STATE

T3

예정된 IR값을 받음

 

III에 따라서 Instruction이 정해짐

 

1e0c 이니까

III     M  rX    DATA

000  1  111  000001100이 된다.

 

III : 000(MV)

M : 1

rX : 7

DATA : 000001100

 

따라서 PC값에 #0x000c을 저장

Done 0으로 감

--- --- --- --- ---

그다음 STATE

T0

pc값은 0x000c이 되고

sel = sel_pc로 pc값 선택

ADDRin = 1'b1로 address 에 pc값( 0x000c )을 넣을 준비를 함

inst_mem에 저장되어있는 c 번의 data인 0x000c  이 선택

pc+1 

 

--- --- --- --- ---

그다음 STATE

T1

pc값 0x000d

ADDR은 0x000c 

 

--- --- --- --- ---

그다음 STATE

T2

reg에 저장된 1000이 선택 

D_in이 c번지의 data인 1000이된다.

IR에 1000 값을 넣을준비가 된다.

 

--- --- --- --- ---

그다음 STATE

T3

IR에 1000이 들어옴 

 

값을 또 분석 

 

1000 이니까

III     M  rX    DATA

000  1  000  000000000이 된다.

 

III : 000(MV)

M : 1

rX : 0

DATA : 000000000

 

Xreg = 4bit로 변환 해준 값 따라서

R0에 0000 값 저장 할 준비

done = 1

 

--- --- --- --- ---

그다음 STATE

T0

R0에 0000들어옴

 

Sel = Sel_PC //pc값 선택
ADDRin = 1'b1;

ADDR에 현재 pc값(000d) 들어올 준비

pc_inc = Run;

 

--- --- --- --- ---

그다음 STATE

T1

ADDR에 000d data가 들어옴

pc값은 000e가 된다.

대기

 

--- --- --- --- ---

그다음 STATE

T2

IRin = 1'b1;

IR DATA 들어올 준비

REG에서 d번지의 DATA는 3220

 

--- --- --- --- ---

그다음 STATE

T3

IR에 3220이 들어옴

 

3220를 III / M / rX / DATA_9BIT으로 나눔

 

3220 이니까

III     M  rX    DATA

001  1  001  000100000이 된다.

 

III : 001(MVT)

M : 1

rX : 1

DATA : 000100000

 

MVT instruction을 실행

 

if(IMM) Sel = Sel_D8;
Rin = Xreg;
Done = 1'b1;

 

M이 1이면 실행되고

아니면 그냥 1CLK 지나가게된다.

 

1이기 때문에 실행

rX,#D    rX <- D << 8 이렇게 실행된다.

 

SEL 은 Sel_D8

Sel_D8 은 

BusWires = {IR[7:0], 8'b00000000} 이렇게 이루어져 있다.

따라서 00100000 + 00000000 = 0010000000000000(16BIT) 가 된다. 이 데이터가 들어갈 준비 하면 된다.

 

Rin = Xreg니까

0010000000000000 = 2000 변경

Done = 1'b1;

 

--- --- --- --- ---

그다음 STATE

T0

R1에 2000 이 들어옴

 

Sel = Sel_PC //pc값 선택
ADDRin = 1'b1;

ADDR에 현재 pc값(000e) 들어올 준비

pc_inc = Run;

 

--- --- --- --- ---

그다음 STATE

T1

PC값은 000f가 되고

ADDR 은 000e이 된다.

대기

 

--- --- --- --- ---

그다음 STATE

T2

 

IRin = 1'b1;

IR DATA 들어올 준비

REG에서 e번지의 DATA는 a001

 

--- --- --- --- ---

그다음 STATE

T3

IR에 a001값을 할당 받음

 

a001

III     M  rX    DATA

101  0  000  000000001이 된다.

 

III : 101(st)

M : 0

rX : 0

DATA : 000000001

 

Sel = rY

ADDRin = 1'b1

 

sel = rY

rX,[rY]

[rY] <- rX

 

 

 

rY는 data9_bit의 하위 3bit

따라서 001

 

001 = r1

2000의 주소에 0000을 넣음 

 

*

reg랑 mamory랑 다름

요기 메모리에 저장

*

 

 

 

ADDRin = 1'b1 이니까

 

2000의 주소를 불러올 준비

 

--- --- --- --- ---

그다음 STATE

T4

 

ADDR에 2000을 불러옴

 

III값에 따라 또 Instruction 정해짐

III     M  rX    DATA

101  0  000  000000001이 된다.

 

 

101  = st니까

 

Sel = rX;
DOUTin = 1'b1;
W_D = 1'b1;

 

r0에 0번지에 있는 data선택

 

--- --- --- --- ---

그다음 STATE

T5

 

III

st: // wait cycle for synhronous memory
Done = 1'b1;

 

1 cycle  기다리는데

 

여기서 쓰레기 값이 발생

 

 

 

--- --- --- --- ---

그다음 STATE

T0

 

Done가 발생했으니 다시 state0

 

Sel = Sel_PC //pc값 선택

PC는 0010이된다.


ADDRin = 1'b1;

ADDR에 현재 pc값(000f) 들어올 준비

pc_inc = Run;

 

--- --- --- --- ---

그다음 STATE

T1

PC값은 0010가 되고

ADDR에 000f 값이 들어옴

대기

 

--- --- --- --- ---

그다음 STATE

T2

IRin = 1이 되고

IR값을 받을 준비

IR에는 000f의 DATA인 5201이 들어올예정

 

--- --- --- --- ---

그다음 STATE

T3

IR에 5201값을 불러오고,

 

 

III값에 따라 Instruction 정해짐

III     M  rX    DATA

010  1  001  000000001이 된다.

 

 

010  = add

 

Sel = rX
Ain = 1'b1

 

rX <- rX + rY

001 + 

rX = R1

rY = 001

2000 + 1이 된다

따라서 2001

 

Ain = 1이니까

reg_A값 불러올준비

 

--- --- --- --- ---

그다음 STATE

T4

 

ADD STATE에서 

IMM값에 따라 결과가 나뉘어짐

IMM이 0 이면 Sel = rY;//IMM = 0
IMM이 1 이면  Sel = Sel_D;

1이니까 Sel_D

000000000000001

Gin에 1이들어오니 G에 넣을 준비

reg_G에 할당되게됨

 

--- --- --- --- ---

그다음 STATE

T5

 

III = 010 이니까 ADD

 

ADD의 실행은 이렇게 된다.

 

Sel = Sel_G;//
Rin = Xreg;
Done = 1'b1;

 

sel= Sel_G

 

Sel_G = BusWires = G

 

Rin = Xreg;

Xreg는 현재 2001이다(2000+1)

그 값을 R1에 나타내줌

 

그 다음 Done 

--- --- --- --- ---

그다음 STATE

T0

pc+1될 준비

ADDR에 0011들어올 준비

--- --- --- --- ---

그다음 STATE

T1

PC값은 0012가 되고

ADDR에 0011값이 들어옴

대기하면서 쓰레기값 날려줌

 

 

--- --- --- --- ---

그다음 STATE

T2

 

REG에 저장된 11번째 ADDRESS의 DATA인

5201을 IR에 불러올 준비

 

 

이런식으로 흘러가게 된다.

 

R1 부분은 ADD되며 2000~2005까지 흘러간다.

LED가 들어오는 순간을 살펴보자.


 

LEDR이 1이 되는순간

 

 

T0

pc+1될 준비(000b)

ADDR에 000a들어올 준비

 

--- --- --- --- ---

그다음 STATE

T1

PC값은 000b가 되고

ADDR에 000a값이 들어옴

 

--- --- --- --- ---

그다음 STATE

T2

IRin = 1이 되고

IR값을 받을 준비

IR에는 000a의 DATA인 a002이 들어올예정

 

--- --- --- --- ---

그다음 STATE

T3

IR에 a002값을 불러오고,

 

 

III값에 따라 Instruction 정해짐

III     M  rX    DATA

101  0  000  000000010이 된다.

 

 

101  = st  

101 0: st   rX,[rY]  [rY] <- rX

 

Sel = rY;
ADDRin = 1'b1;

 

rY <- rX

 

rY는 data9_bit의 하위 3bit

따라서 001

 

010 = r2

2000의 주소에 0000을 넣음

 

ADDRin = 1'b1 이니까

 

ADDR 에 2000의 주소를 불러올 준비

 

--- --- --- --- ---

그다음 STATE

T4

 

ADDR에 2000을 불러옴

 

III값에 따라 또 Instruction 정해짐

III     M  rX    DATA

101  0  000  000000010이 된다.

 

 

101  = st니까

 

Sel = rX;
DOUTin = 1'b1;
W_D = 1'b1;

 

rX는 현재 R0

r0에 있는 data선택(003f)

 

--- --- --- --- ---

그다음 STATE

T5

 

st: // wait cycle for synhronous memory


Done = 1'b1;

LED가 켜짐

 

 

***LED 켜지는 원리

 

ADDR = 2000이니 

ADDR을 확인하면 h2의 seg7_cs를 가리킨다.

 

밑에 seg7부분을 보면 seg7_cs를 참조하고

seg7_cs가 1이니까

W와 and 하면 1&1 = 1

따라서 1값이 on  

 

seg7_cs part에서 

어떤 부분에서 켜질지 선택해서 들어가게된다.

D_out이 003f

 

여기서 addr값은 뒤에 3자리만 참조

2000이니까 000참조

따라서 H0에 불빛이 들어오고

LEDR에 왜 값이 1000000이냐면

003f >> 0000 0000 0011 1111 

011 1111 인데 

 

반전되어서 들어가기 때문에 (틸다 넣어줘서)

 

 

 

728x90

관련글 더보기