HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2022/07/01

Xilinxの FPGA Spartan-6で MicroBlazeを ISE WebPack 14.7で無料ライセンスで動かす方法 Xilinxの FPGA Spartan-6で MicroBlazeを ISE WebPack 14.7で無料ライセンスで動かす方法

(How to MicroBlaze in Spartan-6 with ISE WebPack 14.7 only Free License to Blink LED !)

Tags: [FPGA], [電子工作], [Xilinx XC6SLX9], [FPGA 2022]




● Xilinxの FPGA Spartan-6で MicroBlazeを ISE WebPackで無料ライセンスで動かせた!

 How to MicroBlaze in Spartan-6 with ISE WebPack Free License only to Blink LED !

MicroBlaze ソフト プロセッサ

MicroBlaze Processor Reference Guide
 UG984 (v2021.2) October 27, 2021

LogiCORE IP MicroBlaze Micro Controller System (v1.0)
 DS865 January 18, 2012

LogiCORE IP MicroBlaze Micro Controller System v1.3
 Product Guide PG048 December 18, 2012

 無料の ISE WebPack環境で動かせる?!

 ISE WebPackでは MicroBlazeの IP coreの作成はできるけど、MicroBlaze SDK環境は使えないらしい。有料版の ISEが必要ってこと?

ISE Design Suite

 この表を見ると ISE WebPACKでも MicroBlaze ソフト プロセッサにチェックが付いているが。

 ちなみに ISEの後継の開発ツール(統合環境)の Vivadoは無料版でも MicroBlaze SDK環境が使えるらしい。
 ただし、Vivadoは Spartan-7以降に対応で、Spartan-6の開発には対応していない。

Vivado Design Suite



● Xilinxの FPGA Spartan-6で MicroBlazeを ISE WebPackで無料ライセンスで動かせた!

 結論:ISE WebPack 14.7でも MicroBlazeを Spartan-6で無料ライセンスの範疇で動かせた!

 下記の環境で MicroBlazeをビルドして FPGAの実機で動かせました!

・How to MicroBlaze in Spartan-6 with ISE WebPack Free License only to Blink LED !
How to MicroBlaze in Spartan-6 with ISE WebPack Free License only to Blink LED !


How to MicroBlaze in Spartan-6 with ISE WebPack Free License only to Blink LED !


How to MicroBlaze in Spartan-6 with ISE WebPack Free License only to Blink LED !


How to MicroBlaze in Spartan-6 with ISE WebPack Free License only to Blink LED !




● MicroBlaze用のプログラム(アセンブラ、C言語)のビルド方法

C:\Xilinx\14.7\ISE_DS\EDK\sw\lib\sw_apps\memory_test\src
platform.h
platform_config.h

C:\Xilinx\14.7\ISE_DS\EDK\sw\lib\bsp\standalone_v3_11_a\src\microblaze
xil_printf.h

C:\Xilinx\14.7\ISE_DS\EDK\gnu\microblaze\linux_toolchain\nt_le\bin
microblazeel-xilinx-linux-gnu-gcc

C:\Xilinx\14.7\ISE_DS\EDK\gnu\microblaze\nt\microblaze-xilinx-elf
C:\Xilinx\14.7\ISE_DS\EDK\gnu\microblaze\nt\microblaze-xilinx-elf\lib
libxil.a

● hello_main.c
int main()
{
    return 0;
}

mb-gcc ^
  -L C:\Xilinx\14.7\ISE_DS\EDK\gnu\microblaze\nt\microblaze-xilinx-elf\lib ^
  -I C:\Xilinx\14.7\ISE_DS\EDK\gnu\microblaze\nt\microblaze-xilinx-elf\include ^
  hello_main.c ^
  -o hello_main.elf

● hello_start.c
void _start()
{
}

mb-gcc ^
  -nostdlib ^
  hello_start.c ^
  -o hello_start.elf

● MicroBlaze用のバイナリファイル .elfファイル?を FPGAに埋め込む方法
● .elfファイルを .bitファイルに埋め込む方法

 Data2memコマンドを使う。

 tagは Hoge_MicroBlaze.bmmファイルの ADDRESS_MAPの後の文字列か、ADDRESS_SPACEの後の文字列。
 例の場合は Hoge_MicroBlazeか lmb_bram
ADDRESS_MAP Hoge_MicroBlaze MICROBLAZE-LE 100
  ADDRESS_SPACE lmb_bram COMBINED [0x00000000:0x00003fff]
    ADDRESS_RANGE RAMB16
      BUS_BLOCK
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[0].RAMB16_S4_1 [31:28] INPUT = MicroBlaze.lmb_bram_0.mem;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[1].RAMB16_S4_1 [27:24] INPUT = MicroBlaze.lmb_bram_1.mem;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[2].RAMB16_S4_1 [23:20] INPUT = MicroBlaze.lmb_bram_2.mem;

INPUT = MicroBlaze.lmb_bram_0.mem;
 を
LOC = X1Y0;
 の様に書き換える。
      BUS_BLOCK
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[0].RAMB16_S4_1 [31:28] LOC = X1Y0;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[1].RAMB16_S4_1 [27:24] LOC = X1Y2;
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[2].RAMB16_S4_1 [23:20] LOC = X1Y4;
data2mem ^
  -bd hoge.elf tag MicroBlaze ^
  -bm hoge.bmm ^
  -bt hoge.bit ^
  -o b hoge_elf.bit

hoge_elf.bit
 ができる。

data2mem ^
  -bd .\src\hello_start.elf ^
  -bm .\ipcore_dir\MicroBlaze.bmm ^
  -o uvh output

output.ucf
output.v
output.vhd
 ができる。

> data2mem
Release 14.6 - Data2MEM P.20131013, build 3.0.10 Apr 3, 2013
Copyright (c) 1995-2022 Xilinx, Inc.  All rights reserved.

ERROR:Data2MEM:47 - Not all BitLanes in ADDRESS_SPACE 'MicroBlaze.lmb_bram' have BMM location constraints.
    Some data for this ADDRESS_SPACE may be lost during BIT file
    replacement. Verify that the BMM file has location constraints
    for all BitLanes.

      Bitlane(s)
   ----------------
   mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[6].RAMB16_S4_1 [7:4]
   mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[7].RAMB16_S4_1 [3:0]
   mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[4].RAMB16_S4_1 [15:12]
   mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[5].RAMB16_S4_1 [11:8]
   mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[2].RAMB16_S4_1 [23:20]
   mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[3].RAMB16_S4_1 [19:16]
   mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[0].RAMB16_S4_1 [31:28]
   mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[1].RAMB16_S4_1 [27:24]
ERROR:Data2MEM:80 - ADDRESS_SPACE or ADDRESS_MAP tag name 'hoge' was not found.
    Some data may have not been translated.
ERROR:Data2MEM:6 - Illegal token 'RAMB16_X1Y0', 'numeric BRAM LOC value' expected.
   Line #5, File ".\ipcore_dir\MicroBlaze.bmm".
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[0].RAMB16_S4_1 [31:28] LOC = RAMB16_X1Y0;
                                                                                         ^
ERROR:Data2MEM:11 - Unexpected symbol 'AAAAAAA', 'R or X' expected.
   Line #5, File ".\ipcore_dir\MicroBlaze.bmm".
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[0].RAMB16_S4_1 [31:28] LOC = AAAAAAA;
                                                                                         ^
ERROR:Data2MEM:35 - Duplicate instance name usage in address space 'MicroBlaze.lmb_bram'.
   Line #16, File ".\ipcore_dir\MicroBlaze.bmm".
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[0].RAMB16_S4_1 [31:28] INPUT = MicroBlaze.lmb_bram_0.mem;
                                                                           ^
NG: LOC = X1Y0 | INPUT = MicroBlaze.lmb_bram_0.mem;

ERROR:Data2MEM:15 - Missing statement terminator. '|' found, ';' expected.
   Line #5, File ".\ipcore_dir\MicroBlaze.bmm".
        mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[0].RAMB16_S4_1 [31:28] LOC = X1Y0 | INPUT = MicroBlaze.lmb_bram_0.mem;



Data2MEM ユーザー ガイド UG658 (v12.1) 2010 年 4 月 19 日

Generating BMM files
 Data2mem is replaced by updatemem in later versions of the tools.

Data2mem

UpdateMEM

・ブロック RAM メモリ マップ (BMM) ファイル
・Executable and Linkable Format (ELF) ファイル

● ISE WebPack上で IP (CORE Generator & Architecture Wizard)で MicroBlaze MCS 1.4を選択して追加する

● MicroBlaze.veo 自動生成されるファイル
 インスタンス化する時にコピペする。
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
MicroBlaze your_instance_name (
  .Clk(Clk), // input Clk
  .Reset(Reset), // input Reset
  .IO_Addr_Strobe(IO_Addr_Strobe), // output IO_Addr_Strobe
  .IO_Read_Strobe(IO_Read_Strobe), // output IO_Read_Strobe
  .IO_Write_Strobe(IO_Write_Strobe), // output IO_Write_Strobe
  .IO_Address(IO_Address), // output [31 : 0] IO_Address
  .IO_Byte_Enable(IO_Byte_Enable), // output [3 : 0] IO_Byte_Enable
  .IO_Write_Data(IO_Write_Data), // output [31 : 0] IO_Write_Data
  .IO_Read_Data(IO_Read_Data), // input [31 : 0] IO_Read_Data
  .IO_Ready(IO_Ready), // input IO_Ready
  .UART_Rx(UART_Rx), // input UART_Rx
  .UART_Tx(UART_Tx), // output UART_Tx
  .FIT1_Toggle(FIT1_Toggle), // output FIT1_Toggle
  .PIT1_Toggle(PIT1_Toggle), // output PIT1_Toggle
  .GPO1(GPO1), // output [31 : 0] GPO1
  .GPI1(GPI1), // input [31 : 0] GPI1
  .GPI1_Interrupt(GPI1_Interrupt), // output GPI1_Interrupt
  .INTC_Interrupt(INTC_Interrupt), // input [0 : 0] INTC_Interrupt
  .INTC_IRQ(INTC_IRQ) // output INTC_IRQ
);
// INST_TAG_END ------ End INSTANTIATION Template ---------

● top.v
 とりあえず、上記の内容をコピペして MicroBlazeを取り込む。
MicroBlaze mcs_0 (
  .Clk(Clk), // input Clk
  .Reset(Reset), // input Reset
  .IO_Addr_Strobe(IO_Addr_Strobe), // output IO_Addr_Strobe
  .IO_Read_Strobe(IO_Read_Strobe), // output IO_Read_Strobe
  .IO_Write_Strobe(IO_Write_Strobe), // output IO_Write_Strobe
  .IO_Address(IO_Address), // output [31 : 0] IO_Address
  .IO_Byte_Enable(IO_Byte_Enable), // output [3 : 0] IO_Byte_Enable
  .IO_Write_Data(IO_Write_Data), // output [31 : 0] IO_Write_Data
  .IO_Read_Data(IO_Read_Data), // input [31 : 0] IO_Read_Data
  .IO_Ready(IO_Ready), // input IO_Ready
  .UART_Rx(UART_Rx), // input UART_Rx
  .UART_Tx(UART_Tx), // output UART_Tx
  .FIT1_Toggle(FIT1_Toggle), // output FIT1_Toggle
  .PIT1_Toggle(PIT1_Toggle), // output PIT1_Toggle
  .GPO1(GPO1), // output [31 : 0] GPO1
  .GPI1(GPI1), // input [31 : 0] GPI1
  .GPI1_Interrupt(GPI1_Interrupt), // output GPI1_Interrupt
  .INTC_Interrupt(INTC_Interrupt), // input [0 : 0] INTC_Interrupt
  .INTC_IRQ(INTC_IRQ) // output INTC_IRQ
);

● MicroBlaze.v 自動生成されるファイル
  wire \NLW_U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[7].RAMB16_S4_1_REGCEA_UNCONNECTED ;
  wire \NLW_U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[7].RAMB16_S4_1_REGCEB_UNCONNECTED ;
  wire \NLW_U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[7].RAMB16_S4_1_DIPA<3>_UNCONNECTED ;
  wire \NLW_U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[7].RAMB16_S4_1_DIPA<2>_UNCONNECTED ;
  wire \NLW_U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[7].RAMB16_S4_1_DIPA<1>_UNCONNECTED ;
  wire \NLW_U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[7].RAMB16_S4_1_DIPA<0>_UNCONNECTED ;
  wire \NLW_U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[7].RAMB16_S4_1_DOA<31>_UNCONNECTED ;
  wire \NLW_U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[7].RAMB16_S4_1_DOA<30>_UNCONNECTED ;

● top.ucf
 MicroBlazeのメモリの位置を固定する為に .ucfファイルで指定する。
 理由は bitファイルに MicroBlazeのプログラムを埋め込む時に埋め込む場所を知る為。
 (結論としてこの作業は不要でした)
INST "mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[0].RAMB16_S4_1" LOC = RAMB16_X1Y0;
INST "mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[1].RAMB16_S4_1" LOC = RAMB16_X1Y2;
INST "mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[2].RAMB16_S4_1" LOC = RAMB16_X1Y4;
INST "mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[3].RAMB16_S4_1" LOC = RAMB16_X1Y6;
INST "mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[4].RAMB16_S4_1" LOC = RAMB16_X1Y8;
INST "mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[5].RAMB16_S4_1" LOC = RAMB16_X1Y10;
INST "mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[6].RAMB16_S4_1" LOC = RAMB16_X1Y12;
INST "mcs_0/U0/lmb_bram_I/RAM_Inst/Using_B16_S4.The_BRAMs[7].RAMB16_S4_1" LOC = RAMB16_X1Y14;

MicroBlaze.bmm

 Xilinx Pratform Studio XPSで Hardware -> Generate Netlistをすると ERROR:EDK - INFO:Security:71のライセンスが無いエラーになります。

ERROR:EDK - INFO:Security:71 - If a license for part 'xc6slx16' is available, it
   will be possible to use 'XPS_TDP' instead of 'XPS'.
   INFO:Security:61 - The XILINXD_LICENSE_FILE environment variable is not set.
   INFO:Security:63 - The LM_LICENSE_FILE environment variable is not set.
   INFO:Security:68 - For more information or for assistance in obtaining
   ERROR:Security:12 - No 'xc6slx16' feature version 2013.10 was available (-5),
ERROR:EDK:440 - platgen failed with errors!

 Xilinx Pratform Studio XPSで Project -> Export Hardware Design to SDKは成功するみたい?
 しかし、ISE上で Generate Top HDL Sourceを行なうと上記と同じライセンスエラーが出ました。

● source ./ipcore_dir/microblaze_mcs_setup.tcl

Tcl Console
Command>source ./ipcore_dir/microblaze_mcs_setup.tcl

microblaze_mcs_setup: Found 1 MicroBlaze MCS core.
microblaze_mcs_setup: Added "-bm" option for "MicroBlaze.bmm" to ngdbuild command line options.
microblaze_mcs_setup: Done.

● MicroBlaze用のバイナリファイル .elfファイルを FPGAの .bitファイルに埋め込む方法
microblaze_mcs_data2mem C:/.Xilinx/workspace/hogehoge_app/Debug/hogehoge_app.elf

Command>microblaze_mcs_data2mem C:/.Xilinx/workspace/hogehoge_app/Debug/hogehoge_app.elf
microblaze_mcs_data2mem: Found 1 MicroBlaze MCS core.
microblaze_mcs_data2mem: Using "hogehoge_app.elf" for MicroBlaze
microblaze_mcs_data2mem: Existing bitgen "-bd" options unchanged.
microblaze_mcs_data2mem: Running "data2mem" to create simulation files.
microblaze_mcs_data2mem: Running "data2mem" to update bitstream with software.
microblaze_mcs_data2mem: Done.
正常に .bitファイルを更新した

Command>microblaze_mcs_data2mem C:/.Xilinx/workspace/hogehoge_app/Debug/hogehoge_app.elf
microblaze_mcs_data2mem: Found 1 MicroBlaze MCS core.
microblaze_mcs_data2mem: Using "hogehoge_app.elf" for MicroBlaze
microblaze_mcs_data2mem: Existing bitgen "-bd" options unchanged.
microblaze_mcs_data2mem: Running "data2mem" to create simulation files.

ERROR:Data2MEM:31 - Out of bounds code segment for ram space in '.\ipcore_dir\MicroBlaze.bmm'.
    Memory space 'MicroBlaze.lmb_bram' occupies [0x00000000:0x00001FFF]
    Code segment #1 occupies [0x00000050:0x00002499]

child process exited abnormally
MicroBlaze側のメモリ不足

Command>microblaze_mcs_data2mem C:/.Xilinx/workspace/hogehoge_app/Debug/hogehoge_app.elf
microblaze_mcs_data2mem: Found 1 MicroBlaze MCS core.
microblaze_mcs_data2mem: Using "hogehoge_app.elf" for MicroBlaze
microblaze_mcs_data2mem: Existing bitgen "-bd" options unchanged.
microblaze_mcs_data2mem: Running "data2mem" to create simulation files.
microblaze_mcs_data2mem: The file "MicroBlaze_bd.bmm" does not exist. Not running "data2mem" to update bitstream.
microblaze_mcs_data2mem: Done.
 .bmmファイルが無いので ISE上で Implement Designを実行する

● Xilinx SDKで FPGAに書き込みができた!!

 Xilinx SDKで
 Hardwareを新規作成して
 MicroBlazeを割り当てて
 BSPを新規作成して
 APPを新規作成して
 Xilinx SDK上で C言語のプログラムをビルドして
 FPGAに bitストリームを書き込みができた!!

 GPOの出力でLチカがでけたー!ばんじゃーい!
 GPIの入力でボタン入力がでけたー!ばんじゃーい!
 UARTでシリアル通信がでけたー!ばんじゃーい!

 結論:ISE WebPackでも Spartan-6で MicroBlazeを無料ライセンスの範疇で動かせた!

 tcl等のコマンド操作は不要でした。

 動かないと思って1時間くらい悩んだでいたら、実は Clkを .ucfで配線するのを忘れていた!

 // 不要 #include <stdio.h>
#include "platform.h"
#include "xiomodule.h"

void print(char *str);

int main()
{
    init_platform();

    XIOModule xio;
    XIOModule_Initialize(&xio, XPAR_IOMODULE_0_DEVICE_ID);

    // XIOModule_Startをしなくても動いた
    XIOModule_Start(&xio);

    while (1) {
        // printで UARTに出力する
        print("Hello World\n\r");

    // XIOModule_DiscreteWriteで GPOに出力する、1が GPO1を意味する
        XIOModule_DiscreteWrite(&xio, 1, 0xAAAAAAAA);
        XIOModule_DiscreteWrite(&xio, 1, 0x55555555);

// ビット操作の場合
void XIOModule_DiscreteSet(XIOModule *InstancePtr, unsigned Channel, u32 Mask);
void XIOModule_DiscreteClear(XIOModule *InstancePtr,
     unsigned Channel,
     u32 Mask);

    // XIOModule_DiscreteReadで GPIの入力になる、1が GPI1を意味する
        u32 data = XIOModule_DiscreteRead(&xio, 1);
    }

    // XIOModule_Startに対応
    XIOModule_Stop(&xio);

    cleanup_platform();
}

Microblaze MCS Hello World

●同様に UARTのシリアル受信
    XIOModule_Uart_Stats uart_stats;
    XIOModule_GetStats(&xio, &uart_stats);
    if (uart_stats.CharactersReceived > 0) {
        // CharactersReceivedは累積の値
    }

    u8 rx_buf[2];
    if (XIOModule_Recv(&xio, rx_buf, 1) > 0) {
        rx_buf[1] = '\0';
        print((char*)rx_buf);
    }

●割込み

 FIT1の割込み
 こんな感じと思うのですが MyHandlerが呼ばれません。

 原因: CORE Generatorで Generate Interruptをオンにしていなかった!!
原因: CORE Generatorで Generate Interruptをオンにしていなかった!!
volatile u32 data = 0;

void MyHandler(void* InstancePtr) {
    XIOModule* Interr = (XIOModule*)InstancePtr;
    data++;

    // XIOModule_Acknowledgeが有ると止まる(原因不明)
    // XIOModule_Acknowledge(Interr, XIN_IOMODULE_FIT_1_INTERRUPT_INTR);

    // XIOModule_Acknowledge(Interr, 0); でも止まる
    // こうするのが正解ですかね?知らんけど
    // XIOModule_Connect(&xio, XIN_IOMODULE_FIT_1_INTERRUPT_INTR, MyHandler, &xio);

}

int main()
{
    init_platform();

    microblaze_enable_icache();
    microblaze_enable_dcache();

    XIOModule_Initialize(&xio, XPAR_IOMODULE_0_DEVICE_ID);

    microblaze_register_handler(XIOModule_DeviceInterruptHandler, XPAR_IOMODULE_0_DEVICE_ID);

    XIOModule_Start(&xio);

    // FIT
    XIOModule_Connect(&xio, XIN_IOMODULE_FIT_1_INTERRUPT_INTR, MyHandler, NULL);
    XIOModule_Enable(&xio, XIN_IOMODULE_FIT_1_INTERRUPT_INTR);

    microblaze_enable_interrupts();

    while(1) {}
}

C:\Xilinx\14.7\ISE_DS\EDK\data\xmd\flashwriter\xilflash_src\xbasic_types.h
/**
 * This data type defines an interrupt handler for a device.
 * The argument points to the instance of the component
 */
typedef void (*XInterruptHandler) (void *InstancePtr);

int XIOModule_Connect(XIOModule * InstancePtr, u8 Id,
                      XInterruptHandler Handler, void *CallBackRef);
void XIOModule_Disconnect(XIOModule * InstancePtr, u8 Id);

C:/Xilinx/14.7/ISE_DS/EDK/sw/XilinxProcessorIPLib/drivers/iomodule_v1_04_a/doc/html/api/xiomodule_8c.html

C:\Xilinx\14.7\ISE_DS\EDK\sw\XilinxProcessorIPLib\drivers\iomodule_v1_04_a\examples
xiomodule_example.c
xiomodule_intr_example.c
xiomodule_low_level_example.c
xiomodule_selftest_example.c

void DeviceDriverHandler(void *CallbackRef)
{
    // HOGEHOGE
}

    XStatus Status;
    Status = XIOModule_Connect(XIOModuleInstancePtr, IOMODULE_DEVICE_ID,
                               (XInterruptHandler) DeviceDriverHandler,
                               (void *)0);
    if (Status != XST_SUCCESS)
    {
        return XST_FAILURE;
    }

●同様に UARTのシリアル受信の割込み
void MyHandler2(void* InstancePtr) {
    XIOModule* Interr = (XIOModule*)InstancePtr;
    data++;

    // XIOModule_Acknowledgeが有ると止まる(原因不明)
    // XIOModule_Acknowledge(Interr, XIN_IOMODULE_UART_RX_INTERRUPT_INTR);
}

    XIOModule_Start(&xio);

    // UART
    XIOModule_Connect(&xio, XIN_IOMODULE_UART_RX_INTERRUPT_INTR, MyHandler2, NULL);
    XIOModule_Enable(&xio, XIN_IOMODULE_UART_RX_INTERRUPT_INTR);

    microblaze_enable_interrupts();

C:\Xilinx\14.7\ISE_DS\EDK\sw\XilinxProcessorIPLib\drivers\iomodule_v1_04_a\src\xiomodule.h
/**
 * Statistics for the UART
 */
typedef struct {
	u32 TransmitInterrupts;	   /**< Number of transmit interrupts    */
	u32 ReceiveInterrupts;	   /**< Number of receive interrupts     */
	u32 CharactersTransmitted; /**< Number of characters transmitted */
	u32 CharactersReceived;	   /**< Number of characters received    */
	u32 ReceiveOverrunErrors;  /**< Number of receive overruns       */
	u32 ReceiveParityErrors;   /**< Number of receive parity errors  */
	u32 ReceiveFramingErrors;  /**< Number of receive framing errors */
} XIOModule_Uart_Stats;

/*
 * Required functions, in file xiomodule_uart.c
 */
int XIOModule_CfgInitialize(XIOModule *InstancePtr,
                            XIOModule_Config *Config,
                            u32 EffectiveAddr);

void XIOModule_ResetFifos(XIOModule *InstancePtr); /* Dummy */
 This function does nothing, since the UART doesn't have any FIFOs. It is included for compatibility with the UART Lite driver.
 MicroBlaze標準の UARTには FIFOが有りません。
 (AXIバスに接続する UART Liteには FIFO機能が有る)
AXI UART Lite


unsigned int XIOModule_Send(XIOModule *InstancePtr, u8 *DataBufferPtr,
                            unsigned int NumBytes);
unsigned int XIOModule_Recv(XIOModule *InstancePtr, u8 *DataBufferPtr,
                            unsigned int NumBytes);

int XIOModule_IsSending(XIOModule *InstancePtr);

int XIOModule_SetBaudRate(XIOModule *InstancePtr, u32 BaudRate);

/*
 * Functions for statistics, in file xiomodule_stats.c
 */
void XIOModule_GetStats(XIOModule *InstancePtr,
                        XIOModule_Uart_Stats *StatsPtr);
void XIOModule_ClearStats(XIOModule *InstancePtr);

C:/Xilinx/14.7/ISE_DS/EDK/sw/XilinxProcessorIPLib/drivers/iomodule_v1_04_a/doc/html/api/xiomodule__uart__intr_8c.html
xiomodule_uart_intr.c File Reference

● Functions
unsigned int 	XIOModule_SendBuffer (XIOModule *InstancePtr)
unsigned int 	XIOModule_ReceiveBuffer (XIOModule *InstancePtr)
void 	XIOModule_SetRecvHandler (XIOModule *InstancePtr, XIOModule_Handler FuncPtr, void *CallBackRef)
void 	XIOModule_SetSendHandler (XIOModule *InstancePtr, XIOModule_Handler FuncPtr, void *CallBackRef)
void 	XIOModule_Uart_InterruptHandler (XIOModule *InstancePtr)
void 	XIOModule_Uart_DisableInterrupt (XIOModule *InstancePtr)
void 	XIOModule_Uart_EnableInterrupt (XIOModule *InstancePtr)

● MicroBlazeの PIT Programmable Interval Timer

    // PIT Interrupt
    XIOModule_Connect(&xio, XIN_IOMODULE_PIT_1_INTERRUPT_INTR, MyHandler, NULL);
    XIOModule_Enable(&xio, XIN_IOMODULE_PIT_1_INTERRUPT_INTR);

    // PIT Setting
    XIOModule_SetResetValue(&xio, 0, 5000000);
    XIOModule_Timer_SetOptions(&xio, 0, XTC_AUTO_RELOAD_OPTION);
    XIOModule_Timer_Start(&xio, 0);

●引数の u8 TimerNumberと PITの関係
TimerNumber = 0 = XIN_IOMODULE_PIT_1_INTERRUPT_INTR
TimerNumber = 1 = XIN_IOMODULE_PIT_2_INTERRUPT_INTR
TimerNumber = 2 = XIN_IOMODULE_PIT_3_INTERRUPT_INTR
TimerNumber = 3 = XIN_IOMODULE_PIT_4_INTERRUPT_INTR

 PITの割り込みは XIOModule_SetHandlerを使う方が良さそう
typedef void(*) XIOModule_Timer_Handler(void *CallBackRef, u8 TimerNumber)
void 	XIOModule_SetHandler (XIOModule *InstancePtr, XIOModule_Timer_Handler FuncPtr, void *CallBackRef)

C:\Xilinx\14.7\ISE_DS\EDK\sw\XilinxProcessorIPLib\drivers\iomodule_v1_04_a\src\xiomodule_l.h
/**
 * Defines the number of timer counters within a single hardware device. This
 * number is not currently parameterized in the hardware but may be in the
 * future.
 */
#define XTC_DEVICE_TIMER_COUNT		4
Microblaze MCS and PIT sample code

I/O Module v3.1
 LogiCORE IP Product Guide
 Vivado Design Suite
 PG111 November 14, 2018

● MicroBlazeの GPIOの I/Oや UARTのアドレス?

 ググルと XPAR_IOMODULE_0_DEVICE_IDの定義を使っている例、C_BASEADDR?の 0x80000000の直値をしている例等が混在しています。

 ワケワカラン!

 私の場合は xiomodule.hや xiomodule_l.hの定数定義を使う様にします。
https://github.com/Xilinx/embeddedsw/blob/master/XilinxProcessorIPLib/drivers/iomodule/src/xiomodule.h
/*
 * API Basic functions for GPI and GPO implemented in xiomodule.c
 */
u32 XIOModule_DiscreteRead(XIOModule *InstancePtr, u32 Channel);
void XIOModule_DiscreteWrite(XIOModule *InstancePtr,
        u32 Channel,
        u32 Mask);

https://github.com/Xilinx/embeddedsw/blob/master/XilinxProcessorIPLib/drivers/iomodule/src/xiomodule_l.h
/**
 * Interrupt register bit position masks.
 */
#define XIN_IOMODULE_GPI_1_INTERRUPT_INTR	11
#define XIN_IOMODULE_FIT_1_INTERRUPT_INTR	7
#define XIN_IOMODULE_PIT_1_INTERRUPT_INTR	3
#define XIN_IOMODULE_UART_RX_INTERRUPT_INTR	2
#define XIN_IOMODULE_UART_TX_INTERRUPT_INTR	1
#define XIN_IOMODULE_UART_ERROR_INTERRUPT_INTR	0
#define XIN_IOMODULE_EXTERNAL_INTERRUPT_INTR	16

#define XIOModule_EnableIntr(BaseAddress, EnableMask)

XPAR_AXI_INTC_0_AXI_PROM_STREAM_0_INTERRUPT_INTR

● Microblazeの Baremetal Drivers and Libraries サンプル

 Microblazeのベアメタル環境。

Xilinx / embeddedsw

Xilinx Wiki - Baremetal Drivers and Libraries

シンプルな AMP : Zynq SoC Cortex-A9 ベアメタル システムと MicroBlaze プロセッサ
 XAPP1093 (v1.0) 2013年 7月 8日

● MicroBlazeのプログラムエリアや割り込みのアドレス?

 意識する必要は有りません。(知る必要が無い)

● MicroBlazeで外部に接続した SDRAMを使用する方法

 AXI Interconnect
 MIG Memory Interface Generators
 を使用する。

● MIG
Memory Interface

AR# 62270: MIG 3.92 Virtex-6 DDR3 - CORE Generator の MIG でサポートされるデバイスのリストに MT4KTF12864HZ-1G6 K1 を追加する方法

Memory Interface Solutions User Guide(UG086)

● MPMC
Multi-Port Memory Controller (DDR/DDR2/SDRAM)


Tags: [FPGA], [電子工作], [Xilinx XC6SLX9], [FPGA 2022]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

AMD Xilinxの FPGA Spartan-6 XC6SLX16のボードを買ってアーケード ゲームを動かす
AMD Xilinxの FPGA Spartan-6 XC6SLX16のボードを買ってアーケード ゲームを動かす

  ALINX AX309 XC6SLX9の中華クローンの XC6SLX16版を購入しました

AMD Xilinxの FPGAの開発アプリ ISE WebPackをダウンロードして Windows 10で動かす方法
AMD Xilinxの FPGAの開発アプリ ISE WebPackをダウンロードして Windows 10で動かす方法

  Spartan-6の FPGAの開発用に Xilinx ISE WebPack開発ソフトウェアを Windows 10で動かす方法

Xilinxの FPGA Spartan-6の Block RAM RAMB8BWERに初期値を入れて ROMとして使う方法
Xilinxの FPGA Spartan-6の Block RAM RAMB8BWERに初期値を入れて ROMとして使う方法

  Xilinxの FPGA Spartan-6の Block RAM RAMB8BWERに初期値を入れて ROMとして使う方法

FPGA Spartan-6 XC6SLX16でファミコンを動かす!
FPGA Spartan-6 XC6SLX16でファミコンを動かす!

  Xilinx FPGA Spartan-6 XC6SLX16 NES clone in ALINX AX309

Xilinxの FPGA Spartan-6で PicoBlaze KCPSM 8 ビット マイクロコントローラーを動かす!
Xilinxの FPGA Spartan-6で PicoBlaze KCPSM 8 ビット マイクロコントローラーを動かす!

  PicoBlaze KCPSM6 in Spartan-6 with ISE WebPack

USB HOST機能を FPGAに実装する方法、FPGAの GPIOに USB HIDデバイスを接続したい!!
USB HOST機能を FPGAに実装する方法、FPGAの GPIOに USB HIDデバイスを接続したい!!

  FPGAに USB HOST機能を実装して Low Speedの USB HIDデバイスを接続するのら

USBの通信プロトコルを勉強する
USBの通信プロトコルを勉強する

  今まで漠然としていた USBデバイスの通信方法を理解します

USB HOST機能が欲しいのでワンチップマイコンの GPIOで USB HOST機能を実現する
USB HOST機能が欲しいのでワンチップマイコンの GPIOで USB HOST機能を実現する

  FPGAに USBデバイスを接続したいのですが、USB HOSTの通信を実装できないので困っています

OLIMEX LPC-H40(Philips LPC2106)
OLIMEX LPC-H40(Philips LPC2106)

  MOTHER BOARD for LPC-H40(LPC-H2106) and ASM Sample Program.

線形帰還シフトレジスタ LFSRのまとめ、FPGAの Verilog HDLでの実装例
線形帰還シフトレジスタ LFSRのまとめ、FPGAの Verilog HDLでの実装例

  LFSR Linear Feedback Shift Registerについて調べた

【2022年版】最近流行の RISC-Vプロセッサの環境を WSL Ubuntu上に構築する方法
【2022年版】最近流行の RISC-Vプロセッサの環境を WSL Ubuntu上に構築する方法

  RISC-Vプロセッサの Rocket Chipの開発環境を Windows上に構築して Verilogする方法

XILINX FPGAのBlock RAMをROMとして使う方法
XILINX FPGAのBlock RAMをROMとして使う方法

  FPGAに内蔵のBLOCK-RAMにROMとして初期値を与える方法

スパルタン2で
スパルタン2で"ギャラクシアン基板"を作る!

  Verilog言語で記述してあります

スパルタン2で
スパルタン2で"MIDWAY 8080(TAITO インベーダ基板)"を動かす!

  ハードウェアで本物を作ります

スパルタン2で
スパルタン2で"パックマン"を動かす!

  FPGAでパックマンが動きます

スパルタン2で
スパルタン2で"ド*キーコ*グ"を動かす!

  これもFPGAで動いちゃいます

スパルタン3でアーケードゲームを動かす!
スパルタン3でアーケードゲームを動かす!

  XAPP694の使用例、INVADER/GALAXIAN/PACMAN/D*NKEY-K*NG/TIME PILOT




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2022 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/fpga/xilinx_spartan6_microblaze/