LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-10-21
動作環境
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アプリを作るため

zynq.png

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動作情報が表示される。

zynq.png

失敗編

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ファイルを選択

zynq.png

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0