Verilog를 이용한 두 삼각형의 충돌 여부 판단 CPU
Vivado 18.02
두 삼각형, 즉 각각 3개의 x, y 좌표가 입력되면 두 삼각형의 충돌 여부를 알려준다.
선분의 교차 알고리즘을 사용한다.
각각 3개의 선분이 있으므로 총 3 X 3 = 9번 진행한다.
선분 교차 알고리즘은 CCW 알고리즘을 사용한다.
CCW 알고리즘은 3점이 주어지면 시계 반대 방향으로 위치하는지 검사한다.
선분 교차 알고리즘은 두 선분, 즉 각각 2개의 x, y 좌표가 주어진다.
각각 4가지의 경우에서 CCW를 구하여 교차 여부를 알 수 있다.
2's complement를 사용하는 32 bit Integer
-2^31 <= n < 2^31
16 bit로 구성되고 Orthogonal한 ISA로 구성하였다.
- LOAD: Load Data to D from Addr
- STORE: Store Data D in Addr
- IMD: Set Immediate Data to D (uint)
- IMM: Set Immediate Date to D (int)
- ADD: [D] = [S1] + [S2]
- SUB: [D] = [S1] - [S2]
- MUL: [D] = [S1] * [S2]
- JMP: Jump to Addr
- JDI: Jump to [D]
- JNE: Jump to Addr if D != 0
- JGT: Jump to Addr if D > 0
- JLT: Jump to Addr if D < 0
-
Fetch & Decode
-
Excute/ALU
-
Data Read/Write
-
Register Write
- ControlUnit에서 DataForwarding 관리
num | used |
---|---|
0 ~ 10 | general register |
11 | ccw return adress |
12 | ccw return value |
13 | intersect return address |
14 | intersect return value |
15 | function finish |
num | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
used | A1 | A2 | B1 | B2 | C1 | C2 | D1 | D2 | E1 | E2 | F1 | F2 |
num | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 ~ 255 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
used | a1 | a2 | b1 | b2 | c1 | c2 | d1 | d2 | ccw1 | ccw2 | ccw3 | ccw4 | non-used |
-
input.txt 에 명령을 입력한 후 Assembly.exe를 실행시키면 output.txt에 변환된 기계어 생성
-
생성된 코드를 Data_Cache.v 파일 내에 붙여넣기
-
시뮬레이션을 이용하여 결과 확인
(AB와 DE, AB와 EF, AB와 FD), BC와 DE 4번의 수행 후 교차가 검출된 모습이다.
4번의 흰색 줄이 경과되고 finish가 1이 되어 종료함을 뜻할 때 out의 값이 1이다.
교차했을 때가 1이므로 교차한 것을 알 수 있다.
(AB와 DE, AB와 EF, AB와 FD), (BC와 DE, BC와 EF, BC와 FE), (CA와 DE, CA와 EF, CA와 FE) 9번의 수행이 이루어 졌다.
finish가 1이 되어 종료함을 뜻할 때 out의 값이 0이다.
교차했을 때가 1이므로 교차하지 않았음을 알 수 있다.