[2024.03.19.화] 인천인력개발원 하만 세미콘 아카데미
Verilog를 이용한 RTL 시스템 반도체 설계
CORA Z7 실습
1. Project Create(my_and.v)
2. Elaborated design
3. Synthesis
4. Implementation
5. Configuration
6. H/W manage
[DIGILENT - CORA Z7보드]
![](https://blog.kakaocdn.net/dn/b5yRmA/btsFSbOunKU/ksMvq1srC4RgS1mpgvrakk/img.png)
번호 | 명칭 | 번호 | 명칭 |
1 | Power select jumper (Ext. supply / USB) | 11 | 마이크로SD card 슬롯 (underside of board) |
2 | Power jack (for optional ext. supply) | 12 | USB 호스트 포트 |
3 | Shared USB JTAG / UART port | 13 | FPGA programming DONE LED |
4 | Unloaded expansion header | 14 | Processor subsystem reset button |
5 | Pmod connectors | 15 | 이더넷 포트 |
6 | SPI header (Arduino/ChipKIT compatible) | 16 | Power on reset button |
7 | Arduino/ChipKIT shield connectors | 17 | Power good LED |
8 | Programming mode jumper (JTAG / microSD) | 18 | Zynq-7000 |
9 | User tri-color LEDs | 19 | DDR3L 메모리 |
10 | User push buttons |
[ Cora Z7 Schematic ]
![](https://blog.kakaocdn.net/dn/bAcWtA/btsFRr5aOuw/PgmFITkSI4Nu8JGW4m1LE0/img.png)
![](https://blog.kakaocdn.net/dn/bKFyiH/btsFWiL2q8L/1Dd4NkwGkAyXzfyDPIVKJ1/img.png)
Vivado 실습: AND 프로그램 적용 및 XOR 프로그램 작성
1. open project "my_and.v"
2. 파일 확인
![](https://blog.kakaocdn.net/dn/bBVZjV/btsFR9JEbCX/0WsS7cpqHmpUKIRgbLakXk/img.png)
3. Navigator의 PROGRAM AND DEBUG - Open Hardward manager클릭
![](https://blog.kakaocdn.net/dn/bQWrfP/btsFT0ZRY75/F0YEsA3L5M4gWSkoMll7H1/img.png)
4. 상단의 Open target - Auto connect 클릭
![](https://blog.kakaocdn.net/dn/KKyrQ/btsFQYhUlNn/pUoUhtmG8dMsBaAeYTsrAk/img.png)
5. 장치 인식
![](https://blog.kakaocdn.net/dn/lzFLJ/btsFVtUpQNe/jYz245oH3396qsRgczuGcK/img.png)
6. PROGRAM AND DEBUG - Open Hardware Manager- program device - Status에 Programmed 확인
![](https://blog.kakaocdn.net/dn/bqUSQn/btsFRBzLicH/H2JpZSjSagu9aBHmEHTOFK/img.png)
7. 버튼 두 개 함께 누르면 LED 전원 동작 확인(AND 동작)
![](https://blog.kakaocdn.net/dn/SzH8u/btsFQt99NHC/tmg1w0HwkqKko4kPlOzs60/img.png)
![](https://blog.kakaocdn.net/dn/bbEqnS/btsFVS7DnZT/4jvkK2VMIdUYVYpzgd7XFk/img.png)
8. 프로젝트 파일
my_XOR.xpr 파일 생성
1. 8일차 과정을 참고하여 파일 생성 및 오픈
![](https://blog.kakaocdn.net/dn/bGwft8/btsFR9v43AJ/pu7Ik3dkVojrSoVoPkKOR0/img.png)
2. Add Sources - Design Source Create
![](https://blog.kakaocdn.net/dn/vGtL9/btsFRBNjnG9/74RK94TeTp5KeF9KH4UEo1/img.png)
3. Next - Create File - type(Verilog), name(my_XOR) 입력 - OK - Finish
![](https://blog.kakaocdn.net/dn/7i0eV/btsFVvSdOqx/HAuWG78eneC79KVvZlrWQK/img.png)
![](https://blog.kakaocdn.net/dn/YVT7a/btsFU83Vn5K/k0MwyOCK2hvL6d6cyvkI6K/img.png)
4. Input으로 Port Name A와 B, Output으로 Port Name R로 지정 - OK
![](https://blog.kakaocdn.net/dn/I8su9/btsFUGNlw1E/nmcyKiISFhpoCEHkZzQApK/img.png)
5. Sources - Design Sources의 my_XOR.v 파일 open
![](https://blog.kakaocdn.net/dn/7uQnH/btsFRB0OvvA/dNp4MWPkB16gRzssKSHFHk/img.png)
![](https://blog.kakaocdn.net/dn/AfU4s/btsFQWLdRxo/DwNASFKfMr2rCywM6s0oT1/img.png)
6. assign R = A^B; 코드 추가(^은 XOR 코드)
![](https://blog.kakaocdn.net/dn/dmmLyt/btsFUJi1gcJ/kj8JDKCuXprusq5khxPiBk/img.png)
7. Ctrl+S를 눌러 저장 후 Message탭의 오류 확인
![](https://blog.kakaocdn.net/dn/YVPxR/btsFU0kCtKZ/HpSqmVt62Hp8T2GKWVuyk0/img.png)
8. 좌측 Flow Navigator - RTL ANALYSIS - Open Elaborated Design 클릭 - OK
![](https://blog.kakaocdn.net/dn/ba6v76/btsFUqKDDeq/Q3yK9gg3vK7Ht5EJBb49Ek/img.png)
9. Schematic 실행 확인
![](https://blog.kakaocdn.net/dn/Jkroy/btsFUFt98GW/YcAkHK8KZs7vKwiZtXRw6K/img.png)
10. 좌측 Flow Navigator - SYNTHESIS - Run Synthesis 클릭 - OK
![](https://blog.kakaocdn.net/dn/baV58a/btsFQUzGuXO/sZWqKrfGiiX8Bn1XDfawz0/img.png)
11. 다음 창이 뜨면 Open Synthesis Design 선택 - OK
![](https://blog.kakaocdn.net/dn/bnIhnQ/btsFVTZK1kY/KsQcA5xkRcOQgzWIadgOYK/img.png)
12. Device 창 확인
![](https://blog.kakaocdn.net/dn/bETQWS/btsFTdE0crr/uF36swTjHQn2bGGFuuKNA0/img.png)
13. my_XOR 우클릭 - Schematic open
![](https://blog.kakaocdn.net/dn/s7UWD/btsFTdE0epl/5i1fKAE4q3n8NFWC9JvXa1/img.png)
14. Schematic 탭 우클릭 - New Vertical Group
![](https://blog.kakaocdn.net/dn/ce0UTZ/btsFUX2vdKA/L5oR615h6sKclfg31rv6W0/img.png)
15. 하단 I/O Ports 탭에서 A(D20), B(D19), R(G17) 포트 설정, I/O Std를 모두 LVCMOS33으로 설정
![](https://blog.kakaocdn.net/dn/J27hw/btsFUlvXjVG/B2KtsFLGPBHTtVYKTciGv0/img.png)
16. 좌측 Flow Navigator - IMPLEMENTATION - Run Implemntation - Save 창이 뜨면 다음 내용 입력 후 OK
![](https://blog.kakaocdn.net/dn/71ctT/btsFSaPjgcv/CFkkOGuBvJcD5nJFAfEsj1/img.png)
17. 저장 후 실행 - OK
18. Open Implementation Design - OK
![](https://blog.kakaocdn.net/dn/cTLq3X/btsFVVwvp6t/bfoyfimv4GCVkYTRvLY4y1/img.png)
19. Flow Navigation - Generate Bitstream - OK
![](https://blog.kakaocdn.net/dn/WZYze/btsFUXIfXec/kByKsQqT1FkXcM5KhfJsJK/img.png)
20. 장치 연결 후 Open target - Auto Connect
![](https://blog.kakaocdn.net/dn/oBySu/btsFU0dRYvy/ZnfPhk8OFZOzKQaF6ubOCK/img.png)
21. Program Device 클릭 - Program
![](https://blog.kakaocdn.net/dn/c7XQXE/btsFVvSeDYy/kAIx3aVkafckdKmK28MPc0/img.png)
22. XOR programmed
![](https://blog.kakaocdn.net/dn/boK9Fr/btsFTeDWR4b/YbILDles5jSgHc1XfSh7gK/img.png)
23. 프로젝트 파일
Half Adder 설계
1. Create project - Name: my_hadder - Next - RTL Project( Do not specify sources at this time 체크 ) - Next
![](https://blog.kakaocdn.net/dn/bNDCBR/btsFTYnua9y/WFrfysns8SzhRAcruZrkn0/img.png)
![](https://blog.kakaocdn.net/dn/cCs0XY/btsFUbmIjWo/pFDT6O4mkFiBtrDBZ7KJHK/img.png)
2. Parts는 동일하게 설정
![](https://blog.kakaocdn.net/dn/bt5KgR/btsFUm9vkvP/BDhtecgJmRHBRCsWap6r41/img.png)
3. Summary 확인 - Finish
![](https://blog.kakaocdn.net/dn/cOzmAq/btsFTYnuhXw/I2GEgkikKnru8htlqxdd4K/img.png)
4. Half Adder(반가산기)
![](https://blog.kakaocdn.net/dn/bblmQt/btsFQWxFnZH/8esv2MkPK0BiVxY0K4AQu0/img.png)
5. Add Source - Add or create design sources 선택 - Create File - OK - Finish
![](https://blog.kakaocdn.net/dn/bo2eYE/btsFUjSt2Kk/22kQ5gj04IMZoFTNY93Qyk/img.png)
6. Define Module에서 input, output 이름 정의 - OK
![](https://blog.kakaocdn.net/dn/bw1uUJ/btsFUZ0n9Tg/fzz6vABKKRDRRWtGtCwfZ0/img.png)
7. Sources의 my_hadder.v 파일 Open
![](https://blog.kakaocdn.net/dn/tB6K8/btsFUB6om62/gx5Ct6RGZBCXssR4UNiEVk/img.png)
8. Half Adder 구현을 위한 코드 입력
![](https://blog.kakaocdn.net/dn/9o7t1/btsFUq4ZHuq/ZsFTwvb8e0t51ktUoCE3cK/img.png)
9. Ctrl+S를 눌러 저장한 후, Message탭에서 오류 확인
![](https://blog.kakaocdn.net/dn/dzQxSr/btsFTcsHEgV/YeKvOsu8rf6EPkulPtXxP0/img.png)
10. 좌측 Open Elaborated Design 클릭
![](https://blog.kakaocdn.net/dn/cIPO8W/btsFSbAJgBI/9dgIZ0VYDg5ECxJl8WtJ70/img.png)
11. Run Synthesis - OK - Synthesis Completed 창에서 Open Synthesized Design
12. 우측 상단의 Default Layout으로 변경
![](https://blog.kakaocdn.net/dn/A8tVY/btsFUEIPpnE/B0KZI4KM8tKHeOkPf5zHYk/img.png)
13. Device 창에서 Synthesis 결과 확인
![](https://blog.kakaocdn.net/dn/bViNED/btsFVvrdDtp/NxkE48433fPeY5FHPLd20k/img.png)
14, 다시 상단의 목록을 열어 I/O Planning으로 변경 후 I/O Ports 확인
![](https://blog.kakaocdn.net/dn/csHozv/btsFSbtVEdV/yunvgimDodJrxTkUjFZal0/img.png)
15. Schematic을 참조하여 input, output 포트, I/O std 편집
![](https://blog.kakaocdn.net/dn/cuRqJD/btsFUlv0991/S0bIWMn60vXQb6ncATNHUK/img.png)
![](https://blog.kakaocdn.net/dn/7PFA5/btsFUeX1JAs/lnIeTVUeUIubpeLrisj0Kk/img.png)
16. 우측 상단 X를 눌러 종료, 저장
![](https://blog.kakaocdn.net/dn/Eka3n/btsFR2KID63/TJgLBbPMpRDExknJWBhjQk/img.png)
17, Run Implementation 클릭 - open implemented design
![](https://blog.kakaocdn.net/dn/b3TXls/btsFRkrx2t0/X5sOgoNMXPrx1fxsw4ycjK/img.png)
18. Schematic과 Device 창을 vertical로 열어 각 부분 확인
![](https://blog.kakaocdn.net/dn/qEwvb/btsFQVFpx5f/ba8CpgTGcZ2hVUfjAx9Ci0/img.png)
19. Generate Bitstream 누르고, Open Hardware Manager
20. Open Target - Program Device - Program로 장치에 프로그램 적용
![](https://blog.kakaocdn.net/dn/bC5wbK/btsFVT6CrOu/KUvMsKTViPmr0Wiye1jw01/img.png)
21. Programmed 확인
![](https://blog.kakaocdn.net/dn/tHPOJ/btsFU8JHTBn/nyR2PdYvTHzRJY9M4M8HtK/img.png)
22. 작동 확인
![](https://blog.kakaocdn.net/dn/b45FHK/btsFVsOVB7l/U1kTezoghwKdKqvssoLwTK/img.jpg)
![](https://blog.kakaocdn.net/dn/LUiOi/btsFU06cKGW/Is7kBZGtPP65xOIg6mUKHK/img.jpg)
![](https://blog.kakaocdn.net/dn/bHym2T/btsFS2DQqYr/DliyC3AYlfmdPB7VcMCSAk/img.jpg)
23. 프로젝트 파일
Verilog 문법
- 데이터값
- '0': 논리값 0, False, Condition, Ground
- '1': 논리값 1, True, Condition, Power
- 'x' 또는 'X': Unknown, Un-initialized -> 하드웨어에서 구현 불가능
- 'z' 또는 'Z': High Impedance, Floating ( High Impedance: 저항이 커서 신호가 끊어진 상태)
- 수치 표현
- 상수/숫자 표현을 위한 구문: <size><base format><number>
- <size>: number의 길이(비트단위). 항상 정수
- <base format> = <s><radix>: signed/unsigned + 자료형 표현
<s>: 선택적 요소(생략 시 unsigned가 기본으로 설정됨)
<radix>: 필수적 요소, b/B(Binary), o/O(Octal), d/D(Decimal), h/H(Hex) - <size>와 <base format>이 생략되면 32bit signed decimal이 기본값
- <number>: 실제 값
- [example]
- 4'sb0010 =4bit의 signed binary 0010
- 6'b110111: 6bit의 binary 값
- 8'sh21: 8bit의 signed hex 값
- 2진수로 음수 표현 방법: 2의 보수 사용
- 2의 보수: 양수 비트를 반전시킨 후 1을 더한다
ex) 7(10) = 0000 0111(2) -> 비트 반전: 1111 1000(2) -> +1-> -7(10) = 1111 1001(2)
100(10) = 0110 0100(2) -> 비트 반전: 1001 1011(2) -> +1 -> -100(1) = 1001 1110(2)
- 2의 보수: 양수 비트를 반전시킨 후 1을 더한다
- 상수/숫자 표현을 위한 구문: <size><base format><number>
Verilog 데이터 객체와 데이터 타입(Reg & Wire)
- Net: 회로의 물리적 연결
- wire: 가장 기본적인 net타입. 두 개 이상의 포트 연결에 사용
- tri: wire과 유사하나 tri-state버스에서 사용될 수 있는 high impedance상태 가능
- Variables(변수, 신호의 종류): 데이터를 저장하고 처리하는 데 사용
- reg(레지스터 변수): 비동기 또는 동기식 회로 모델링에 사용
- integer: 부동 소수점 값을 저장하는 데 사용
- real, time, ...
- 신호 정의 방법: signal_type size signal_name
- signal_type: wire나 reg중 사용
- always문 외부에서 선언 시 wire가 default
- Verilog의 procedural block(always, initial 구문) 내부에 할당된 모든 객체는 reg데이터 타입으로 선언해야 함
실습 4: Full Adder 설계
[ Full Adder ]
![](https://blog.kakaocdn.net/dn/clUJCc/btsFWkXzgJS/mTFJ5m9JOSGbmlaqQzkl10/img.png)
1. 3개의 Input을 사용하기 위해 4 User Slide Switches를 JA1포트에 연결
![](https://blog.kakaocdn.net/dn/p2VlK/btsFU6r1bu0/1KcTCyTKQKed8EG20jpXA1/img.png)
![](https://blog.kakaocdn.net/dn/cf0NkA/btsFU1j4JK6/xceOu12whDjN8Am7gnLtnK/img.png)
1.1 연결된 모습
![](https://blog.kakaocdn.net/dn/czwyE6/btsFUXPvxEE/OF8FTYb2XJ99hcfL7TQFX1/img.jpg)
2. 스위치는 번호순으로 각각 JA1_P, JA1_N, JA2_P, JA2_N에 연결되므로 Schematic을 통해 핀 번호 확인
![](https://blog.kakaocdn.net/dn/uhxsK/btsFUZ7CnLn/PeZK8DjVovfIxfoc5S8pSk/img.png)
![](https://blog.kakaocdn.net/dn/bGulIs/btsFSaWBbrF/yQCNiaooXUyAja2ieW7gm0/img.png)
![](https://blog.kakaocdn.net/dn/808iI/btsFUj6rx9p/myplyKQV6jkouyn9C7OrW0/img.png)
3. Vivado를 실행하여 my_fadder.v 파일을 생성한 후, Addsource를 통해 input에 A, B, Ci, Output에 S, Co를 설정
4. Open Elaborated Design을 통해 코드 작성
![](https://blog.kakaocdn.net/dn/WonZJ/btsFS1rIkfX/pBJryQIMuU6Cj5chcR69nk/img.png)
5, Ctrl+S로 저장 후 Warning 유무 확인
![](https://blog.kakaocdn.net/dn/3pEzX/btsFUZzNJaH/3gKKxMCBqVlowRIrk3n501/img.png)
6, Run Synthesis - Open Synthesized Design
![](https://blog.kakaocdn.net/dn/bGvn75/btsFUbOgZCO/1vgvckvQfk0axArG1KjJy0/img.png)
7. 우측 상단의 I/O Pannel 선택 후 각 Input에 맞는 포트 선택(상단의 Schematic 참조): A(Y18), B(Y19), Ci(Y16) / Output은 아까와 동일하게 초록색 LED로, Co(L14), S(G17) 선택
![](https://blog.kakaocdn.net/dn/uqqZv/btsFRs4hEHv/04XrulRqgLL8DMYw3kuBrk/img.png)
8. 저장 - Run Implmentation
![](https://blog.kakaocdn.net/dn/dKdkap/btsFUIdP1vL/LY7hL92cLv23YETKyJxyHK/img.png)
![](https://blog.kakaocdn.net/dn/bso2to/btsFUmISXds/ZYNMxYhMkCnY7DsTE9ApgK/img.png)
9. Generate Bitstream - Open H/W Manager - ProgramDevice 후 실행 확인
![]() | ![]() |
A = 0 , B = 0 , Ci = 0 -> S = 0 , Co = 0 | A = 1 , B = 0 , Ci = 0 -> S = 1 , Co = 0 |
![]() | ![]() |
A = 0 , B = 1 , Ci = 0 -> S = 1 , Co = 0 | A = 1 , B = 1 , Ci = 0 -> S = 0 , Co = 1 |
![]() | ![]() |
A = 0 , B = 0 , Ci = 1 -> S = 1 , Co = 0 | A = 1 , B = 0 , Ci = 1 -> S = 0 , Co = 1 |
![]() | ![]() |
A = 0 , B = 1 , Ci = 1 -> S = 0 , Co = 1 | A = 1 , B = 1 , Ci = 1 -> S = 1 , Co = 1 |
10. 프로젝트 파일