Spartan6에서 microblaze mcs를 움직이는 ③소프트웨어편

"Spartan6에서 microblaze mcs를 움직이는 ②SDK편 "까지의 단계를 수행하면 직렬 포트에서 hellow world를 말하는 템플릿이 생성됩니다.

hellow world를 말한 곳에서 아무것도 기쁘지 않기 때문에, 프로그램을 조금 변경해 보겠습니다.

프로그램 동작 사양


  • 먼저 시작 메시지를 발행합니다
  • 메인 루프는 아무것도하지 않습니다
  • UART 수신 인터럽트가 감지되면 인터럽트 핸들러로 날아갑니다
  • 인터럽트 핸들러에서 수신 한 문자 (누른 키)를 결정합니다.
  • 엔터 키를 누르면 8bit LED (GPO)를 증가시킵니다
  • 백 스페이스 키를 누르면 8bit LED (GPO)를 감소시킵니다
  • UART 수신 문자를 에코 백 (그대로 UART 송신에 돌려준다)

  • 이상의 동작을 만족시키는 C의 코드를 써 보겠습니다.

    C 소스



    main.c
    #include "platform.h"       //とりあえず必要
    #include "mb_interface.h"   //とりあえず必要
    #include "ADR_MAP.h"        //自前のヘッダファイル
    
    //ASCIIコードのバイナリ定義
        #define BS      0x08    //バックスペース
        #define CR      0x0D    //復帰
        #define LF      0x0A    //改行
        #define ESC     0x1B    //エスケープ
    
    //-----------------------------
    //グローバル変数
    //-----------------------------
        unsigned char g_led=0;
    
    //-------------------------------------------------------------------------------
    //割込みハンドラ
    //-------------------------------------------------------------------------------
    void Int_Handl(void) {
        unsigned char msg;
    
        //割り込みフラグ落とす
        IRQ_ACK = 0xFFFFFFFF;
    
        //受信文字を持ってくる
        msg=UART_RX;
    
        //エコーバック
        xil_printf("%c",msg);
    
        //受信文字に応じた処理
        switch(msg){
            case CR://エンター
                //LEDをインクリメント
                g_led++;
                GPO1=g_led;
                break;
            case BS://バックスペース
                //LEDをデクリメント
                g_led--;
                GPO1=g_led;
                break;
            default://
                //なにもしない
                break;
        }//switch
    }
    
    //============================================================
    //メインループ
    //============================================================
    void main()
    {
        //ハードの初期化
        init_platform();
    
        //割込みハンドラの登録
        microblaze_register_handler((XInterruptHandler)Int_Handl,(void*)0);
    
        //使用する割込み選択(bit[2]⇒UART割り込み)
        IRQ_ENABLE = 0x00000004;
    
        //割り込みを有効にする
        microblaze_enable_interrupts();
    
        xil_printf("*******************\r");
        xil_printf("Start!!!!!\r");
        xil_printf("*******************\r");
    
        //メインループ
        while(1){
    
        }
    
    }
    

    헤더 파일



    이번 사용하고 있는 레지스터는 UART_RXGPO1 뿐입니다.

    ADR_MAP.h
    #ifndef ADR_MAP_H_
    #define ADR_MAP_H_
    
        #define UART_RX         (*(volatile unsigned int *) 0x80000000)
        #define UART_TX         (*(volatile unsigned int *) 0x80000004)
        #define UART_STATUS     (*(volatile unsigned int *) 0x80000008)
    
        #define GPO1            (*(volatile unsigned int *) 0x80000010)
    //  #define GPO2            (*(volatile unsigned int *) 0x80000014)
    //  #define GPO3            (*(volatile unsigned int *) 0x80000018)
    //  #define GPO4            (*(volatile unsigned int *) 0x8000001C)
    
        #define GPI1            (*(volatile unsigned int *) 0x80000020)
    //  #define GPI2            (*(volatile unsigned int *) 0x80000024)
    //  #define GPI3            (*(volatile unsigned int *) 0x80000028)
    //  #define GPI4            (*(volatile unsigned int *) 0x8000002C)
    
        #define IRQ_STATUS      (*(volatile unsigned int *) 0x80000030)
        #define IRQ_ENABLE      (*(volatile unsigned int *) 0x80000038)
        #define IRQ_ACK         (*(volatile unsigned int *) 0x8000003C)
    
    //MicroBraze_mcs のIOバスは 0xC000_0000 が先頭アドレス
    
    #endif
    

    빌드



    SDK에서 ctrl+B를 누르면 프로그램이 빌드됩니다.Debug 폴더에 elf 파일이 생성됩니다.

    프로그램 쓰기 시 주의사항



    드디어 프로그램을 씁니다.

    이번 사용하고 있는 Spartan6 ATLYS 보드 은, FPGA의 기입 데이터(bit 파일)를 impact로 기입할 때에 "PROG"라고 표기되어 있는 USB 커넥터로부터 기입할 수 있습니다.
    그러나 SDK에서 프로그램을 업로드하면 오류가 발생합니다. (내 환경에서는)

    Xilinx의 FPGA 라이터(Platform Cable USB Ⅱ)를 사용하고 있는 경우는 문제없이 쓸 수 있습니다.

    프로그램 쓰기


    Program FPGA 버튼을 누릅니다.




    품목
    지정할 데이터


    Bitstream
    ISE에서 생성된 비트 파일을 지정합니다.

    BMM 파일
    SDK의 작업 디렉토리 내에 작성한 하드웨어 프로젝트 디렉토리에 있는 것(LOC 정보를 추가한 것)을 지정합니다.

    ELF 파일
    SDK에서 빌드 완료 후 생성된 elf 파일을 지정합니다.


    그리고 "Program"버튼을 누르면 회로 데이터(bit 파일)와 소프트웨어(elf 파일)를 합성한 데이터가 FPGA로 전송되고,
    프로그램이 실행됩니다.



    동작 확인



    Tera Term을 사용하여 직렬 포트를 시작합니다.
    ATLYS 보드에서는 "UART"라고 적혀있는 J17 커넥터에 micro USB를 연결하여 COM 포트로 인식합니다.

    TeraTerm에서 엔터나 백 스페이스를 누르면 무사히 LED 점등 위치가 응답하고 있었습니다.

    좋은 웹페이지 즐겨찾기