Verilog_RTL 설계/SoC

[MicroBlaze] Button_control

juniha 2025. 7. 28. 20:22

목적

  • MicroBlaze에서 외부 4비트 버튼 입력을 AXI GPIO로 읽고, UART를 통해 실시간으로 출력

Diagram

사용 코드

#include <stdio.h>             // 표준 입출력 함수
#include "platform.h"          // 플랫폼 초기화 및 종료 함수
#include "xil_printf.h"        // UART 출력용 함수 (xil_printf)
#include "xparameters.h"       // 하드웨어 주소 및 파라미터 정의
#include "xgpio.h"             // AXI GPIO 제어용 헤더
#include "sleep.h"             // sleep 함수 (초 단위)

#define BTN_ADDR XPAR_XGPIO_0_BASEADDR   // AXI GPIO의 기본 주소
#define BTN_CHANNEL 1                    // 버튼이 연결된 채널 번호 (채널 1)

int main()
{
    init_platform(); // 플랫폼 초기화 (UART, 캐시, 인터럽트 등)

    print("Hello World\n\r");
    print("Successfully ran Hello World application\n\r");

    XGpio_Config *cfg_ptr;  // GPIO 설정 구조체 포인터
    XGpio btn_device;       // 버튼용 GPIO 인스턴스
    u16 data = 0;           // 버튼 입력값 저장 변수 (최대 16비트)

    // GPIO 디바이스 설정 정보를 가져옴
    cfg_ptr = XGpio_LookupConfig(BTN_ADDR);

    // GPIO 디바이스 초기화
    XGpio_CfgInitialize(&btn_device, cfg_ptr, cfg_ptr->BaseAddress);

    // 채널 1을 입력으로 설정 (0: 출력, 1: 입력 → 0b1111 = 4비트 모두 입력)
    XGpio_SetDataDirection(&btn_device, BTN_CHANNEL, 0b1111);

    while(1){
        // 버튼 상태 읽기 (AXI GPIO에서 4비트 입력 읽음)
        data = XGpio_DiscreteRead(&btn_device, BTN_CHANNEL);

        // UART로 버튼 값 출력 (터미널에서 확인 가능)
        xil_printf("Button : %d\n\r", data);

        // 1초 대기 (버튼 polling 주기)
        sleep(1);
    }

    cleanup_platform(); // 플랫폼 정리 (실제로는 도달하지 않음)
    return 0;
}

동작 영상

결과

버튼비트 위치바이너리 값UART 출력 (%d)

btn[0] bit 0 0001 1
btn[1] bit 1 0010 2
btn[2] bit 2 0100 4
btn[3] bit 3 1000 8

누른 버튼 조합바이너리출력 값

btn[0] + btn[1] 0011 3
btn[2] + btn[3] 1100 12
btn[0] + btn[2] 0101 5
btn[1] + btn[3] 1010 10
모두 누름 1111 15

 

  • XGpio_DiscreteRead()는 각 버튼의 상태를 비트별로 읽어 정수로 반환되는 것을 확인 할 수 있다,
  • 각 버튼은 2의 제곱수 단위 값(1, 2, 4, 8)을 가지고. 따라서 단일 버튼을 눌렀을 때 출력되는 값은 해당 버튼의 비트 위치에 따라 결정되는 것을 확인 할 수 있다.

'Verilog_RTL 설계 > SoC' 카테고리의 다른 글

[Project]Smart Mobility platform  (4) 2025.08.27
[Smart Mobility platform] Implemented Code  (4) 2025.08.07
[MicroBlaze] DHT11_iic  (3) 2025.07.29
[MicroBlaze] fnd_control  (1) 2025.07.28
[MicroBlaze] Switch_Led  (2) 2025.07.25