Harman 세미콘 아카데미/SoC를 위한 Peripheral 설계

2024.9.5 [SoC를 위한 Peripheral 설계]1 - Vitis 사용법, button 제어, led_switch 제어

U_Pong 2024. 9. 5. 19:18

2024.9.5 수업날

SoC: System on Chip


< Vivado: IP INTEGRATOR >

새로운 주제로 수업을 진행하므로 Vivado에서 새로운 project를 만들어준다.

새롭게 지정해야하는 것은 project 이름, RTL 설정, 보드를 Basys3으로 설정하는 것이다.

 

vivado의 왼쪽 메뉴에서 Create Block Design->이름을 설정한다.

그러면 두번째 사진처럼 Diagram 창이 나타난다.

 

다음으로 아래의 순서와 같이 진행하면 된다.

MicroBlaze를 더블클릭하여 설정한다.

 

 

순서 재배열하기

 

 

 

USB UART 추가하기
순서 재배열하기

 

오류가 없는지 확인

 

 

Source에서 방금 만든 Design Sources의 우클릭을 하여 Create HDL Wrapper를 클릭한다.

 

그러면 이렇게 자동으로 코드가 만들어지는 것을 확인할 수 있다.

자동적으로 set as top이 되어있으므로 이 코드로 bitstream을 실행한다.

그리고 bitstream이 완료되었다고 해서 바로 hardware manager를 선택하지 않고 cancel를 선택한다.

ram에 정보 올리는 것을 먼저 해야하기 때문이다.

 

다음으로 .xsa 파일을 만들어야한다.

두번째 사진에서는 꼭 Include bitstream을 체크표시한다.

.xsa 파일 생성된 모습

 

 

< Vitis 실행 >

vivado에서 vitis를 실행한다.

vitis 처음 실행 화면

 

하드웨어 플랫폼을 생성한다.

vivado에서 export한 하드웨어를 가지고 플랫폼을 생성하는 것이다.

platform project 생성한 모습
build를 하여 out-of-date 글자가 사라지게한다 -> 하드웨어 생성

 

 

다음으로 hardware platform 위에 파일을 만들고 구동시키면 된다. -> 어플리케이션 프로젝트를 생성한다.

방금 생성한 플랫폼에서 동작한다라는 것을 알려준다.

 

templates를 Hello World로 설정한다.

 

그러면 아래와 같이 코드가 추가된다. helloworld.c가 메인파일이다.

 

Mblaze_hello_app을 build project 하고 run as-> Launch on hardware를 실행하면 comportmaster에 글이 출력되는 것을 확인할 수 있다.

 

이번에는 comportmaster에 1초마다 문구가 출력되는 것을 해보자.

자동완성을 하려면 ctrl+spacebar를 하면 된다.

 

Mblaze_hello_app 결과, 코드는 영상참고

 

 

 

< Button 제어 >

위에서 했던 방식으로 이번에는 Basys3의 button을(Reset 제외) 누를 때 comportmaster에 숫자가 뜨게 해보자.

Vivado 진행 순서

기본적으로 해야하는 순서

 

4 Push Buttons를 추가하고 완성된 모습

 

Create HDL wrapper 후 set as top을 한 후에 bitsream 실행하기

 

 

 

vitis 진행 순서

Platform project

 

Application project

 

Mblaze_button_app -> helloworld.c 소스코드
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "xgpio.h"

#define BTN_ID XPAR_AXI_GPIO_0_DEVICE_ID
#define BTN_CHANNEL 1

int main()
{
    init_platform();

    print("Start!\n");

    XGpio_Config *cfg_ptr;
    XGpio btn_device;

    u16 data = 0;

    cfg_ptr = XGpio_LookupConfig(BTN_ID);
    XGpio_CfgInitialize(&btn_device, cfg_ptr, cfg_ptr->BaseAddress);
    XGpio_SetDataDirection(&btn_device, BTN_CHANNEL, 0b1111);

    while(1){
    	data = XGpio_DiscreteRead(&btn_device, BTN_CHANNEL);
    	xil_printf("Button : %d \n", data);
    	print("Hello World!\n");
    	MB_Sleep(1000);
    }

    cleanup_platform();
    return 0;
}

 

Mblaze_button_app 결과

 

 

 

< led&switch 제어 >

vivado 진행 순서

 

 

vitis 진행 순서

platform project

 

Application project

 

Mblaze_led_sw_app -> helloworld.c 소스코드
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "xgpio.h"

#define GPIO_ID XPAR_GPIO_0_DEVICE_ID
#define LED_CHANNEL 1
#define SW_CHANNEL 2


int main()
{
    init_platform();

    print("start!\n");

    XGpio_Config *cfg_ptr;
    XGpio gpio_instance;

    u32 data;

    cfg_ptr = XGpio_LookupConfig(GPIO_ID);
    XGpio_CfgInitialize(&gpio_instance, cfg_ptr, cfg_ptr->BaseAddress);
    XGpio_SetDataDirection(&gpio_instance, LED_CHANNEL, 0);
    XGpio_SetDataDirection(&gpio_instance, SW_CHANNEL, 0xffff);



    while(1){
        data = XGpio_DiscreteRead(&gpio_instance, SW_CHANNEL);
        XGpio_DiscreteWrite(&gpio_instance, LED_CHANNEL, data);
        print("Hello World\n");
        MB_Sleep(1000);
    }
    cleanup_platform();
    return 0;
}

 

 

Mblaze_led_sw_app 결과

Vitis 사용법, button 제어, led_switch 제어 끝!