[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보드]
번호 | 명칭 | 번호 | 명칭 |
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 ]
Vivado 실습: AND 프로그램 적용 및 XOR 프로그램 작성
1. open project "my_and.v"
2. 파일 확인
3. Navigator의 PROGRAM AND DEBUG - Open Hardward manager클릭
4. 상단의 Open target - Auto connect 클릭
5. 장치 인식
6. PROGRAM AND DEBUG - Open Hardware Manager- program device - Status에 Programmed 확인
7. 버튼 두 개 함께 누르면 LED 전원 동작 확인(AND 동작)
8. 프로젝트 파일
my_XOR.xpr 파일 생성
1. 8일차 과정을 참고하여 파일 생성 및 오픈
2. Add Sources - Design Source Create
3. Next - Create File - type(Verilog), name(my_XOR) 입력 - OK - Finish
4. Input으로 Port Name A와 B, Output으로 Port Name R로 지정 - OK
5. Sources - Design Sources의 my_XOR.v 파일 open
6. assign R = A^B; 코드 추가(^은 XOR 코드)
7. Ctrl+S를 눌러 저장 후 Message탭의 오류 확인
8. 좌측 Flow Navigator - RTL ANALYSIS - Open Elaborated Design 클릭 - OK
9. Schematic 실행 확인
10. 좌측 Flow Navigator - SYNTHESIS - Run Synthesis 클릭 - OK
11. 다음 창이 뜨면 Open Synthesis Design 선택 - OK
12. Device 창 확인
13. my_XOR 우클릭 - Schematic open
14. Schematic 탭 우클릭 - New Vertical Group
15. 하단 I/O Ports 탭에서 A(D20), B(D19), R(G17) 포트 설정, I/O Std를 모두 LVCMOS33으로 설정
16. 좌측 Flow Navigator - IMPLEMENTATION - Run Implemntation - Save 창이 뜨면 다음 내용 입력 후 OK
17. 저장 후 실행 - OK
18. Open Implementation Design - OK
19. Flow Navigation - Generate Bitstream - OK
20. 장치 연결 후 Open target - Auto Connect
21. Program Device 클릭 - Program
22. XOR programmed
23. 프로젝트 파일
Half Adder 설계
1. Create project - Name: my_hadder - Next - RTL Project( Do not specify sources at this time 체크 ) - Next
2. Parts는 동일하게 설정
3. Summary 확인 - Finish
4. Half Adder(반가산기)
5. Add Source - Add or create design sources 선택 - Create File - OK - Finish
6. Define Module에서 input, output 이름 정의 - OK
7. Sources의 my_hadder.v 파일 Open
8. Half Adder 구현을 위한 코드 입력
9. Ctrl+S를 눌러 저장한 후, Message탭에서 오류 확인
10. 좌측 Open Elaborated Design 클릭
11. Run Synthesis - OK - Synthesis Completed 창에서 Open Synthesized Design
12. 우측 상단의 Default Layout으로 변경
13. Device 창에서 Synthesis 결과 확인
14, 다시 상단의 목록을 열어 I/O Planning으로 변경 후 I/O Ports 확인
15. Schematic을 참조하여 input, output 포트, I/O std 편집
16. 우측 상단 X를 눌러 종료, 저장
17, Run Implementation 클릭 - open implemented design
18. Schematic과 Device 창을 vertical로 열어 각 부분 확인
19. Generate Bitstream 누르고, Open Hardware Manager
20. Open Target - Program Device - Program로 장치에 프로그램 적용
21. Programmed 확인
22. 작동 확인
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 ]
1. 3개의 Input을 사용하기 위해 4 User Slide Switches를 JA1포트에 연결
1.1 연결된 모습
2. 스위치는 번호순으로 각각 JA1_P, JA1_N, JA2_P, JA2_N에 연결되므로 Schematic을 통해 핀 번호 확인
3. Vivado를 실행하여 my_fadder.v 파일을 생성한 후, Addsource를 통해 input에 A, B, Ci, Output에 S, Co를 설정
4. Open Elaborated Design을 통해 코드 작성
5, Ctrl+S로 저장 후 Warning 유무 확인
6, Run Synthesis - Open Synthesized Design
7. 우측 상단의 I/O Pannel 선택 후 각 Input에 맞는 포트 선택(상단의 Schematic 참조): A(Y18), B(Y19), Ci(Y16) / Output은 아까와 동일하게 초록색 LED로, Co(L14), S(G17) 선택
8. 저장 - Run Implmentation
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. 프로젝트 파일