AMBA AXI – GPIO IP 설계 (2)

약 5분 소요

개요

지난 포스팅(AMBA AXI – GPIO IP 설계(1))에 이어서, GPIO IP를 MicroBlaze에서 동작시키기 위해 Vitis로 올리는 작업을 해보겠다.

Block Design

MicroBlaze용 Vivado 프로젝트 생성

Pasted image 20260218135404.png

Block Design 진행

Pasted image 20260218135417.png

Create Block Design 클릭

Pasted image 20260218135527.png

Design name 마음대로 입력

Pasted image 20260218135601.png

MicroBlaze 추가

Diagram 탭에서 + 버튼 클릭

Pasted image 20260218135624.png

microblaze 검색 후 첫번째 선택

Pasted image 20260218135646.png

Run Block Automation 클릭

Pasted image 20260218135703.png

메모리 용량 넉넉하게 128KB 선택

Pasted image 20260218135736.png

클락 설정 변경

살구색으로 표시된 clk_wiz_1 더블 클릭

Pasted image 20260218135756.png

CLK_IN1을 sys clock으로 변경 후 OK

Pasted image 20260218135928.png

Run Connection Automation 클릭

Pasted image 20260218135941.png

모두 선택 후 OK

Pasted image 20260218140003.png

Regenerate Layout 클릭하여 재정렬

uart 추가

Uart 모듈은 기본적으로 추가해주는 게 좋다.

Pasted image 20260218140036.png

2개 뜨는 것 중 AXI Uartlite 선택

Pasted image 20260218140345.png

UART 모듈 더블 클릭

Pasted image 20260218140417.png

usb uart로 변경

Pasted image 20260218140430.png

사용하고 싶은 Baud Rate 설정 후 OK

Pasted image 20260218140453.png

Run Connection Automation 클릭

Pasted image 20260218140504.png

모두 선택 후 OK

Pasted image 20260218140531.png

GPIO IP 추가

이전 포스팅에서 만든 GPIO IP를 추가해보자.

설정 확인
Pasted image 20260218140706.png

Settings 클릭

Pasted image 20260218140646.png

IP Repository에 이전에 만든 IP의 경로가 있는지 확인.

없으면 +버튼을 눌러서 추가 후 OK

Pasted image 20260218140756.png

+버튼을 누르고 gpio 검색 후 내가 만든 IP를 선택(여기서는 gpio_v1.0)

Pasted image 20260218140902.png

Run Connection Automation 클릭

Pasted image 20260218140926.png

모두 선택 후 OK

Pasted image 20260218140950.png

자동 연결은 됐으나 ioport쪽 포트가 달리지 않았으므로 모듈 우클릭 후 Make external 클릭

Pasted image 20260218141040.png

Pasted image 20260218141100.png

포트 이름을 바꿔주기 위해 선택 후 좌측에 Properties에서 Name을 바꿔주면 된다.

Pasted image 20260218141132.png

GPIO 하나 더 추가

Pasted image 20260218144141.png

각 포트를 led와 btn으로 변경해줌

이렇게 블록 디자인이 완성되었다.

Validate

Pasted image 20260218144251.png

Validate Design 클릭

Pasted image 20260218141739.png

Wrapping 설정(한번만 해주면 추후 수정 시 자동 래핑됨)

블록 디자인(.bd 파일)은 Vivado 내부 포맷이기 때문에 이 자체로는 합성이 되지 않음
그래서 블록 디자인의 입출력 포트를 그대로 가진 Verilog 모듈로 감싸는 것이 Wrapping 작업임.

Pasted image 20260218141846.png

왼쪽에 주황색으로 표시된 곳을 우클릭하여 Create HDL Wrapper 클릭

Pasted image 20260218141930.png

OK

Pasted image 20260218142250.png

색상이 파란색으로 된 것을 확인할 수 있음.

Generate Block Design(블록 디자인 수정 시마다 해줘야 함)

Pasted image 20260218141317.png

Generate Block Design 클릭

Pasted image 20260218141305.png

Global로 설정 후 Generate 클릭

Pasted image 20260218141355.png

Bitstream 생성 및 XSA Export

XDC 파일 설정

Pasted image 20260218143053.png

Wrapping에서 생성됐던 파일을 열어보기

Pasted image 20260218144055.png

여기에서 선언된 포트와 같이 XDC 파일을 변경하되, uart는 XDC에 추가해줄 필요 없음

Pasted image 20260218143212.png

Pasted image 20260218143228.png

Pasted image 20260218143331.png

Pasted image 20260218143856.png

Pasted image 20260218143835.png

Bitstream 생성

Pasted image 20260218144425.png

Pasted image 20260218144506.png

OK 눌러서 비트스트림 생성

Pasted image 20260218144820.png

완료됐으면 Cancel 클릭

XSA Export

Pasted image 20260218144919.png

File – Export – Export Hardware 클릭

Pasted image 20260218144936.png

Pasted image 20260218144942.png

Include bitstream 클릭 후 Next

Pasted image 20260218145015.png

Next 클릭

Pasted image 20260218145036.png

Finish 클릭하면 다음과 같이 xsa 파일이 생성됨

Pasted image 20260218145058.png

Vitis IDE 실행

Pasted image 20260218145201.png

Tools – Launch Vitis IDE 클릭

Pasted image 20260218145258.png

프로젝트 안에 vitis_ws라는 폴더를 만들어주었고 그곳을 워크스페이스로 경로 설정해주었다.

Launch 클릭

Pasted image 20260218145340.png

프로젝트 생성

Pasted image 20260218145502.png

File – New – Application Project 클릭

Pasted image 20260218145544.png

Pasted image 20260218145553.png

Browse 클릭하여 아까만든 XSA 파일 경로를 넣어줌

Pasted image 20260218145626.png

Next 클릭

Pasted image 20260218145655.png

프로젝트 이름을 적어줌

Next 클릭

Pasted image 20260218145715.png

Next 클릭

Pasted image 20260218145741.png

여기에서 Empty Application을 선택할 수도 있고 Hello World를 선택할 수도 있는데

여기서는 Uart를 활용하기 위해 Hello World로 하였다.

Hello World 선택 후 Finish

Pasted image 20260218145804.png

Pasted image 20260218145836.png

소스 코드가 이렇게 작성되어 있으므로 빌드해서 실행해보면 실행이 되는데

시리얼모니터를 띄우고 리셋버튼을 누르면 다음과 같이 뜨는 것을 확인할 수 있음

Pasted image 20260218145951.png

어쨌든 여기에서 코드를 시작하도록 하자.

Pasted image 20260218151705.png

우선 helloworld.c는 나중에 필요 시 참고만 하고 동작을 안하게 하기 위해 모두 주석처리해주었다.

GPIO 코드 수정

일단 xparameters.h 파일에 들어가면 다음과 같이 GPIO가 메모리맵에 있는 것을 확인할 수 있다.

Pasted image 20260218151452.png

/* Definitions for driver GPIO */
#define XPAR_GPIO_NUM_INSTANCES 2

/* Definitions for peripheral GPIO_0 */
#define XPAR_GPIO_0_DEVICE_ID 0
#define XPAR_GPIO_0_S00_AXI_BASEADDR 0x44A00000
#define XPAR_GPIO_0_S00_AXI_HIGHADDR 0x44A0FFFF


/* Definitions for peripheral GPIO_1 */
#define XPAR_GPIO_1_DEVICE_ID 1
#define XPAR_GPIO_1_S00_AXI_BASEADDR 0x44A10000
#define XPAR_GPIO_1_S00_AXI_HIGHADDR 0x44A1FFFF
  • GPIO 인스턴스가 2개라고 잡힘
  • 0번 디바이스의 메모리 맵 주소: 0x44A00000 ~ 0x44A0FFFF
  • 1번 디바이스의 메모리 맵 주소: 0x44A10000 ~ 0x44A1FFFF

이렇게 잡히면 정상이라고 보면 된다.

결론

이번 포스팅에서는 MicroBlaze에서 작업하기 위해 필요한 모든 설정을 해주었고 코딩만 하면 되는 상태로 만들어주었다.

xparameters.h 파일에서 내가 추가한 GPIO IP의 주소가 메모리 주소로 올라오는 것을 확인하였다.

다음 포스팅에서 코딩을 이어나가도록 하자.

Leave a Comment

error: Content is protected !!