Digital Logic Enhanced Processor (Add Instruction memory load and store)_HEX
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
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 인데
반전되어서 들어가기 때문에 (틸다 넣어줘서)
Digital Logic Enhanced Processor(instruction add Branch)-LINUX (0) | 2024.01.01 |
---|---|
Digital Logic Enhanced Processor(instruction add Branch) (0) | 2024.01.01 |
Digital Logic Enhanced Processor (Add Instruction memory load and store) (0) | 2023.12.23 |
Advanced Veilog-1 (2) | 2023.11.13 |