Vitis로 Processing System Programming

SungchulCHA·2024년 4월 25일
0

Vivado

목록 보기
2/6

Zybo Z7-20 참고

Xilinx ZYNQ Architecture
ZYNQ Schematic Bank 500
ZYNQ Schematic Bank 501

Configure PS in Vivado

  1. 이전 과정

  2. PS Vivado에 올리고 'Run Block Automation'

  3. PS MIO Configuration

  4. PS Clock Configuration

  5. MIO External Port 생성

  6. 이후 과정

  7. Generate Bitstream 이후 bitstream 포함한 XSA 파일 생성

  8. tools → Vitis IDE 실행


Vitis IDE 에서 PS 프로그래밍

  1. Create Application Project

  2. XSA 파일 가져오기

  3. 빈 Templates 생성

추가 사항

XSA 파일(HW) 업데이트

Vitis C code 해석

#include <stdio.h>
#include "xil_printf.h"
#include "xgpiops.h"

// void print(char *str);

int main()
{

    static XGpioPs psGpioInstancePtr;
    XGpioPs_Config *GpioConfigPtr;
    int xStatus;
    int BtnPinDirection = 0, BtnPinNumber = 50;
    int LedPinDirection = 1, LedPinNumber = 7;
    int ReadStatus = 0, OldStatus = 0;

    print("Hello World\n\r");

    // PS GPIO Initialization

    GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
    if (GpioConfigPtr == NULL)
        return XST_FAILURE;

    xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr, GpioConfigPtr, GpioConfigPtr->BaseAddr);
    if (XST_SUCCESS != xStatus)
        print("PS GPIO INIT FAILED \n\r");

    // PS GPIO pin setting
    // Push button input
    XGpioPs_SetDirectionPin(&psGpioInstancePtr, BtnPinNumber, BtnPinDirection);
    XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, BtnPinNumber, 0);

    // LED output
    XGpioPs_SetDirectionPin(&psGpioInstancePtr, LedPinNumber, LedPinDirection);
    XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, LedPinNumber, 0);

    xStatus = 0;

    while (1)
    {
        ReadStatus = XGpioPs_ReadPin(&psGpioInstancePtr, BtnPinNumber);
        if ((ReadStatus == 1) && (OldStatus == 0))
        {
            print("BTN8_PUSH Button pressed \r\n");
            if (xStatus == 1)
            {
                xStatus = 0;
                XGpioPs_WritePin(&psGpioInstancePtr, LedPinNumber, 0);
                print("LED is Off \r\n");
            }
            else
            {
                xStatus = 1;
                XGpioPs_WritePin(&psGpioInstancePtr, LedPinNumber, 1);
                print("LED is On \r\n");
            }
        }
        OldStatus = ReadStatus;
    }

    return 0;
}

전체 요약

이 코드는 GPIO (General Purpose Input/Output)를 사용하여 LED를 제어하고 버튼 입력을 읽는 C 프로그램입니다.

  1. XGpioPsXGpioPs_Config는 Xilinx의 GPIO 드라이버에서 사용하는 데이터 구조입니다. psGpioInstancePtr는 GPIO 인스턴스를 나타내며, GpioConfigPtr는 GPIO 설정을 나타냅니다.

  2. BtnPinDirection, BtnPinNumber, LedPinDirection, LedPinNumber는 각각 버튼과 LED의 GPIO 핀 방향과 번호를 나타냅니다.

  3. XGpioPs_LookupConfig 함수는 주어진 Device ID를 사용하여 GPIO 설정을 찾습니다.

  4. XGpioPs_CfgInitialize 함수는 GPIO 인스턴스를 초기화합니다.

  5. XGpioPs_SetDirectionPinXGpioPs_SetOutputEnablePin 함수는 GPIO 핀의 방향을 설정하고 출력을 활성화합니다.

  6. while(1) 루프 안에서, XGpioPs_ReadPin 함수는 버튼의 현재 상태를 읽습니다. 버튼이 눌려지면 (ReadStatus==1), LED의 상태를 전환하고 상태 메시지를 출력합니다.

  7. XGpioPs_WritePin 함수는 LED의 상태를 변경합니다.

이 코드는 Xilinx의 Zynq-7000 SoC와 같은 플랫폼에서 실행되도록 설계되었습니다. 이러한 플랫폼은 PS (Processing System)와 PL (Programmable Logic)을 모두 포함하며, 이 코드는 PS의 GPIO를 사용합니다.


헤더 파일

xgpiops.h : GPIO PS (Button) 사용을 위한 header file


변수 선언

  • XGpioPs psGpioInstancePtr : 이 변수는 GPIO 인스턴스를 나타냅니다. 이 인스턴스를 통해 GPIO 핀을 제어합니다.

  • XGpioPs_Config *GpioConfigPtr : 이 변수는 GPIO 설정을 가리키는 포인터입니다. 이 설정은 GPIO 인스턴스를 초기화하는 데 사용됩니다.

  • int xStatus : 이 변수는 GPIO 인스턴스 초기화의 상태를 저장하고, LED의 상태 (켜짐/꺼짐)를 추적하는 데도 사용됩니다.

  • int BtnPinDirection = 0, BtnPinNumber = 50 : 이 변수들은 버튼의 GPIO 핀 번호와 방향을 설정합니다. 여기서 방향 0은 입력을 의미합니다. 번호 50은 버튼 MIO 포트번호

  • int LedPinDirection = 1, LedPinNumber = 7 : 이 변수들은 LED의 GPIO 핀 번호와 방향을 설정합니다. 여기서 방향 1은 출력을 의미합니다. 번호 7은 LED MIO 포트번호

  • int ReadStatus=0, OldStatus=0 : ReadStatus는 현재 버튼의 상태를 읽는 데 사용되며, OldStatus는 이전 버튼의 상태를 저장하는 데 사용됩니다. 이 두 변수를 비교하여 버튼이 눌렸는지 확인합니다. → 두 번 눌리는거 방지


PS GPIO 초기화

  1. XGpioPs_LookupConfig() 함수

Xilinx GPIO 디바이스의 설정을 찾는 함수입니다. 이 함수는 특정 디바이스 ID를 인자로 받아 해당 디바이스의 설정을 찾고, 찾은 설정을 XGpioPs_Config 구조체 포인터로 반환합니다.

이 함수를 호출하면, 디바이스의 설정 정보를 포함하는 XGpioPs_Config 구조체의 인스턴스를 찾을 수 있습니다. 이 정보는 디바이스를 초기화하고 제어하는 데 필요한 여러 가지 정보를 포함하고 있습니다.

예를 들어, 이 코드에서는 XPAR_PS7_GPIO_0_DEVICE_ID라는 디바이스 ID를 인자로 XGpioPs_LookupConfig() 함수를 호출하고 있습니다. 이 디바이스 ID는 Xilinx의 Vivado 디자인 툴에서 자동으로 생성되며, 특정 GPIO 디바이스를 식별하는 데 사용됩니다.

따라서 이 함수를 통해 XPAR_PS7_GPIO_0_DEVICE_ID에 해당하는 GPIO 디바이스의 설정을 찾을 수 있습니다. 찾은 설정은 GpioConfigPtr라는 포인터 변수에 저장되며, 이후 이 설정을 사용하여 디바이스를 초기화하고 제어합니다.

  1. XGpioPs_CfgInitialize() 함수

Xilinx GPIO 디바이스를 초기화하는 함수입니다. 이 함수는 GPIO 인스턴스, GPIO 설정, 그리고 디바이스의 기본 주소를 인자로 받습니다.

  • GPIO Instance: 이 인자는 XGpioPs 구조체의 포인터입니다. 이 구조체는 GPIO 디바이스의 인스턴스를 나타내며, 이 함수를 통해 초기화됩니다.

  • GPIO Config: 이 인자는 XGpioPs_Config 구조체의 포인터입니다. 이 구조체는 GPIO 디바이스의 설정을 나타내며, XGpioPs_LookupConfig() 함수를 통해 얻을 수 있습니다.

  • The physical base address of the device: 이 인자는 GPIO 디바이스의 물리적인 메모리 주소를 나타냅니다. 이 주소는 XGpioPs_Config 구조체의 BaseAddr 멤버를 통해 얻을 수 있습니다.

이 함수는 GPIO 디바이스를 초기화하고, 초기화가 성공적으로 이루어졌는지 여부를 반환합니다. 초기화가 성공적으로 이루어지면 XST_SUCCESS를 반환하고, 그렇지 않으면 에러 코드를 반환합니다. 이 함수를 통해 GPIO 디바이스를 사용할 준비를 할 수 있습니다.


GPIO 핀 설정

  1. XGpioPs_SetDirectionPin() 함수

Xilinx GPIO 디바이스의 특정 핀의 방향을 설정하는 함수입니다. 이 함수는 GPIO 인스턴스, 핀 번호, 그리고 방향을 인자로 받습니다.

  • GPIO Instance: 이 인자는 XGpioPs 구조체의 포인터입니다. 이 구조체는 GPIO 디바이스의 인스턴스를 나타냅니다.

  • Pin Number: 이 인자는 방향을 설정하려는 GPIO 핀의 번호를 나타냅니다.

  • Direction: 이 인자는 설정하려는 방향을 나타냅니다. 일반적으로 1은 출력을, 0은 입력을 나타냅니다.

이 함수를 호출하면, 지정한 GPIO 핀의 방향이 설정됩니다. 예를 들어, 이 함수를 사용하여 버튼이 연결된 GPIO 핀을 입력으로 설정하거나, LED가 연결된 GPIO 핀을 출력으로 설정할 수 있습니다. 이렇게 방향을 설정한 후에는, 해당 핀을 통해 데이터를 읽거나 쓸 수 있습니다.

  1. XGpioPs_SetOutputEnablePin() 함수

Xilinx GPIO 디바이스의 특정 핀의 출력 활성화 상태를 설정하는 함수입니다. 이 함수는 GPIO 인스턴스, 핀 번호, 그리고 출력 활성화 상태를 인자로 받습니다.

  • GPIO Instance: 이 인자는 XGpioPs 구조체의 포인터입니다. 이 구조체는 GPIO 디바이스의 인스턴스를 나타냅니다.

  • Pin Number: 이 인자는 출력 활성화 상태를 설정하려는 GPIO 핀의 번호를 나타냅니다.

출력 활성화 상태: 이 인자는 설정하려는 출력 활성화 상태를 나타냅니다. 일반적으로 1은 출력을 활성화하고, 0은 출력을 비활성화합니다.

이 함수를 호출하면, 지정한 GPIO 핀의 출력 활성화 상태가 설정됩니다. 예를 들어, 이 함수를 사용하여 LED가 연결된 GPIO 핀의 출력을 활성화하거나 비활성화할 수 있습니다. 이렇게 출력 활성화 상태를 설정한 후에는, 해당 핀을 통해 데이터를 출력할 수 있습니다.


버튼 입력 및 LED 제어

  1. XGpioPs_ReadPin() 함수

Xilinx GPIO 디바이스의 특정 핀에서 데이터를 읽는 함수입니다. 이 함수는 GPIO 인스턴스와 핀 번호를 인자로 받습니다.

  • GPIO Instance: 이 인자는 XGpioPs 구조체의 포인터입니다. 이 구조체는 GPIO 디바이스의 인스턴스를 나타냅니다.

  • Pin Number: 이 인자는 데이터를 읽으려는 GPIO 핀의 번호를 나타냅니다.

이 함수를 호출하면, 지정한 GPIO 핀에서 데이터를 읽어 반환합니다. 예를 들어, 이 함수를 사용하여 버튼이 연결된 GPIO 핀에서 버튼의 상태를 읽을 수 있습니다. 이렇게 읽은 데이터는 일반적으로 0 또는 1의 값을 가지며, 이는 각각 버튼이 눌리지 않았음 또는 눌렸음을 나타냅니다.

  1. XGpioPs_WritePin() 함수

Xilinx GPIO 디바이스의 특정 핀에 데이터를 쓰는 함수입니다. 이 함수는 GPIO 인스턴스, 핀 번호, 그리고 쓰려는 데이터를 인자로 받습니다.

  • GPIO Instance: 이 인자는 XGpioPs 구조체의 포인터입니다. 이 구조체는 GPIO 디바이스의 인스턴스를 나타냅니다.

  • Pin Number: 이 인자는 데이터를 쓰려는 GPIO 핀의 번호를 나타냅니다.

  • Data: 이 인자는 핀에 쓰려는 데이터를 나타냅니다. 일반적으로 1은 핀을 높은 상태로 설정하고, 0은 핀을 낮은 상태로 설정합니다.

이 함수를 호출하면, 지정한 GPIO 핀에 데이터가 쓰여집니다. 예를 들어, 이 함수를 사용하여 LED가 연결된 GPIO 핀에 데이터를 쓰면, LED의 상태를 제어할 수 있습니다. 이렇게 쓴 데이터는 핀의 상태를 결정하며, 이는 디바이스에 물리적인 효과를 미칩니다.

profile
Myongji UNIV. B.S. in Electronic Engineering

0개의 댓글

관련 채용 정보