AXI로 PL 제어하기

SungchulCHA·2024년 4월 25일
0

Vivado

목록 보기
3/6

HW

  1. 이전 과정

  2. AXI GPIO 생성

  3. Run Connection Automation에서 AXI만 연결

  4. Create Port

  5. 이후 과정


Code 해석

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

int main()
{
	static XGpio GpioInstance_ptr;
	static XGpioPs psGpioInstance_ptr;
	XGpioPs_Config *GpioConfigPtr;
	u8 count = 0;

	int xStatus;
	int BtnPinDirection = 0, BtnPinNumber = 50;
	int Readstatus = 0, OldReadstatus = 0;

	xStatus = XGpio_Initialize(&GpioInstance_ptr, XPAR_AXI_GPIO_0_DEVICE_ID);
	if (XST_SUCCESS != xStatus)
		print("GPIO INIT FAILDED \n\r");

	// AXI GPIO Set
	XGpio_SetDataDirection(&GpioInstance_ptr,1,0);

	// PS GPIO Initialization
	GpioConfigPtr = XGpioPs_LookupConfig (XPAR_PS7_GPIO_0_DEVICE_ID);

	if (GpioConfigPtr == NULL)
		return XST_FAILURE;

	xStatus = XGpioPs_CfgInitialize(&psGpioInstance_ptr, GpioConfigPtr, GpioConfigPtr->BaseAddr);

	if (XST_SUCCESS != xStatus)
		print("PS GPIO INIT FAILED \n\r");

	XGpioPs_SetDirectionPin(&psGpioInstance_ptr,BtnPinNumber,BtnPinDirection);

	XGpioPs_SetOutputEnablePin(&psGpioInstance_ptr,BtnPinNumber,0);

	while(1)
	{
		Readstatus = XGpioPs_ReadPin(&psGpioInstance_ptr,BtnPinNumber);
		if((Readstatus == 1) && (OldReadstatus == 0))
		{
			print("BTN PUSH Button pressed \n\r");

			count++;

			XGpio_DiscreteWrite(&GpioInstance_ptr,1,count);
		}
		OldReadstatus = Readstatus;
	}

	return 0;
}

전체 요약

Xilinx의 GPIO (General Purpose Input/Output) 드라이버를 사용하여 AXI GPIO와 PS GPIO를 초기화하고 제어하는 예제입니다.

  1. XGpioXGpioPs 타입의 두 개의 GPIO 인스턴스를 초기화합니다. 이들은 각각 AXI GPIO와 PS GPIO를 나타냅니다.

  2. XGpio_Initialize 함수를 사용하여 AXI GPIO를 초기화합니다. 초기화가 실패하면 에러 메시지를 출력합니다.

  3. XGpio_SetDataDirection 함수를 사용하여 AXI GPIO의 데이터 방향을 출력으로 설정합니다.

  4. XGpioPs_LookupConfig 함수를 사용하여 PS GPIO의 설정을 찾습니다. 설정을 찾지 못하면 함수는 실패를 반환합니다.

  5. XGpioPs_CfgInitialize 함수를 사용하여 PS GPIO를 초기화합니다. 초기화가 실패하면 에러 메시지를 출력합니다.

  6. XGpioPs_SetDirectionPinXGpioPs_SetOutputEnablePin 함수를 사용하여 특정 핀의 방향과 출력 가능 상태를 설정합니다.

  7. 무한 루프 내에서, XGpioPs_ReadPin 함수를 사용하여 특정 핀의 상태를 읽습니다. 이전 상태가 0이고 현재 상태가 1이면, 즉 버튼이 눌렸으면, "BTN PUSH Button pressed" 메시지를 출력하고 카운트를 증가시킵니다. 그리고 XGpio_DiscreteWrite 함수를 사용하여 AXI GPIO에 카운트 값을 씁니다.

이 코드는 FPGA 보드의 GPIO를 제어하여 버튼 입력을 감지하고, 해당 입력에 따라 GPIO의 출력을 변경하는 기능을 수행합니다.


헤더 파일

  • xgpio.h : GPIO PL (LED) 사용을 위한 header file; AXI GPIO 제어

변수 선언

  • u8 : unsigned 8-bit integer

  • XGpio GpioInstance_ptr: 이 변수는 AXI GPIO 인스턴스를 나타냅니다.
    XGpio_Initialize 함수를 통해 초기화되며, XGpio_SetDataDirectionXGpio_DiscreteWrite 함수에서 사용됩니다.


초기화

  1. XGpio_Initialize() 함수

Xilinx FPGA 보드의 AXI GPIO 인스턴스를 초기화하는 데 사용됩니다. 이 함수는 두 개의 매개변수를 받습니다.

  • XGpio *InstancePtr: 초기화할 GPIO 인스턴스에 대한 포인터입니다.
  • u16 DeviceId: 초기화할 GPIO 디바이스의 ID입니다.

이 함수는 성공적으로 GPIO 인스턴스를 초기화하면 XST_SUCCESS를 반환하고, 실패하면 에러 코드를 반환합니다. 이 함수를 호출한 후에는 GPIO 인스턴스를 사용하여 GPIO 핀의 방향을 설정하거나 핀의 상태를 읽고 쓸 수 있습니다.

  1. XGpio_SetDataDirection() 함수

Xilinx FPGA 보드의 AXI GPIO 인스턴스에서 특정 채널의 데이터 방향을 설정하는 데 사용됩니다. 이 함수는 세 개의 매개변수를 받습니다.

  • XGpio *InstancePtr: 데이터 방향을 설정할 GPIO 인스턴스에 대한 포인터입니다.

  • unsigned Channel: 데이터 방향을 설정할 채널 번호입니다. 대부분의 경우 1을 사용합니다.

  • u32 DirectionMask: 설정할 데이터 방향을 나타내는 비트 마스크입니다. 0은 출력, 1은 입력을 나타냅니다.

이 함수를 호출하면 지정된 채널의 GPIO 핀들의 데이터 방향이 설정됩니다. 예를 들어, XGpio_SetDataDirection(&GpioInstance_ptr, 1, 0)을 호출하면 GpioInstance_ptr 인스턴스의 첫 번째 채널의 모든 GPIO 핀들이 출력으로 설정됩니다.


AXI write

  1. XGpio_DiscreteWrite() 함수

Xilinx FPGA 보드의 AXI GPIO 인스턴스에서 특정 채널에 대해 이산 값(Discrete Value)을 쓰는 데 사용됩니다. 이 함수는 세 개의 매개변수를 받습니다.

  • XGpio *InstancePtr: 값을 쓸 GPIO 인스턴스에 대한 포인터입니다.

  • unsigned Channel: 값을 쓸 채널 번호입니다. 대부분의 경우 1을 사용합니다.

  • u32 Data: 쓸 값을 나타냅니다.

이 함수를 호출하면 지정된 채널의 GPIO 핀들에 값이 쓰여집니다. 예를 들어, XGpio_DiscreteWrite(&GpioInstance_ptr, 1, count)를 호출하면 GpioInstance_ptr 인스턴스의 첫 번째 채널의 모든 GPIO 핀들에 count 값이 쓰여집니다. 이 함수는 주로 GPIO 핀들을 통해 외부 장치에 신호를 보내는 데 사용됩니다.

profile
Myongji UNIV. B.S. in Electronic Engineering

0개의 댓글

관련 채용 정보