Cora Z7 > microSD起動 > No Execution Address JTAG handoff > CPUアプリを含めてBOOT.binを作成する + bitstreamにelfを関連付ける


動作環境
CORA Z7
Windows 10 Pro v1909
Vivado v2019.1
TeraTerm Version 4.105

概要

  • MicroBlazeアプリを作成
    • UARTで文字列「1559MicroBlaze」を出力する
  • BOOT.binを作成してmicroSD起動する

Block design

  • MicroBlazeを追加する
  • UartLiteを足してMicroBlazeに接続
  • Zynqを追加
    • CPUアプリを作るため

MicroBlazeの詳細について「FPGA プログラミング大全 Xilinx編 小林 優様」に詳しい。

制約ファイル

Pmod Aの0,1ピンに接続する設定とした。

set_property PACKAGE_PIN Y18 [get_ports rx_0]
set_property PACKAGE_PIN Y19 [get_ports tx_0]
set_property IOSTANDARD LVCMOS33 [get_ports rx_0]
set_property IOSTANDARD LVCMOS33 [get_ports tx_0]

set_property PACKAGE_PIN W13 [get_ports reset_rtl_0]
set_property IOSTANDARD LVCMOS33 [get_ports reset_rtl_0]

XSDKでの作業

  1. Zynq FSBLアプリを新規作成
  2. CPU アプリを新規作成 (Hello World)
  3. MicroBlaze アプリを新規作成

FSBLのmain.cを変更 (起動時にdelayを入れる)

Cora Z7 > ビルトイン USBシリアルでFSBLの処理メッセージを表示したい > 10秒のdelayを追加 > microSDからアプリ起動もした
- これをしないと起動に失敗する

MicroBlaze アプリ

MicroBlazeからUART出力をするプログラム。

hello_world.c
#include "xparameters.h"
#include "xstatus.h"
#include "xuartlite.h"
#include "sleep.h"

#define UARTLITE_DEVICE_ID  ( XPAR_AXI_UARTLITE_0_DEVICE_ID )
//#define UARTLITE_DEVICE_ID  ( XPAR_AXI_UARTLITE_4_DEVICE_ID )

int SendAndReceive(u16 DeviceId);

XUartLite UartLite;
u8 RecvBuffer[100];

int main(void)
{
    int Status;

    sleep(10);

    Status = SendAndReceive(UARTLITE_DEVICE_ID);
    if (Status != XST_SUCCESS) {
        return XST_FAILURE;
    }

    return XST_SUCCESS;

}

int SendAndReceive(u16 DeviceId)
{
    int Status;
    unsigned int ReceivedCount = 0;

    Status = XUartLite_Initialize(&UartLite, DeviceId);
    if (Status != XST_SUCCESS) {
        return XST_FAILURE;
    }

    Status = XUartLite_SelfTest(&UartLite);
    if (Status != XST_SUCCESS) {
        return XST_FAILURE;
    }

    // send
    u8 testmsg[] = "1559MicroBlaze\r\n";
    XUartLite_Send(&UartLite, testmsg, sizeof(testmsg));
    usleep(400000); // 400msec

    // recv
    while (1) {
        ReceivedCount += XUartLite_Recv(&UartLite,
                       RecvBuffer + ReceivedCount,
                       1);
        if (RecvBuffer[ReceivedCount - 1] == '\r') {
            break;
        }
    }

    print("You have received:");
    print(RecvBuffer);
    print("\r\n");

    return XST_SUCCESS;
}

FSBLのデバッグオプション

FSBL_DEBUG_INFO をデバッグオプションに追加しておく。
microSD起動時にUSBケーブル接続側のUARTにFSBL動作情報が表示される。

失敗編

Boot.bin作成

  1. FSBL
  2. bitstream
  3. MicroBlazeアプリケーション

上記でBOOT.binを作成

FSBLのログは以下。

Xilinx First Stage Boot Loader
Release 2019.1  Oct 19 2020-20:38:07
Devcfg driver initialized
Silicon Version 3.1
Boot mode is SD
SD: rc= 0
SD Init Done
Flash Base Address: 0xE0100000
Reboot status register: 0x60400000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 2
Partition Number: 1
Header Dump
Image Word Len: 0x0007F2E8
Data Word Len: 0x0007F2E8
Partition Word Len:0x0007F2E8
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000075D0
Partition Attr: 0x00000020
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFE7AF06
Bitstream
In FsblHookBeforeBitstreamDload function
PCAP:StatusReg = 0x40000A30
PCAP:device ready
PCAP:Clear done
Level Shifter Value = 0xA
Devcfg Status register = 0x40000A30
PCAP:Fabric is Initialized done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x0802000B
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00003A30
PCAP DMA SRC ADDR 0xF8007018: 0x00100001
PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF
PCAP DMA SRC LEN 0xF8007020: 0x0007F2E8
PCAP DMA DEST LEN 0xF8007024: 0x0007F2E8
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800100

DMA Done !

FPGA Done !
In FsblHookAfterBitstreamDload function
Handoff Address: 0x00000000
In FsblHookBeforeHandoff function
No Execution Address JTAG handoff

成功変

Boot.bin作成

  1. FSBL
  2. bitstream
  3. CPUアプリケーション
  4. MicroBlazeアプリケーション

BITファイル

//arch = zynq; split = false; format = BIN
the_ROM_image:
{
    [bootloader]C:\coraZ7prj_201016\2020-10-17_1453_mbFsbl\2020-10-17_1453_mbFsbl.sdk\fsbl_1600\Debug\fsbl_1600.elf
    C:\coraZ7prj_201016\2020-10-17_1453_mbFsbl\2020-10-17_1453_mbFsbl.sdk\design_1_wrapper_hw_platform_0\design_1_wrapper.bit
    C:\coraZ7prj_201016\2020-10-17_1453_mbFsbl\2020-10-17_1453_mbFsbl.sdk\cpu_1631\Debug\cpu_1631.elf
    C:\coraZ7prj_201016\2020-10-17_1453_mbFsbl\2020-10-17_1453_mbFsbl.sdk\uart_1558\Debug\uart_1558.elf
}

FSBLのログは以下。

Xilinx First Stage Boot Loader
Release 2019.1  Oct 21 2020-20:14:53
Devcfg driver initialized
Silicon Version 3.1
Boot mode is SD
SD: rc= 0
SD Init Done
Flash Base Address: 0xE0100000
Reboot status register: 0x60400000
Multiboot Register: 0x0000C000
Image Start Address: 0x00000000
Partition Header Offset:0x00000C80
Partition Count: 6
Partition Number: 1
Header Dump
Image Word Len: 0x0007F2E8
Data Word Len: 0x0007F2E8
Partition Word Len:0x0007F2E8
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000075D0
Partition Attr: 0x00000020
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFE7AF06
Bitstream
In FsblHookBeforeBitstreamDload function
PCAP:StatusReg = 0x40000A30
PCAP:device ready
PCAP:Clear done
Level Shifter Value = 0xA
Devcfg Status register = 0x40000A30
PCAP:Fabric is Initialized done
PCAP register dump:
PCAP CTRL 0xF8007000: 0x4C00E07F
PCAP LOCK 0xF8007004: 0x0000001A
PCAP CONFIG 0xF8007008: 0x00000508
PCAP ISR 0xF800700C: 0x0802000B
PCAP IMR 0xF8007010: 0xFFFFFFFF
PCAP STATUS 0xF8007014: 0x00000A30
PCAP DMA SRC ADDR 0xF8007018: 0x00100001
PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF
PCAP DMA SRC LEN 0xF8007020: 0x0007F2E8
PCAP DMA DEST LEN 0xF8007024: 0x0007F2E8
PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
PCAP MBOOT 0xF800702C: 0x0000C000
PCAP SW ID 0xF8007030: 0x00000000
PCAP UNLOCK 0xF8007034: 0x757BDF0D
PCAP MCTRL 0xF8007080: 0x30800100

DMA Done !

FPGA Done !
In FsblHookAfterBitstreamDload function
Partition Number: 2
Header Dump
Image Word Len: 0x00002002
Data Word Len: 0x00002002
Partition Word Len:0x00002002
Load Addr: 0x00100000
Exec Addr: 0x00100000
Partition Start: 0x000868C0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000001
Checksum: 0xFFD734C8
Application
Partition Number: 3
Header Dump
Image Word Len: 0x0000000A
Data Word Len: 0x0000000A
Partition Word Len:0x0000000A
Load Addr: 0x00000000
Exec Addr: 0x00000000
Partition Start: 0x000888D0
Partition Attr: 0x00000010
Partition Checksum Offset: 0x00000000
Section Count: 0x00000003
Checksum: 0xFFF7748E
Application
Handoff Address: 0x00100000
In FsblHookBeforeHandoff function
SUCCESSFUL_HANDOFF
FSBL Status = 0x1
Hello World

UARTLiteの接続先のシリアル出力

1559MicroBlaze

備考

BOOT.binをCPUアプリケーションで作成していた時にもNo Execution Address JTAG handoffが出ていた。
CPUアプリを作成しなおしてからか、失敗しなくなった。

よくわからない。

再度同じことしたら、CPU elfは起動したが、MicroBlaze elfが起動しない。

よくわからない。

二回目に実施

二回目の実施では、CPUアプリは起動し、MicroBlazeアプリは起動しなかった。
作業を見返して

  • MicroBlazeのelfはReleaseとして作成
  • Vivadoに戻って、Tools > Associate ELF Filesにて、そのelfファイルを選択

これでMicroBlazeアプリが起動するようになった。