Xilinx ZYNQ Architecture |
---|
ZYNQ Schematic Bank 500 |
---|
ZYNQ Schematic Bank 501 |
---|
PS Vivado에 올리고 'Run Block Automation'
PS MIO Configuration
PS Clock Configuration
MIO External Port 생성
Generate Bitstream 이후 bitstream 포함한 XSA 파일 생성
tools → Vitis IDE 실행
Create Application Project
XSA 파일 가져오기
빈 Templates 생성
추가 사항
XSA 파일(HW) 업데이트 |
---|
#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 프로그램입니다.
XGpioPs
와 XGpioPs_Config
는 Xilinx의 GPIO 드라이버에서 사용하는 데이터 구조입니다. psGpioInstancePtr
는 GPIO 인스턴스를 나타내며, GpioConfigPtr
는 GPIO 설정을 나타냅니다.
BtnPinDirection
, BtnPinNumber
, LedPinDirection
, LedPinNumber
는 각각 버튼과 LED의 GPIO 핀 방향과 번호를 나타냅니다.
XGpioPs_LookupConfig
함수는 주어진 Device ID를 사용하여 GPIO 설정을 찾습니다.
XGpioPs_CfgInitialize
함수는 GPIO 인스턴스를 초기화합니다.
XGpioPs_SetDirectionPin
과 XGpioPs_SetOutputEnablePin
함수는 GPIO 핀의 방향을 설정하고 출력을 활성화합니다.
while(1) 루프 안에서, XGpioPs_ReadPin
함수는 버튼의 현재 상태를 읽습니다. 버튼이 눌려지면 (ReadStatus==1
), LED의 상태를 전환하고 상태 메시지를 출력합니다.
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
는 이전 버튼의 상태를 저장하는 데 사용됩니다. 이 두 변수를 비교하여 버튼이 눌렸는지 확인합니다. → 두 번 눌리는거 방지
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
라는 포인터 변수에 저장되며, 이후 이 설정을 사용하여 디바이스를 초기화하고 제어합니다.
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 디바이스를 사용할 준비를 할 수 있습니다.
XGpioPs_SetDirectionPin()
함수Xilinx GPIO 디바이스의 특정 핀의 방향을 설정하는 함수입니다. 이 함수는 GPIO 인스턴스, 핀 번호, 그리고 방향을 인자로 받습니다.
GPIO Instance: 이 인자는 XGpioPs
구조체의 포인터입니다. 이 구조체는 GPIO 디바이스의 인스턴스를 나타냅니다.
Pin Number: 이 인자는 방향을 설정하려는 GPIO 핀의 번호를 나타냅니다.
Direction: 이 인자는 설정하려는 방향을 나타냅니다. 일반적으로 1은 출력을, 0은 입력을 나타냅니다.
이 함수를 호출하면, 지정한 GPIO 핀의 방향이 설정됩니다. 예를 들어, 이 함수를 사용하여 버튼이 연결된 GPIO 핀을 입력으로 설정하거나, LED가 연결된 GPIO 핀을 출력으로 설정할 수 있습니다. 이렇게 방향을 설정한 후에는, 해당 핀을 통해 데이터를 읽거나 쓸 수 있습니다.
XGpioPs_SetOutputEnablePin()
함수Xilinx GPIO 디바이스의 특정 핀의 출력 활성화 상태를 설정하는 함수입니다. 이 함수는 GPIO 인스턴스, 핀 번호, 그리고 출력 활성화 상태를 인자로 받습니다.
GPIO Instance: 이 인자는 XGpioPs
구조체의 포인터입니다. 이 구조체는 GPIO 디바이스의 인스턴스를 나타냅니다.
Pin Number: 이 인자는 출력 활성화 상태를 설정하려는 GPIO 핀의 번호를 나타냅니다.
출력 활성화 상태: 이 인자는 설정하려는 출력 활성화 상태를 나타냅니다. 일반적으로 1은 출력을 활성화하고, 0은 출력을 비활성화합니다.
이 함수를 호출하면, 지정한 GPIO 핀의 출력 활성화 상태가 설정됩니다. 예를 들어, 이 함수를 사용하여 LED가 연결된 GPIO 핀의 출력을 활성화하거나 비활성화할 수 있습니다. 이렇게 출력 활성화 상태를 설정한 후에는, 해당 핀을 통해 데이터를 출력할 수 있습니다.
XGpioPs_ReadPin()
함수Xilinx GPIO 디바이스의 특정 핀에서 데이터를 읽는 함수입니다. 이 함수는 GPIO 인스턴스와 핀 번호를 인자로 받습니다.
GPIO Instance: 이 인자는 XGpioPs
구조체의 포인터입니다. 이 구조체는 GPIO 디바이스의 인스턴스를 나타냅니다.
Pin Number: 이 인자는 데이터를 읽으려는 GPIO 핀의 번호를 나타냅니다.
이 함수를 호출하면, 지정한 GPIO 핀에서 데이터를 읽어 반환합니다. 예를 들어, 이 함수를 사용하여 버튼이 연결된 GPIO 핀에서 버튼의 상태를 읽을 수 있습니다. 이렇게 읽은 데이터는 일반적으로 0 또는 1의 값을 가지며, 이는 각각 버튼이 눌리지 않았음 또는 눌렸음을 나타냅니다.
XGpioPs_WritePin()
함수Xilinx GPIO 디바이스의 특정 핀에 데이터를 쓰는 함수입니다. 이 함수는 GPIO 인스턴스, 핀 번호, 그리고 쓰려는 데이터를 인자로 받습니다.
GPIO Instance: 이 인자는 XGpioPs
구조체의 포인터입니다. 이 구조체는 GPIO 디바이스의 인스턴스를 나타냅니다.
Pin Number: 이 인자는 데이터를 쓰려는 GPIO 핀의 번호를 나타냅니다.
Data: 이 인자는 핀에 쓰려는 데이터를 나타냅니다. 일반적으로 1은 핀을 높은 상태로 설정하고, 0은 핀을 낮은 상태로 설정합니다.
이 함수를 호출하면, 지정한 GPIO 핀에 데이터가 쓰여집니다. 예를 들어, 이 함수를 사용하여 LED가 연결된 GPIO 핀에 데이터를 쓰면, LED의 상태를 제어할 수 있습니다. 이렇게 쓴 데이터는 핀의 상태를 결정하며, 이는 디바이스에 물리적인 효과를 미칩니다.