FC2カウンター FPGAの部屋 2023年03月05日
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

MicroBlaze で axi timer の割り込みを使用する

ZYBO Z7-20 で MicroBlaze プロセッサを使用した axi timer の割り込みを試してみたので、ブログに書いておく。

Vivado 2022.2 で ZYBO Z7-20 用の axi_timer_test プロジェクトを作成した。
axi_timer_test_2_230305.png

小林さんの”FPGAプログラミング大全 Xilinx編 第2版”を参考にして、MicroBlaze の設定をした。
最初、microblaze_0_local_memory を実装できずに悩んでいたのだが、”FPGAプログラミング大全 Xilinx編 第2版”を見て、MicroBlaze を Add IP してから、Run Block Automation をクリックすると MicroBlaze 周辺一式が実装される。
今回は、Run Block Automation ダイアログの Interrupt Controller にもチェックを入れて AXI Interrupt Contoller も実装した。
axi_timer_test_1_230305.png

axi timer を実装した。axi_timer_0 の設定を示す。
axi_timer_test_7_230305.png

axi gpio を実装した。設定を示す。
GPIO は Make External で leds_4bits に接続してある。
axi_timer_test_8_230305.png

timer_bd プロック・デザイン全体を示す。
axi_timer_test_3_230305.png

Address Editor 画面を示す。
axi_timer_test_4_230305.png

Vitis でアプリケーション・ソフトウェアを作成して、ビルドしてからになるが、microblaze_0 で実装するアプリケーション・ソフトウェアをロードする様に設定した。
Vivado の Tools メニューから Associate ELF File... を選択して、microblaze_0 に ELF ファイルを指定した。
axi_timer_test_9_230305.png

これで、論理合成、インプリメンテーション、ビットストリームの生成を行った。
Project Summary を示す。
axi_timer_test_5_230305.png

Vivado の Tools メニューから Launch Vitis IDE を選択して、Vitis 2022.2 を起動した。
axi_timer_test アプリケーション・プロジェクトを作成した。
timer_bd_wrapper プラットホームも一緒に生成された。
アプリケーション・ソフトウェアの axi_timer_test.c を書いた。
axi_timer_test.c を書く際には、”MicroBlazeのタイマー割り込みを使う”のコードを大幅に引用させていただいた。
また、GPIO のコードは、”Xilinx AXI GPIO の使い方”を参考にさせていただいた。
axi_timer_test.c を貼っておく。

// axi_timer_test.c
// 2023/03/02 by marsee
// ”MicroBlazeのタイマー割り込みを使う” https://e-trees.jp/wp/?p=316 からコードを引用
// gpio関連のコードを”Xilinx AXI GPIO の使い方” https://qiita.com/s_nkg/items/800e0559332495605056 から引用

#include <stdio.h>

#include "xtmrctr.h"
#include "xintc.h"
#include "xparameters.h"
#include "xbasic_types.h"
#include "xgpio.h"

void timer_int_handler();

XTmrCtr tmr;
XIntc intc;
XGpio gpio_0;
u32 gpio_status=0;

void timer_int_handler()
{
    volatile unsigned int csr;
    csr = XTmrCtr_GetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0);
    if(gpio_status == 0)
        gpio_status = 0xf;
    else
        gpio_status = 0;
    XGpio_DiscreteWrite(&gpio_0, 1, gpio_status);
    XTmrCtr_SetControlStatusReg(XPAR_AXI_TIMER_0_BASEADDR, 0, csr);
}

int main()
{
    XIntc_Initialize(&intc, XPAR_INTC_0_DEVICE_ID);
    XTmrCtr_Initialize(&tmr, XPAR_AXI_TIMER_0_DEVICE_ID);
    XGpio_Initialize(&gpio_0, XPAR_GPIO_0_DEVICE_ID);

    XIntc_Connect(&intc, XPAR_INTC_0_TMRCTR_0_VEC_ID, (XInterruptHandler)XTmrCtr_InterruptHandler, (void*)&tmr);
    XIntc_Start(&intc, XIN_REAL_MODE);
    XIntc_Enable(&intc, XPAR_INTC_0_TMRCTR_0_VEC_ID);

    XTmrCtr_SetHandler(&tmr, (void*)timer_int_handler, (void*)0);

    microblaze_enable_interrupts();

    // see LogiCORE IP AXI Timer Product Guide, PG079
    XTmrCtr_SetOptions(&tmr, 0, XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION | XTC_DOWN_COUNT_OPTION);
    XTmrCtr_SetResetValue(&tmr, 0, 50000000);
    XTmrCtr_Start(&tmr, 0);

    for(;;){}

    return 0;
}


Vitis 画面を貼っておく。
axi_timer_test_6_230305.png

これで Run したところ、ZYBO Z7-20 の 4 個の LED が 0.5 秒ごとに値を反転して、点滅した。成功だ。
  1. 2023年03月05日 05:18 |
  2. FPGAを使用したシステム
  3. | トラックバック:0
  4. | コメント:0