Vivado에서 Nexys A7 핀을 할당해 보자.
일단 XDC 파일을 프로젝트에 추가한다. 그다음 보드의 Master XDC에서 필요한 핀만 골라 top module의 포트 이름에 맞춘다.
먼저 확인할 것
Nexys A7-100T라면 Digilent의 Nexys-A7-100T Master XDC를 먼저 받는다.
50T와 100T의 파일이 따로 있다. 사용하는 보드 모델부터 확인한다.
스크린샷은 2024년에 직접 작업하면서 저장한 화면이다. 현재 Vivado 버전에서는 메뉴 모양이 조금 다를 수 있다.
XDC 파일 추가
Sources 창의 Constraints에서 constraint set을 우클릭한다. Edit Constraints Sets...를 선택한다.

새 파일을 만드는 경우 Create File을 누른다.

파일 형식은 XDC로 두고 이름을 입력한다.

목록에 새 XDC 파일이 들어왔는지 확인하고 OK를 누른다.

Sources 창의 Constraints 아래에 파일이 생긴다. 처음 만든 파일은 비어 있다.

문법이 기억나지 않으면 Language Templates에서 XDC 예제를 볼 수 있다.

Nexys A7 핀 할당
Master XDC에서 사용할 줄의 주석을 풀고 get_ports 이름을 top module 포트와 맞춘다.
아래는 100 MHz clock, 스위치 하나, LED 하나만 연결한 예제다.
## 100 MHz clock
set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { CLK100MHZ }]
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports { CLK100MHZ }]
## Switch 0
set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { SW[0] }]
## LED 0
set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { LED[0] }]
PACKAGE_PIN은 FPGA package의 실제 핀이다. IOSTANDARD는 해당 I/O의 전기 규격이다.
get_ports 안의 이름이 RTL top module과 다르면 constraint가 적용되지 않는다. 대소문자와 배열 표기까지 같이 확인한다.
확인
일단 아래 세 가지만 본다.
- 선택한 Master XDC가 실제 Nexys A7 모델과 맞는지
- XDC의
get_ports이름과 top module 포트가 같은지 - clock 포트에
create_clock이 들어갔는지
AMD 문서도 top-level I/O에 PACKAGE_PIN과 IOSTANDARD를 지정하는 방식을 사용한다. IOSTANDARD를 빠뜨린 채 bitstream 생성을 진행하지 않는다.
Vivado 화면에서 실제 bitstream 생성까지는 이번에 다시 확인하지 않았다. 여기서는 XDC 추가와 핀 작성까지만 정리한다.
관련 글
공식 자료
- Digilent Nexys A7-100T Master XDC
- AMD Vivado Using Constraints UG903
- AMD IOSTANDARD 속성 UG912
- AMD create_clock 명령 UG835
원문 기록
한 줄 요약
Nexys A7의 Master XDC에서 필요한 줄만 골라 포트 이름을 맞추면 된다.