FC2カウンター FPGAの部屋 2018年01月

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

FPGAの部屋

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

Vivado HLS 2017.4 で片方が定数の場合の乗算の検討4(畳み込み演算1)

Vivado HLS 2017.4 で片方が定数の場合の乗算の検討3(C コードの合成2)”の続き。

前回は、片方が定数のときの乗算は、片方が定数と定義して、乗算記号の * を使ったほうがリソース使用量点から言っても効率が良いということになった。今回は、乗算記号の * を使用して、畳み込みニューラルネットワークの畳み込み演算の重みを定数と置いたときの乗算を検討してみよう。

Vivado HLS 2017.4 で、multi_test2 プロジェクトを作成した。
multi_test_30_180131.png

multi_test2.h を貼っておく。

// multi_test2.h
// 2018/01/30 by marsee
//

#ifndef __multi_test_H__
#define __multi_test_H__
#include <ap_fixed.h>

typedef ap_ufixed<80, AP_TRN, AP_WRAP> ap_ufixed_in;
typedef ap_fixed<91, AP_TRN, AP_WRAP> ap_fixed_weight;
typedef ap_fixed<171, AP_TRN, AP_WRAP> ap_fixed_multi;
typedef ap_fixed<166, AP_TRN_ZERO, AP_SAT> ap_fixed_add;

#endif


multi_test2.cpp を貼っておく。

// multi_test2.cpp
// 2018/01/30 by marsee
//

#include "multi_test2.h"

int multi_test2(ap_ufixed_in in[25], ap_fixed_add &out){
#pragma HLS PIPELINE II=1

    out = (ap_fixed_multi)(in[0]*(const ap_fixed_weight)0.765625) +
            (ap_fixed_multi)(in[1]*(const ap_fixed_weight)0.66015625) +
            (ap_fixed_multi)(in[2]*(const ap_fixed_weight)0.59375) +
            (ap_fixed_multi)(in[3]*(const ap_fixed_weight)0.5546875) +
            (ap_fixed_multi)(in[4]*(const ap_fixed_weight)0.3671875) +
            (ap_fixed_multi)(in[5]*(const ap_fixed_weight)0.58203125) +
            (ap_fixed_multi)(in[6]*(const ap_fixed_weight)0.4140625) +
            (ap_fixed_multi)(in[7]*(const ap_fixed_weight)0.31640625) +
            (ap_fixed_multi)(in[8]*(const ap_fixed_weight)0.3515625) +
            (ap_fixed_multi)(in[9]*(const ap_fixed_weight)0.33203125) +
            (ap_fixed_multi)(in[10]*(const ap_fixed_weight)0.58984375) +
            (ap_fixed_multi)(in[11]*(const ap_fixed_weight)0.4609375) +
            (ap_fixed_multi)(in[12]*(const ap_fixed_weight)(-0.23828125))+
            (ap_fixed_multi)(in[13]*(const ap_fixed_weight)(-0.09765625)) +
            (ap_fixed_multi)(in[14]*(const ap_fixed_weight)0.234375) +
            (ap_fixed_multi)(in[15]*(const ap_fixed_weight)0.79296875) +
            (ap_fixed_multi)(in[16]*(const ap_fixed_weight)0.31640625) +
            (ap_fixed_multi)(in[17]*(const ap_fixed_weight)0.0390625) +
            (ap_fixed_multi)(in[18]*(const ap_fixed_weight)0.35546875) +
            (ap_fixed_multi)(in[19]*(const ap_fixed_weight)0.42578125) +
            (ap_fixed_multi)(in[20]*(const ap_fixed_weight)0.6328125) +
            (ap_fixed_multi)(in[21]*(const ap_fixed_weight)0.65234375) +
            (ap_fixed_multi)(in[22]*(const ap_fixed_weight)0.6875) +
            (ap_fixed_multi)(in[23]*(const ap_fixed_weight)0.70703125) +
            (ap_fixed_multi)(in[24]*(const ap_fixed_weight)0.6796875);

    return(0);
}


multi_test2_tb.cpp を貼っておく。

// multi_test2_tb.h
// 2018/01/30 by marsee
//

#include "multi_test2.h"

int multi_test2(ap_ufixed_in in[25], ap_fixed_add &out);

int main(void){
    ap_ufixed_in in[25];
    ap_fixed_add out;
    ap_ufixed_in v = 0.5;

    for(int i=0; i<25; i=i++){
        in[i] = (ap_ufixed_in)v;
        v += (ap_ufixed_in)0.00390625;
        printf("in[%d] = %f\n", i, (float)v);
    }

    multi_test2(in, out);

    printf("out = %f\n", (float)out);

    return(0);
}


C シミュレーションを行った。
multi_test_31_180131.png

INFO: [SIM 2] *************** CSIM start ***************
INFO: [SIM 4] CSIM will launch GCC as the compiler.
Compiling ../../../multi_test2_tb.cpp in debug mode
Generating csim.exe
in[0] = 0.503906
in[1] = 0.507813
in[2] = 0.511719
in[3] = 0.515625
in[4] = 0.519531
in[5] = 0.523438
in[6] = 0.527344
in[7] = 0.531250
in[8] = 0.535156
in[9] = 0.539063
in[10] = 0.542969
in[11] = 0.546875
in[12] = 0.550781
in[13] = 0.554688
in[14] = 0.558594
in[15] = 0.562500
in[16] = 0.566406
in[17] = 0.570313
in[18] = 0.574219
in[19] = 0.578125
in[20] = 0.582031
in[21] = 0.585938
in[22] = 0.589844
in[23] = 0.593750
in[24] = 0.597656
out = 6.113281
INFO: [SIM 1] CSim done with 0 errors.
INFO: [SIM 3] *************** CSIM finish ***************


C コードの合成を行った。結果を示す。
multi_test_32_180131.png

Latency が 15 クロックは良いのだが、Interval が 13 クロックになっている。
リソース使用量は、DSP48E が 22 個、FF が 295 個、LUT が 581 個となった。

Analysis 画面を示す。
multi_test_33_180131.png

in_V の read が横にずらっと並んでしまっている。これでは要求仕様を満たさない。Interval は 1 クロックにしたい。

multi_test2.v を見てみよう。
multi_test_34_180131.png

in_V はメモリ・インターフェースになっている。

それでは、入力 in の配列をバラバラにするにはどうするといえば、array partition 指示子で complete オプションを付ければ良い。

#pragma HLS ARRAY_PARTITION variable=in complete dim=1


multi_test_35_180131.png

これで、C コードの合成を行った。結果を示す。
multi_test_36_180131.png

Latency は 12 クロックで 15 クロックより少なくなった。Interval は 1 クロックで 1 クロックごとに処理することができる。これは希望通り。
リソース使用量は、DSP48E は 22 個で同じだが、 FF が約 5.7 倍の 1685 個、LUT が約 1.7 倍の 988 個だった。

multi_test.v を見ると、in の配列が array partition complete でバラバラになり、in_0_V から in_24_V までの入力ポートがインスタンスされているのが分かる。
multi_test_37_180131.png

さて、次は、DSP48E を使用しないようにしたい。それは、すべての畳み込み演算をDSP48E を使用して行うとDSP48E が足りなくなるからだ。以前はLUTに演算を割り振る方法は分からなかったのだが、今回、いろいろとトライするうちに、その方法を見つけることができた。それは、RESOURCE 指示子で core = AddSub を指定することだ。
早速、試してみよう。

#pragma HLS RESOURCE variable=out core=AddSub


multi_test_38_180131.png

C コードの合成を行った。結果を示す。
multi_test_39_180131.png

Latency は 8 クロックで、Interval は 1 クロックだった。Latency がさらに縮まった。
リソース使用量は、DSP48E は使用しなかったが、その代わり FF が 1305 個、LUT が 2251 個使用されている。

Analysis 画面を示す。
multi_test_40_180131.png

read が縦に並んで 1 クロックで行っているのが分かる。

multi_test2.v を示す。前回同様に、in_0_V から in_24_V までの入力ポートがインスタンスされているのが分かる。
multi_test_41_180131.png
  1. 2018年01月31日 07:05 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる14(led_on.py を C で書いてみる)

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる12(FPGAのコンフィギュレーション)
@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる13(デバイスツリーの入れ替え)
では、デバイスツリーをロードして、LEDを点灯させるアプリケーションソフトは @ikwzm さんの作成された led_on.py を使用した。Python のコードを使っても良いのだが、いつも書いている C 言語でアプリケーションソフトを書いてみることにした。

関連する @ikzwm さんの記事は”UltraZed 向け Debian GNU/Linux で FPGA をコンフィギュレーション”の”LED を点滅させてみる”だ。

まずは、led_on.c を書いてみた。
UltraZed-EG_StKit_Linux_200_180129.png

// led_on.c
// 2018/01/29 by marsee
//

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>

int main(){
    int fd1;
    
    volatile unsigned int *led;
    
    unsigned int pattern[14] = {0x010x020x040x080x100x200x400x800x400x200x100x080x040x02};
    int i, j;
    
    // led(uio1)
    fd1 = open("/dev/uio1", O_RDWR); // USER LEDS
    if(fd1 < 1){
        fprintf(stderr, "/dev/uio1 (led) open error\n");
        exit(-1);
    }
    led = (volatile unsigned *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd1, 0);
    if(!led){
        fprintf(stderr, "led mmap error\n");
        exit(-1);
    }
    
    for(i=0; i<10; i++){
        for(j=0; j<14; j++){
            led[0] = pattern[j];
            usleep(100000);
        }
    }
    
    munmap((void *) led, 0x1000);
    
    close(fd1);
    
    return(0);
}


led_on.py と比べて点滅する数は少し多いかもしれないが、大体同じ動作をする。

これをUltraZed-EG Starter Kit のDebian Linux の ~/examples/gpio ディレクトリにおいて、コンパイルを行った。
gcc -o led_on led_on.c

led_on を実行するために、”@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる12(FPGAのコンフィギュレーション)”と同様に sh スクリプトを作成した。exe_led_on_c.sh だ。その内容を示す。
UltraZed-EG_StKit_Linux_201_180129.png

#!/bin/sh

sudo mkdir /config/device-tree/overlays/fpga
sudo cp fpga-load_uzed.dtb /config/device-tree/overlays/fpga/dtbo

sudo mkdir /config/device-tree/overlays/fclk0
sudo cp fclk0-zynqmp.dtb /config/device-tree/overlays/fclk0/dtbo

sudo mkdir /config/device-tree/overlays/uio
sudo cp uio_uzed.dtb /config/device-tree/overlays/uio/dtbo
ls -la /dev/uio*

sudo ./led_on


ただ単に最後の行を入れ替えただけだ。

exe_led_on_c.sh を実行すると、同様にLED が点灯した。これで、従来通りに C で書いても動作するということが分かった。
UltraZed-EG_StKit_Linux_199_180129.png
  1. 2018年01月30日 04:09 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

Windows 10 からUbuntu 16.04 LTSをVNC で使う

Ubuntu 専用のマシンが来たので、メインのマシンのWindows 10 から、今度購入したUbuntu 16.04 LTS のマシンを使いたいということでやってみた。

初めにWindows 10 のリモートデスクトップでUbuntu 16.04 LTS を制御できれば良いな?と思って、Ubuntu に xdrp をインストールしたのだが、足掛け 2 日やってもうまく行かなかった。
そこで、VNC はどうかということで調べてみると、Ubuntu 16.04 LTS にはVino というVNC サーバーがインストールされているということなので、さっそく使ってみることにした。

日本語だと「デスクトップ共有の設定」という名前だ。下の図のように設定した。
UltraVNC_1_180129.png

Windows 10 側では、窓の杜からUltraVNC をダウンロードしてインストールした。
UltraVNC を起動する。
VNC Server のIP を指定して、Connect ボタンをクリックする。
UltraVNC_3_180129.png

その前に、Options... ボタンをクリックすると設定することができる。
UltraVNC_4_180129.png

Connect ボタンをクリックすると、Password を入力する。これは、「デスクトップ共有の設定」で設定したパスワードを入れる。
UltraVNC_5_180129.png

すると、Ubuntu 16.04 LTS のデスクトップが表示される。
UltraVNC_2_180129.png

これで、Ubuntu をWindows から使うことができるが、やはり、VNC なので、カーネルの移動やキー入力が遅い。もし遅さが気になるようだったら、ネイティブに接続されているマウスとキーボードを使えば良さそうだ。
上の画面は、SDxをインストールしたところだ。
  1. 2018年01月29日 20:14 |
  2. パソコン関連
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS 2017.4 で片方が定数の場合の乗算の検討3(C コードの合成2)

Vivado HLS 2017.4 で片方が定数の場合の乗算の検討2(C コードの合成1)”の続き。

前回は、乗数が定数の場合の乗算のC コードの合成を行って、2 つの量子化モードとオーバーフローモードでの演算の比較を行った。今回は、片方が定数なので、乗算をシフト+加算に置き換えた演算で、2 つの量子化モードとオーバーフローモードでの演算の比較を行う。

まずは、任意精度固定小数点データ型の ap_fixed の量子化モードは 0 への切り捨て(AP_TRN_ZERO)で、オーバーフローモードは飽和(AP_SAT)に設定した。つまり、multi_test.h で上の 2 行のコメントを外して、下の 2 行をコメントアウトした。
multi_test_9_180128.png

そして、multi_test.cpp はout1 を out2 からコピーして、本来の out1 をコメントアウトした。これは、out2 のリソース使用量を見るためだ。
multi_test_17_180128.png

これで C コードの合成を行った。結果を示す。
multi_test_18_180129.png

Latency が 2 クロックになって、更にレイテンシが増えている。これだと、入力したクロックの 2 クロック後が出力のクロックになる。
リソース使用量は、FF が 25 個、LUT が 269 個となっている。今までで一番リソース使用量が多い。

Analysis 画面を示す。
multi_test_19_180129.png

3 個のステートがある。

次に、multi_test.h の下の 2 行を生かして、任意精度固定小数点データ型の ap_fixed の量子化モードが負の無限大への切り捨て(AP_TRN)で、オーバーフローモードが折り返し(AP_WRAP)に変更してみよう。
multi_test_5_180127.png

これで、C コードの合成を行った。結果を示す。
multi_test_20_180129.png

Latency は 0 クロックになったので、組み合わせ回路になっている。
リソース使用量は、LUT が 53 個だ。

Analysis 画面を示す。
multi_test_21_180129.png

今度は、乗数が定数の乗算で C コードの合成結果の in1 を 2 倍して、in1 の 1/4 の数を引く方法をやってみようと思う。
multi_test_22_180129.png

この時に C シミュレーションを行ったところ、小数部のビット幅を 1 ビットずつ増やす必要があった。
multi_test.h を示す。
multi_test_23_180129.png

C コードの合成を行った。結果を示す。
multi_test_24_180129.png

Latency が 1 クロックで、FF は 12 個、LUT は 227 個使用している。
これは、”Vivado HLS 2017.4 で片方が定数の場合の乗算の検討2(C コードの合成1)”の時の乗数が定数の時と同じ合成レポートになった。

Analysis 画面を示す。
multi_test_25_180129.png

multi_test.h の下の 2 行を生かして、任意精度固定小数点データ型の ap_fixed の量子化モードが負の無限大への切り捨て(AP_TRN)で、オーバーフローモードが折り返し(AP_WRAP)に変更した。
multi_test_26_180129.png

C コードの合成を行った。結果を示す。
multi_test_28_180129.png

これも、”Vivado HLS 2017.4 で片方が定数の場合の乗算の検討2(C コードの合成1)”の時の乗数が定数の時と同じ合成レポートになった。

Analysis 画面を示す。
multi_test_29_180129.png

結論としては、片方が定数の乗算を使用して、任意精度固定小数点データ型の ap_fixed の量子化モードが負の無限大への切り捨て(AP_TRN)で、オーバーフローモードが折り返し(AP_WRAP)を使用したほうが良さそうだ。
  1. 2018年01月29日 05:02 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS 2017.4 で片方が定数の場合の乗算の検討2(C コードの合成1)

”Vivado HLS 2017.4 で片方が定数の場合の乗算の検討1(C シミュレーション)”の続き。

前回は、Vivado HLS 2017.4 で片方が定数の場合の乗算を乗算記号を使用した演算と 2 の n 乗の数に分解し、それを足し合わせることで乗算する演算との比較を C シミュレーションで行った。今回は、C コードの合成を行って、2 つの演算の比較を行う。

まずは、multi_test.h を元に戻す。つまり、任意精度固定小数点データ型の ap_fixed の量子化モードは 0 への切り捨て(AP_TRN_ZERO)で、オーバーフローモードは飽和(AP_SAT)にするということだ。
multi_test_9_180128.png

次に、multi_test.cpp を out1 の通常の乗算記号を使った out1 の演算だけにする。out2 は out1 の出力をコピーする。
multi_test_10_180128.png

これで C コードの合成を行った。なお、使用したFPGAは、PYNQ やZYBO Z7-20 を想定した xc7z020clg400-1 だ。
結果を示す。
multi_test_11_180128.png

Estmated は 8.30 ns だった。
Latency が 1 クロックなので 2 クロックで 1 出力だが、PIPELINE指示子があるので、Interval は 1 クロックになっている。FF は 12 個、LUT は 227 個使用している。飽和演算をしているので、組み合わせ回路では回路的にダメの様で 2 クロックに分けているのではないだろうか?

Analysis 画面を示す。
multi_test_12_180128.png

出力された Verilog HDL コードを見てみよう。
multi_test_13_180128.png

演算は、in1 を 3 ビット左シフトする。下2ビットは小数点部なので、3 ビットシフトするということは 2 を乗算するのに等しい。そこから in1 そのものを引いている。つまり、in1 の 1/4 (0.25 )を引いている。 2 - 0.25 = 1.75 倍ということになる。思ったより賢い。乗算をシフト+引き算で実現している。

それでは、量子化モードが負の無限大への切り捨て(AP_TRN)で、オーバーフローモードが折り返し(AP_WRAP)に変更する。
multi_test.h の下の 2 行のコメントを外して、上の 2 行をコメントアウトする。
multi_test_5_180127.png

これで C コードの合成を行った。結果を示す。
multi_test_14_180128.png

今回は、Latency が 0 クロックなので、組み合わせ回路となっている。Estmated は 1.92 ns なので、500 MHz でも動作可能な数値だ。
組み合わせ回路なので、FF は 0 個、LUT はわずか 15 個となっている。ap_fixed の量子化モードは 0 への切り捨て(AP_TRN_ZERO)で、オーバーフローモードは飽和(AP_SAT)のモードの時と比べて、LUT は 15 / 227 ≒ 0.066 倍となり、7 % 弱となっている。
つまり、演算器のビット幅は増えても、量子化モードやオーバーフローモードの回路負担が大きいので、飽和演算をしたほうが回路規模は大きいようだ。この結果からではまだ何とも言えないだろうが、途中の計算では、無理にビット幅を落として飽和演算をするよりも、演算器のビット幅を増やして、桁あふれの無い演算をしたほうがリソース使用量は少ないという結論になった。

Analysis 画面を見てみよう。
multi_test_15_180128.png

組み合わせ回路なので、C0 ステートのみとなっているようだ。演算も1つだけでとってもシンプルだ。

出力された Verilog HDL コードを見てみよう。
multi_test_16_180128.png

ポート宣言を見ても組み合わせ回路なので、クロックとリセットが無い。
演算は、in1 を 3 ビット左シフトし、そこから in1 自体を引いているだけだ。
multi_test.v を貼っておく。

// ==============================================================
// RTL generated by Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC
// Version: 2017.4
// Copyright (C) 1986-2017 Xilinx, Inc. All Rights Reserved.
// 
// ===========================================================

`timescale 1 ns / 1 ps 

(* CORE_GENERATION_INFO="multi_test,hls_ip_2017_4,{HLS_INPUT_TYPE=cxx,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=1,HLS_INPUT_PART=xc7z020clg400-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=pipeline,HLS_SYN_CLOCK=1.915000,HLS_SYN_LAT=0,HLS_SYN_TPT=1,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=0,HLS_SYN_LUT=15}" *)

module multi_test (
        ap_start,
        ap_done,
        ap_idle,
        ap_ready,
        in1_V,
        out1_V,
        out1_V_ap_vld,
        out2_V,
        out2_V_ap_vld,
        ap_return
);


input   ap_start;
output   ap_done;
output   ap_idle;
output   ap_ready;
input  [5:0] in1_V;
output  [5:0] out1_V;
output   out1_V_ap_vld;
output  [5:0] out2_V;
output   out2_V_ap_vld;
output  [31:0] ap_return;

reg out1_V_ap_vld;
reg out2_V_ap_vld;

wire   [4:0] tmp_fu_58_p1;
wire   [7:0] p_shl_fu_62_p3;
wire  signed [7:0] OP1_V_cast_fu_54_p1;
wire   [7:0] p_Val2_s_fu_70_p2;

always @ (*) begin
    if ((ap_start == 1'b1)) begin
        out1_V_ap_vld = 1'b1;
    end else begin
        out1_V_ap_vld = 1'b0;
    end
end

always @ (*) begin
    if ((ap_start == 1'b1)) begin
        out2_V_ap_vld = 1'b1;
    end else begin
        out2_V_ap_vld = 1'b0;
    end
end

assign OP1_V_cast_fu_54_p1 = $signed(in1_V);

assign ap_done = ap_start;

assign ap_idle = 1'b1;

assign ap_ready = ap_start;

assign ap_return = 32'd0;

assign out1_V = {{p_Val2_s_fu_70_p2[7:2]}};

assign out2_V = {{p_Val2_s_fu_70_p2[7:2]}};

assign p_Val2_s_fu_70_p2 = ($signed(p_shl_fu_62_p3) - $signed(OP1_V_cast_fu_54_p1));

assign p_shl_fu_62_p3 = {{tmp_fu_58_p1}, {3'd0}};

assign tmp_fu_58_p1 = in1_V[4:0];

endmodule //multi_test

  1. 2018年01月28日 08:26 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS 2017.4 で片方が定数の場合の乗算の検討1(C シミュレーション)

畳み込みニューラルネットワークの乗算を展開するため、片方が定数の乗算のリソース使用量を少なくできる方法を探っていく。ニューラルネットワークの重みは定数なので、変数にしておく必要はない。つまり、片方が定数ということで、乗算回路を簡単化することができるということだ。ASICでは重みが固定されてしまうので、決まりきった回路になって単一機能になってしまうが、FPGAは重みが変わったら、再コンフィギュレーションすればよいだけなので、デメリットにはならない。もし動作中に重みを変えたいときは、パーシャル・リコンフィギュレーションすれば良いだけである。ZynqやZynqMP でARMプロセッサからパーシャル・リコンフィギュレーションできれば自分で重みを変えられるので更に良いだろう。

さて最初のVivado HLS による乗数が定数の乗算の C サンプルコード(multi_test.cpp)を示す。

// multi_test.cpp
// 2018/01/23 by marsee
//

#include "multi_test.h"

int multi_test(ap_fixed_def in1,
        ap_fixed_def &out1, ap_fixed_def &out2){
#pragma HLS PIPELINE II=1
    out1 = in1 * (ap_fixed_def)1.75;
    //out2 = out1;

    out2 = in1/4 + in1/2 + in1;
    //out2 = (ap_fixed_def2)in1/4 + (ap_fixed_def2)in1/2 + (ap_fixed_def2)in1;
    //out1 = out2;

    return(0);
}


いろいろとコメントアウトしてある行は後で使用する。

つまり、乗数が整数値の乗算と、乗算をシフト+加算に直した演算だ。

ヘッダ・ファイルの multi_test.h を示す。

// multi_test.h
// 2018/01/23 by marsee
//

#ifndef __multi_test_H__
#define __multi_test_H__
#include <ap_fixed.h>

typedef ap_fixed<53, AP_TRN_ZERO, AP_SAT> ap_fixed_def;
typedef ap_fixed<63, AP_TRN_ZERO, AP_SAT> ap_fixed_def2;
//typedef ap_fixed<6, 4, AP_TRN, AP_WRAP> ap_fixed_def;
//typedef ap_fixed<7, 4, AP_TRN, AP_WRAP> ap_fixed_def2;

#endif



テストベンチの multi_test_tb.cpp を示す。

// multi_test.h
// 2018/01/23 by marsee
//

#include "multi_test.h"

int multi_test(ap_fixed_def in1,
        ap_fixed_def &out1, ap_fixed_def &out2);

int main(void){
    ap_fixed_def in1, in2, out1, out2;

    for(float v=0.25; v<=3.75; v+=0.25){
        in1 = (ap_fixed_def)v;
        multi_test(in1, out1, out2);
        printf("v = %f, out1 = %f, out2 = %f, float = %f", v, (float)out1, (float)out2, v*1.75);
        if(out1 != out2)
            printf(" error\n");
        else
            printf("\n");
    }

    return(0);
}


つまり、0.25 刻みに 0.25 ~ 3.75 までの量子化した数と 1.75 を乗算するということだ。
multi_out.cpp の out1 はin1 と 1.75 をそのまま乗算しているが、out2 は in1 に 1/4 を乗じた数(つまり 0.25乗)+ in1 に 1/2 を乗じた数(つまり 0.5 乗)+ in1 の演算となる。
out1 と out2 は同じ結果になるはずだ。つまりそのまま乗算してるか筆算の方式で乗算しているかの違いだ。
Vivado HLS 2017.4 のプロジェクトの multi_test を下に示す。
multi_test_1_180127.png

このままのソースコードで C シミュレーションを行ってみよう。結果を示す。
multi_test_2_180127.png

INFO: [SIM 2] *************** CSIM start ***************
INFO: [SIM 4] CSIM will launch GCC as the compiler.
Compiling ../../../multi_test_tb.cpp in debug mode
Compiling ../../../multi_test.cpp in debug mode
Generating csim.exe
v = 0.250000, out1 = 0.250000, out2 = 0.250000, float = 0.437500
v = 0.500000, out1 = 0.750000, out2 = 0.750000, float = 0.875000
v = 0.750000, out1 = 1.250000, out2 = 1.000000, float = 1.312500 error
v = 1.000000, out1 = 1.750000, out2 = 1.750000, float = 1.750000
v = 1.250000, out1 = 2.000000, out2 = 2.000000, float = 2.187500
v = 1.500000, out1 = 2.500000, out2 = 2.500000, float = 2.625000
v = 1.750000, out1 = 3.000000, out2 = 2.750000, float = 3.062500 error
v = 2.000000, out1 = 3.500000, out2 = 3.500000, float = 3.500000
v = 2.250000, out1 = 3.750000, out2 = 3.750000, float = 3.937500
v = 2.500000, out1 = 3.750000, out2 = 3.750000, float = 4.375000
v = 2.750000, out1 = 3.750000, out2 = 3.750000, float = 4.812500
v = 3.000000, out1 = 3.750000, out2 = 3.750000, float = 5.250000
v = 3.250000, out1 = 3.750000, out2 = 3.750000, float = 5.687500
v = 3.500000, out1 = 3.750000, out2 = 3.750000, float = 6.125000
v = 3.750000, out1 = 3.750000, out2 = 3.750000, float = 6.562500
INFO: [SIM 1] CSim done with 0 errors.
INFO: [SIM 3] *************** CSIM finish ***************


v = 0.75 と v = 1.75 のところで、out1 と out2 の値が違っている。これは、out2 では、演算ごとに飽和演算や丸めが行われるので、演算精度が足りないのではないか?と思われる。out1 では一発で乗算をしてしまうので、演算による誤差の蓄積は無いと考えられる。
それでも、浮動小数点数の演算と違って、整数部が3ビットなので、整数は3 ~ -4 までしか表せないので、飽和演算で飽和はしても値は差が大きくなる。これは元来、整数部のビットが足りないので仕方がないことだ。

さて、次に、out2 の途中の演算でもう1ビット小数部のビットを追加してみてはどうだろうか?
小数部を1ビット増やして 3 ビットとした ap_fixed_def2 で乗算をキャストしてみよう。
multi_test_3_180127.png

これで C シミュレーションを行った。結果を示す。
multi_test_4_180127.png

INFO: [SIM 2] *************** CSIM start ***************
INFO: [SIM 4] CSIM will launch GCC as the compiler.
Compiling ../../../multi_test.cpp in debug mode
Generating csim.exe
v = 0.250000, out1 = 0.250000, out2 = 0.250000, float = 0.437500
v = 0.500000, out1 = 0.750000, out2 = 0.750000, float = 0.875000
v = 0.750000, out1 = 1.250000, out2 = 1.250000, float = 1.312500
v = 1.000000, out1 = 1.750000, out2 = 1.750000, float = 1.750000
v = 1.250000, out1 = 2.000000, out2 = 2.000000, float = 2.187500
v = 1.500000, out1 = 2.500000, out2 = 2.500000, float = 2.625000
v = 1.750000, out1 = 3.000000, out2 = 3.000000, float = 3.062500
v = 2.000000, out1 = 3.500000, out2 = 3.500000, float = 3.500000
v = 2.250000, out1 = 3.750000, out2 = 3.750000, float = 3.937500
v = 2.500000, out1 = 3.750000, out2 = 3.750000, float = 4.375000
v = 2.750000, out1 = 3.750000, out2 = 3.750000, float = 4.812500
v = 3.000000, out1 = 3.750000, out2 = 3.750000, float = 5.250000
v = 3.250000, out1 = 3.750000, out2 = 3.750000, float = 5.687500
v = 3.500000, out1 = 3.750000, out2 = 3.750000, float = 6.125000
v = 3.750000, out1 = 3.750000, out2 = 3.750000, float = 6.562500
INFO: [SIM 1] CSim done with 0 errors.
INFO: [SIM 3] *************** CSIM finish ***************


今度は、out1 と out2 の値はすべて合っている。やはり桁落ちしていたようだ。

次に、現在は任意精度固定小数点データ型の ap_fixed の量子化モードは 0 への切り捨て(AP_TRN_ZERO)で、オーバーフローモードは飽和(AP_SAT)だが、これだと回路も大きくなるし、レイテンシも増える。回路が小さくなるのは、量子化モードが負の無限大への切り捨て(AP_TRN)で、オーバーフローモードが折り返し(AP_WRAP)だ。これでやってみよう。
この場合は、折り返してしまうので、ビット幅が足りないと演算結果が不正になってしまう。よって整数部を 1 ビット増やして、4 ビットにしてみよう。小数部は 2 ビットのままとする。
multi_test.h の下の 2 行のコメントを外して、上の 2 行をコメントアウトする。
multi_test_5_180127.png

out2 の記述はap_fixed_def2 で乗算をキャストしていない文に戻した。
multi_test_6_180127.png

これで、C シミュレーションを行った。結果を示す。
multi_test_7_180127.png

INFO: [SIM 2] *************** CSIM start ***************
INFO: [SIM 4] CSIM will launch GCC as the compiler.
Compiling ../../../multi_test_tb.cpp in debug mode
Compiling ../../../multi_test.cpp in debug mode
Generating csim.exe
v = 0.250000, out1 = 0.250000, out2 = 0.250000, float = 0.437500
v = 0.500000, out1 = 0.750000, out2 = 0.750000, float = 0.875000
v = 0.750000, out1 = 1.250000, out2 = 1.000000, float = 1.312500 error
v = 1.000000, out1 = 1.750000, out2 = 1.750000, float = 1.750000
v = 1.250000, out1 = 2.000000, out2 = 2.000000, float = 2.187500
v = 1.500000, out1 = 2.500000, out2 = 2.500000, float = 2.625000
v = 1.750000, out1 = 3.000000, out2 = 2.750000, float = 3.062500 error
v = 2.000000, out1 = 3.500000, out2 = 3.500000, float = 3.500000
v = 2.250000, out1 = 3.750000, out2 = 3.750000, float = 3.937500
v = 2.500000, out1 = 4.250000, out2 = 4.250000, float = 4.375000
v = 2.750000, out1 = 4.750000, out2 = 4.500000, float = 4.812500 error
v = 3.000000, out1 = 5.250000, out2 = 5.250000, float = 5.250000
v = 3.250000, out1 = 5.500000, out2 = 5.500000, float = 5.687500
v = 3.500000, out1 = 6.000000, out2 = 6.000000, float = 6.125000
v = 3.750000, out1 = 6.500000, out2 = 6.250000, float = 6.562500 error
INFO: [SIM 1] CSim done with 0 errors.
INFO: [SIM 3] *************** CSIM finish ***************


やはり、out1 と out2 が違ってい部分があるので、先ほど同様、小数部を1ビット増やして 3 ビットとした ap_fixed_def2 で乗算をキャストしてみよう。
multi_test_3_180127.png

これで、C シミュレーションをやり直した。結果を示す。
multi_test_8_180127.png

INFO: [SIM 2] *************** CSIM start ***************
INFO: [SIM 4] CSIM will launch GCC as the compiler.
Compiling ../../../multi_test.cpp in debug mode
Generating csim.exe
v = 0.250000, out1 = 0.250000, out2 = 0.250000, float = 0.437500
v = 0.500000, out1 = 0.750000, out2 = 0.750000, float = 0.875000
v = 0.750000, out1 = 1.250000, out2 = 1.250000, float = 1.312500
v = 1.000000, out1 = 1.750000, out2 = 1.750000, float = 1.750000
v = 1.250000, out1 = 2.000000, out2 = 2.000000, float = 2.187500
v = 1.500000, out1 = 2.500000, out2 = 2.500000, float = 2.625000
v = 1.750000, out1 = 3.000000, out2 = 3.000000, float = 3.062500
v = 2.000000, out1 = 3.500000, out2 = 3.500000, float = 3.500000
v = 2.250000, out1 = 3.750000, out2 = 3.750000, float = 3.937500
v = 2.500000, out1 = 4.250000, out2 = 4.250000, float = 4.375000
v = 2.750000, out1 = 4.750000, out2 = 4.750000, float = 4.812500
v = 3.000000, out1 = 5.250000, out2 = 5.250000, float = 5.250000
v = 3.250000, out1 = 5.500000, out2 = 5.500000, float = 5.687500
v = 3.500000, out1 = 6.000000, out2 = 6.000000, float = 6.125000
v = 3.750000, out1 = 6.500000, out2 = 6.500000, float = 6.562500
INFO: [SIM 1] CSim done with 0 errors.
INFO: [SIM 3] *************** CSIM finish ***************


これで、out1 と out2 の値が合った。
  1. 2018年01月28日 04:00 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる13(デバイスツリーの入れ替え)

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる12(FPGAのコンフィギュレーション)”の続き。

前回は、Debian を使用して、UltraZed-EG Starter Kit でFPGA のコンフィギュレーション、FPGA のクロック設定、UIO を設定して、アプリケーションソフトを動作させた。今回は、FPGA のコンフィギュレーション、FPGA のクロック設定、UIO を設定を入れ替えてみよう。

今回、参考にするのも、”UltraZed 向け Debian GNU/Linux で FPGA をコンフィギュレーション

最初に私の作ったVivado プロジェクトのビットファイルでコンフィギュレーションを行い、FPGA のクロック設定、UIO を設定してアプリケーションソフトを起動して動作を確認した後で、@ikwzm さんの作ったVivado プロジェクトのビットファイルでコンフィギュレーションを行い、FPGA のクロック設定、UIO を設定してアプリケーションソフトを起動して動作を確認してみようと思う。

さて、FPGA のコンフィギュレーション、FPGA のクロック設定、UIO を設定して、アプリケーションソフトを動作する一連の流れを実行するスクリプトを作成した。もうすでにdtb は作成済みなので、dtc コンパイルは入れていない。
まずは、私のVivado プロジェクトのビットファイルを使用する exe_led_on.sh を貼っておく。

#!/bin/sh

sudo mkdir /config/device-tree/overlays/fpga
sudo cp fpga-load_uzed.dtb /config/device-tree/overlays/fpga/dtbo

sudo mkdir /config/device-tree/overlays/fclk0
sudo cp fclk0-zynqmp.dtb /config/device-tree/overlays/fclk0/dtbo

sudo mkdir /config/device-tree/overlays/uio
sudo cp uio_uzed.dtb /config/device-tree/overlays/uio/dtbo
ls -la /dev/uio*

sudo python3 led_on.py


UltraZed-EG_StKit_Linux_190_180125.png

次に、ikwzm さんのVivado プロジェクトのビットファイルを使用する exe_led_on_org.sh を貼っておく。

#!/bin/sh

sudo mkdir /config/device-tree/overlays/fpga
sudo cp fpga-load.dtb /config/device-tree/overlays/fpga/dtbo

sudo mkdir /config/device-tree/overlays/fclk0
sudo cp fclk0-zynqmp.dtb /config/device-tree/overlays/fclk0/dtbo

sudo mkdir /config/device-tree/overlays/uio
sudo cp uio.dtb /config/device-tree/overlays/uio/dtbo
ls -la /dev/uio*

sudo python3 led_on.py


UltraZed-EG_StKit_Linux_191_180125.png

最後に、”UltraZed 向け Debian GNU/Linux で FPGA をコンフィギュレーション”の”後始末”のDevice Tree Overlay で追加したデバイスツリーを、後から追加した順に削除するスクリプトの rm_dev.sh を貼っておく。

#!/bin/sh

sudo rmdir /config/device-tree/overlays/uio
sudo rmdir /config/device-tree/overlays/fclk0
sudo rmdir /config/device-tree/overlays/fpga


UltraZed-EG_StKit_Linux_192_180125.png

まずは、
./exe_led_on.sh
を実行した。IP ポートのTrea Term ウインドウを示す。
UltraZed-EG_StKit_Linux_184_180125.png

LEDの点滅動作もOKだった。
COMポートのTrea Term ウインドウを示す。
UltraZed-EG_StKit_Linux_185_180125.png

この時の/config/device-tree/overlay は fclk0, fpga, uio の各ディレクトリができている。
UltraZed-EG_StKit_Linux_186_180125.png

初めてデバイスツリーの削除をやるので、rm_dev.sh ではなく、実際にコマンドを打って削除した。
UltraZed-EG_StKit_Linux_187_180125.png

COMポートのTrea Term ウインドウを示す。
UltraZed-EG_StKit_Linux_188_180125.png

/config/device-tree/overlay は fclk0, fpga, uio の各ディレクトリが削除されている。
UltraZed-EG_StKit_Linux_189_180125.png

次に、
./exe_led_on_org.sh
を実行した。
UltraZed-EG_StKit_Linux_193_180125.png

led の点滅動作もOK だった。一度、デバイスツリーを削除してからもう一度、デバイスツリーをロードしても問題なく動作する。

COMポートのTrea Term ウインドウを示す。
UltraZed-EG_StKit_Linux_194_180125.png

/config/device-tree/overlay は fclk0, fpga, uio の各ディレクトリができている。
UltraZed-EG_StKit_Linux_195_180125.png

./rm_dev.sh
を実行した。
UltraZed-EG_StKit_Linux_196_180125.png

COMポートのTrea Term ウインドウを示す。
UltraZed-EG_StKit_Linux_197_180125.png

/config/device-tree/overlay は fclk0, fpga, uio の各ディレクトリが削除されている。
UltraZed-EG_StKit_Linux_198_180125.png

これで一旦ロードしたデバイスツリーを削除して、別のデバイスツリーをロードできることが確認できた。
  1. 2018年01月27日 04:45 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる12(FPGAのコンフィギュレーション)

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる11(パッケージのインストール)”の続き。

前回は、Debian が起動してから、使用するパッケージをインストールした。今回は、そのDebian を使用して、UltraZed-EG Starter Kit でFPGA のコンフィギュレーション、FPGA のクロック設定、UIO を設定して、アプリケーションソフトを動作させてみよう。

参考にするのは、”UltraZed 向け Debian GNU/Linux で FPGA をコンフィギュレーション

今回、FPGA にコンフィギュレーションする回路は@ikwzm さんと同じ回路だが自分で作ったGPIO の回路とする。IP インテグレータで作成するとデフォルトでは、IP のアドレス範囲が 4 k バイトになる。@ikwzm さんの回路ではIP のアドレス範囲は 64 k バイトなので、そこは違っている。

UltraZed-EG Starter Kit で Debian を立ち上げる。

fpga ユーザーでログインする。

fpga ディレクトリの下に examples ディレクトリを作成する。
mkdri examples
cd examples


ファイル一式を gpio ディレクトリにダウンロードする。( git clone です)
git clone https://github.com/ikwzm/ZynqMP-FPGA-Linux-Example-0-UltraZed gpio
cd gpio
ls

UltraZed-EG_StKit_Linux_156_180126.png

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる2(Sample FPGA Design編)”で作成したビットファイルの uzed_eg_ex1_wrapper.bit をUltraZed-EG Starter Kit の /home/fpga/examples/gpio にアップロードした。
UltraZed-EG_StKit_Linux_157_180126.png

Python の fpga-bit-to-bin.py を使って、ビットファイルを変換する。
python3 fpga-bit-to-bin.py -f uzed_eg_ex1_wrapper.bit uzed_eg_ex1_wrapper.bin
UltraZed-EG_StKit_Linux_159_180126.png

uzed_eg_ex1_wrapper.bin が生成された。

uzed_eg_ex1_wrapper.bin を /lib/firmware にコピーした。
sudo cp uzed_eg_ex1_wrapper.bin /lib/firmware
UltraZed-EG_StKit_Linux_160_180126.png

次は、Device Tree Overlay による FPGA のコンフィギュレーションなのだが、独自のビットファイルを使用しているので、dts を書き換える必要がある。
元になる fpga-load.dts を表示した。
UltraZed-EG_StKit_Linux_161_180126.png

fpga-load.dts をコピーして fpga-load_uzed.dts を作成し、ビットファイル名を uzed_eg_ex1_wrapper.bin に変更した。
cp fpga-load.dts fpga-load_uzed.dts
vi fpga-load_uzed.dts

UltraZed-EG_StKit_Linux_162_180126.png

dts をコンパイルして、FPGAのコンフィギュレーションを行う。
dtc -I dts -O dtb -o fpga-load_uzed.dtb fpga-load_uzed.dts (下の図のコマンドは間違っている。以前、コンパイルしておいたのでOKだった)
sudo mkdir /config/device-tree/overlays/fpga
sudo cp fpga-load_uzed.dtb /config/device-tree/overlays/fpga/dtbo

つまり、/config/device-tree/overlays に fpga ディレクトリを作って、そこにデバイスツリーをロードすればビットファイルをFPGA にコンフィギュレーションできるようだ。
UltraZed-EG_StKit_Linux_175_180124.png

このTrea Term のウインドウは、IP で開いているので表示が出ないが、COMポートのTrea Term ウインドウに fpga_manager の表示が出た。
UltraZed-EG_StKit_Linux_176_180124.png

FPGAのクロックを設定する。
fclk0-zynqmp.dts を表示した。これは修正する必要が無い。
UltraZed-EG_StKit_Linux_177_180124.png

dtc -I dts -O dtb -o fclk0-zynqmp.dtb fclk0-zynqmp.dts
sudo mkdir /config/device-tree/overlays/fclk0
sudo cp fclk0-zynqmp.dtb /config/device-tree/overlays/fclk0/dtbo

UltraZed-EG_StKit_Linux_178_180124.png

同様にCOMポートのTrea Term ウインドウを見ると、クロック設定のメッセージが出た。
UltraZed-EG_StKit_Linux_179_180124.png

正常にFPGA のクロックがコンフィギュレーションされたようだ。

UIO の設定。
uio.dts を uio_uzed.dts にコピーして設定を変更する。IP のアドレス範囲が 4k バイトなので、その領域指定とアドレスを変更する。
cp uio.dts uio_uzed.dts
vi uio_uzed.dts

UltraZed-EG_StKit_Linux_180_180124.png

修正済みの uio_uzed.dts
UltraZed-EG_StKit_Linux_181_180124.png

dtc -I dts -O dtb -o uio_uzed.dtb uio_uzed.dts
sudo mkdir /config/device-tree/overlays/uio
sudo cp uio_uzed.dtb /config/device-tree/overlays/uio/dtbo
ls -la /dev/uio*
をすると、/dev/uio0, /dev/uio1, /dev/uio2 の 3 個の UIO を見ることができた。
UltraZed-EG_StKit_Linux_182_180124.png

LED を点滅させる led_on.py を実行する。
sudo python3 led_on.py スーパーユーザー権限で led_on.py を実行すると、LEDが順番に点灯した。
led_on.py を実行するためには、UIO の権限を 666 にする。UIO のオーナーは root なので、一般ユーザーに使えるように 666 にしておこう。
すると、スーパーユーザー権限がなくても led_on.py が実行できた。
sudo chmod 666 /dev/uio*
python3 led_on.py

UltraZed-EG_StKit_Linux_183_180124.png

UltraZed-EG Starter Kit のピンクの四角で囲ったLED が点滅した。
UltraZed-EG_StKit_Linux_183_2_180125.jpg
  1. 2018年01月26日 04:49 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる11(パッケージのインストール)

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる10(実機で試す2)”の続き。

前回は、Debian の起動メッセージにエラーが出ていたので、その修正を行った。今回は、必要なパッケージのインストールを行う。

参考にするのは、”UltraZed 向け Debian GNU/Linux ブートイメージの提供

最初に ip_addr_show で IP アドレスを表示した。
UltraZed-EG_StKit_Linux_152_180126.png

なお、ここから何度もやり直したので、辻褄が合わなくてしまった。ご了承ください。。。

先ほどのIP アドレスから fpga ユーザーでログインする。
debian ディレクトリに行く。
debian ディレクトリにはインストールするべき 4 つのパッケージがある。
UltraZed-EG_StKit_Linux_153_180126.png

まずは、
sudo dpkg -i linux-image-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-1_arm64.deb
UltraZed-EG_StKit_Linux_153_2_180126.png

sudo dpkg -i linux-headers-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-1_arm64.deb
UltraZed-EG_StKit_Linux_153_180126.png

sudo dpkg -i fclkcfg-4.9.0-xlnx-v2017.3-zynqmp-fpga_0.0.1-1_arm64.deb
ここは、”arm のDebian でsudo をする時に「ホスト…の名前解決ができません」といわれたときの対処方法”以前に画像をキャプチャしたので、名前解決ができませんと言われている。
UltraZed-EG_StKit_Linux_154_180126.png

sudo dpkg -i udmabuf-4.9.0-xlnx-v2017.3-zynqmp-fpga_0.0.1-1_arm64.deb
ここも、”arm のDebian でsudo をする時に「ホスト…の名前解決ができません」といわれたときの対処方法”以前に画像をキャプチャしたので、名前解決ができませんと言われている。
UltraZed-EG_StKit_Linux_155_180126.png

これで下準備は終了したので、次は、FPGA をコンフィギュレーションして動作させてみよう。
  1. 2018年01月25日 05:06 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる10(実機で試す2)

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる9(実機で試す)”の続き。

前回は、今までビルドしてきたソフトウェアやRoot FSを使用して、UltraZed-EG Starter Kit でDebian をブートした。今回は、Debian はブートできたのだが、2つほどエラーが出ているので、それを修正する。

Debian の起動メッセージで FPGA Clock Service と DMA Buffer Service にエラーが出ている。
UltraZed-EG_StKit_Linux_171_180124.png

エラー内容を知るためにコマンドを実行した。
systemctl status fpga-clock.service
systemctl status udmabuf.service

/sbin/modprobe fclkcfg と /sbin/modprobe udmabuf が実行コマンドのようなので、実行してみた。
sudo /sbin/modprobe fclkcfg
sudo /sbin/modprobe udmabuf

そしたら、どちらも /lib/modules/4.9.0-xlnx-v2017.3-zynqmp-fpga にモジュールが見つからないということだ。
UltraZed-EG_StKit_Linux_172_180124.png

fpga@debian-fpga:~$ systemctl status fpga-clock.service
● fpga-clock.service - FPGA Clock Service.
   Loaded: loaded (/etc/systemd/system/fpga-clock.service; enabled; vendor prese
   Active: failed (Result: exit-code) since Wed 2018-01-24 14:18:57 JST; 1min 5s
  Process: 2938 ExecStart=/sbin/modprobe fclkcfg (code=exited, status=1/FAILURE)
 Main PID: 2938 (code=exited, status=1/FAILURE)
fpga@debian-fpga:~$ systemctl status udmabuf.service
● udmabuf.service - User space mappable DMA Buffer Service.
   Loaded: loaded (/etc/systemd/system/udmabuf.service; enabled; vendor preset:
   Active: failed (Result: exit-code) since Wed 2018-01-24 14:18:57 JST; 3min 49
  Process: 2941 ExecStart=/sbin/modprobe udmabuf (code=exited, status=1/FAILURE)
 Main PID: 2941 (code=exited, status=1/FAILURE)


ここで、@ikwzm さんに対処方法を聞いたところ、depmod でカーネルモジュールの依存関係情報を更新した後で、modprobe してみてくれとのことだったので、やってみたところ、うまく行った。
そして、リブートを行った。
sudo /sbin/depmod
sudo /sbin/modprobe fclkcfg
sudo /sbin/modprobe udmabuf
sudo reboot

UltraZed-EG_StKit_Linux_173_180124.png

リブートしたところ、Debian の起動メッセージでの FPGA Clock Service と DMA Buffer Service のエラーは無くなっていた。
解消できた。
UltraZed-EG_StKit_Linux_174_180124.png

Debian の全起動メッセージを貼っておく。

Xilinx Zynq MP First Stage Boot Loader
Release 2017.4   Jan 23 2018  -  11:44:05
NOTICE:  ATF running on XCZU3EG/silicon v4/RTL5.1 at 0xfffea000, with PMU firmware
NOTICE:  BL31: Secure code at 0x0
NOTICE:  BL31: Non secure code at 0x8000000
NOTICE:  BL31: v1.4(release):development build
NOTICE:  BL31: Built : 11:44:32, Dec 24 2017
PMUFW:  v0.3


U-Boot 2017.01 (Dec 25 2017 - 00:11:15 +0900) Xilinx ZynqMP UltraZed-EG-IOCC

I2C:   ready
DRAM:  2 GiB
EL Level:       EL2
Chip ID:        xczu3eg
MMC:   sdhci@ff160000: 0 (eMMC), sdhci@ff170000: 1 (SD)
reading uboot.env

** Unable to read "uboot.env" from mmc0:1 **
Using default environment

In:    serial@ff000000
Out:   serial@ff000000
Err:   serial@ff000000
Bootmode: SD_MODE1
Net:   ZYNQ GEM: ff0e0000, phyaddr 9, interface rgmii-id

Warning: ethernet@ff0e0000 (eth0) using random MAC address - f6:f0:f3:80:f8:43
eth0: ethernet@ff0e0000
Hit any key to stop autoboot:  0
switch to partitions #0, OK
mmc1 is current device
Device: sdhci@ff170000
Manufacturer ID: 74
OEM: 4a60
Name: USDU1
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 7.3 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes
reading uEnv.txt
461 bytes read in 11 ms (40 KiB/s)
Loaded environment from uEnv.txt
Importing environment from SD ...
Running uenvcmd ...
reading image-4.9.0-xlnx-v2017.3-fpga
13107712 bytes read in 886 ms (14.1 MiB/s)
reading devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dtb
34934 bytes read in 19 ms (1.8 MiB/s)
## Flattened Device Tree blob at 04000000
   Booting using the fdt blob at 0x4000000
   Loading Device Tree to 000000000fff4000, end 000000000ffff875 ... OK

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.9.0-xlnx-v2017.3-zynqmp-fpga (masaaki@masaaki-VirtualBox2) (gcc version 5.2.1 20151005 (Linaro GCC 5.2-2015.11-2) ) #1 SMP Thu Jan 18 05:08:39 JST 2018
[    0.000000] Boot CPU: AArch64 Processor [410fd034]
[    0.000000] efi: Getting EFI parameters from FDT:
[    0.000000] efi: UEFI not found.
[    0.000000] cma: Reserved 256 MiB at 0x0000000070000000
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv1.1 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: MIGRATE_INFO_TYPE not supported.
[    0.000000] percpu: Embedded 21 pages/cpu @ffffffc06ff74000 s47488 r8192 d30336 u86016
[    0.000000] Detected VIPT I-cache on CPU0
[    0.000000] CPU features: enabling workaround for ARM erratum 845719
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 517120
[    0.000000] Kernel command line: console=ttyPS0,115200 root=/dev/mmcblk1p2 rw rootwait uio_pdrv_genirq.of_id=generic-uio
[    0.000000] PID hash table entries: 4096 (order: 3, 32768 bytes)
[    0.000000] Dentry cache hash table entries: 262144 (order: 9, 2097152 bytes)
[    0.000000] Inode-cache hash table entries: 131072 (order: 8, 1048576 bytes)
[    0.000000] Memory: 1789432K/2097152K available (8956K kernel code, 576K rwdata, 2732K rodata, 512K init, 389K bss, 45576K reserved, 262144K cma-reserved)
[    0.000000] Virtual kernel memory layout:
[    0.000000]     modules : 0xffffff8000000000 - 0xffffff8008000000   (   128 MB)
[    0.000000]     vmalloc : 0xffffff8008000000 - 0xffffffbebfff0000   (   250 GB)
[    0.000000]       .text : 0xffffff8008080000 - 0xffffff8008940000   (  8960 KB)
[    0.000000]     .rodata : 0xffffff8008940000 - 0xffffff8008bf0000   (  2752 KB)
[    0.000000]       .init : 0xffffff8008bf0000 - 0xffffff8008c70000   (   512 KB)
[    0.000000]       .data : 0xffffff8008c70000 - 0xffffff8008d00200   (   577 KB)
[    0.000000]        .bss : 0xffffff8008d00200 - 0xffffff8008d61850   (   390 KB)
[    0.000000]     fixed   : 0xffffffbefe7fd000 - 0xffffffbefec00000   (  4108 KB)
[    0.000000]     PCI I/O : 0xffffffbefee00000 - 0xffffffbeffe00000   (    16 MB)
[    0.000000]     vmemmap : 0xffffffbf00000000 - 0xffffffc000000000   (     4 GB maximum)
[    0.000000]               0xffffffbf00000000 - 0xffffffbf01c00000   (    28 MB actual)
[    0.000000]     memory  : 0xffffffc000000000 - 0xffffffc080000000   (  2048 MB)
[    0.000000] Hierarchical RCU implementation.
[    0.000000]  Build-time adjustment of leaf fanout to 64.
[    0.000000]  RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=4.
[    0.000000] RCU: Adjusting geometry for rcu_fanout_leaf=64, nr_cpu_ids=4
[    0.000000] NR_IRQS:64 nr_irqs:64 0
[    0.000000] GIC: Adjusting CPU interface base to 0x00000000f902f000
[    0.000000] GIC: Using split EOI/Deactivate mode
[    0.000000] arm_arch_timer: Architected cp15 timer(s) running at 99.99MHz (phys).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x171015c90f, max_idle_ns: 440795203080 ns
[    0.000003] sched_clock: 56 bits at 99MHz, resolution 10ns, wraps every 4398046511101ns
[    0.000284] Console: colour dummy device 80x25
[    0.000305] Calibrating delay loop (skipped), value calculated using timer frequency.. 199.99 BogoMIPS (lpj=399996)
[    0.000313] pid_max: default: 32768 minimum: 301
[    0.000427] Mount-cache hash table entries: 4096 (order: 3, 32768 bytes)
[    0.000433] Mountpoint-cache hash table entries: 4096 (order: 3, 32768 bytes)
[    0.001092] ASID allocator initialised with 65536 entries
[    0.001635] zynqmp_plat_init Power management API v0.3
[    0.001718] EFI services will not be available.
[    0.002095] Detected VIPT I-cache on CPU1
[    0.002124] CPU1: Booted secondary processor [410fd034]
[    0.002419] Detected VIPT I-cache on CPU2
[    0.002438] CPU2: Booted secondary processor [410fd034]
[    0.002716] Detected VIPT I-cache on CPU3
[    0.002735] CPU3: Booted secondary processor [410fd034]
[    0.002773] Brought up 4 CPUs
[    0.002788] SMP: Total of 4 processors activated.
[    0.002794] CPU features: detected feature: 32-bit EL0 Support
[    0.002802] CPU: All CPU(s) started at EL2
[    0.002816] alternatives: patching kernel code
[    0.003593] devtmpfs: initialized
[    0.008770] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[    0.014951] xor: measuring software checksum speed
[    0.052047]    8regs     :  2178.000 MB/sec
[    0.092075]    8regs_prefetch:  1934.000 MB/sec
[    0.132109]    32regs    :  2413.000 MB/sec
[    0.172141]    32regs_prefetch:  2178.000 MB/sec
[    0.172145] xor: using function: 32regs (2413.000 MB/sec)
[    0.172244] pinctrl core: initialized pinctrl subsystem
[    0.173002] NET: Registered protocol family 16
[    0.190592] cpuidle: using governor menu
[    0.190826] Failed to initialise IOMMU /amba/smmu@fd800000
[    0.191020] vdso: 2 pages (1 code @ ffffff8008947000, 1 data @ ffffff8008c74000)
[    0.191033] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
[    0.191639] DMA: preallocated 256 KiB pool for atomic allocations
[    0.202321] reset_zynqmp reset-controller: Xilinx zynqmp reset driver probed
[    0.202961] ARM CCI_400_r1 PMU driver probed
[    0.206478] zynqmp-pinctrl ff180000.pinctrl: zynqmp pinctrl initialized
[    0.226888] HugeTLB registered 2 MB page size, pre-allocated 0 pages
[    0.292346] raid6: int64x1  gen()   413 MB/s
[    0.360338] raid6: int64x1  xor()   419 MB/s
[    0.428404] raid6: int64x2  gen()   619 MB/s
[    0.496479] raid6: int64x2  xor()   548 MB/s
[    0.564548] raid6: int64x4  gen()   904 MB/s
[    0.632574] raid6: int64x4  xor()   679 MB/s
[    0.700587] raid6: int64x8  gen()  1051 MB/s
[    0.768677] raid6: int64x8  xor()   679 MB/s
[    0.836713] raid6: neonx1   gen()   671 MB/s
[    0.904740] raid6: neonx1   xor()   668 MB/s
[    0.972798] raid6: neonx2   gen()  1039 MB/s
[    1.040861] raid6: neonx2   xor()   921 MB/s
[    1.108900] raid6: neonx4   gen()  1378 MB/s
[    1.176952] raid6: neonx4   xor()  1072 MB/s
[    1.244999] raid6: neonx8   gen()  1552 MB/s
[    1.313038] raid6: neonx8   xor()  1128 MB/s
[    1.313042] raid6: using algorithm neonx8 gen() 1552 MB/s
[    1.313046] raid6: .... xor() 1128 MB/s, rmw enabled
[    1.313049] raid6: using intx1 recovery algorithm
[    1.313895] SCSI subsystem initialized
[    1.314117] usbcore: registered new interface driver usbfs
[    1.314157] usbcore: registered new interface driver hub
[    1.314199] usbcore: registered new device driver usb
[    1.314277] media: Linux media interface: v0.10
[    1.314307] Linux video capture interface: v2.00
[    1.314338] pps_core: LinuxPPS API ver. 1 registered
[    1.314342] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    1.314358] PTP clock support registered
[    1.314388] EDAC MC: Ver: 3.0.0
[    1.314704] FPGA manager framework
[    1.314854] fpga-region fpga-full: FPGA Region probed
[    1.314952] Advanced Linux Sound Architecture Driver Initialized.
[    1.315293] Bluetooth: Core ver 2.22
[    1.315317] NET: Registered protocol family 31
[    1.315322] Bluetooth: HCI device and connection manager initialized
[    1.315332] Bluetooth: HCI socket layer initialized
[    1.315339] Bluetooth: L2CAP socket layer initialized
[    1.315362] Bluetooth: SCO socket layer initialized
[    1.315983] clocksource: Switched to clocksource arch_sys_counter
[    1.316072] VFS: Disk quotas dquot_6.6.0
[    1.316122] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    1.322736] NET: Registered protocol family 2
[    1.323125] TCP established hash table entries: 16384 (order: 5, 131072 bytes)
[    1.323272] TCP bind hash table entries: 16384 (order: 6, 262144 bytes)
[    1.323565] TCP: Hash tables configured (established 16384 bind 16384)
[    1.323636] UDP hash table entries: 1024 (order: 3, 32768 bytes)
[    1.323681] UDP-Lite hash table entries: 1024 (order: 3, 32768 bytes)
[    1.323830] NET: Registered protocol family 1
[    1.324161] RPC: Registered named UNIX socket transport module.
[    1.324166] RPC: Registered udp transport module.
[    1.324170] RPC: Registered tcp transport module.
[    1.324173] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    1.324628] hw perfevents: enabled with armv8_pmuv3 PMU driver, 7 counters available
[    1.325382] futex hash table entries: 1024 (order: 5, 131072 bytes)
[    1.325462] audit: initializing netlink subsys (disabled)
[    1.325490] audit: type=2000 audit(1.320:1): initialized
[    1.325999] workingset: timestamp_bits=62 max_order=19 bucket_order=0
[    1.326732] NFS: Registering the id_resolver key type
[    1.326751] Key type id_resolver registered
[    1.326755] Key type id_legacy registered
[    1.326765] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[    1.326785] jffs2: version 2.2. (NAND) (SUMMARY)  c 2001-2006 Red Hat, Inc.
[    1.331470] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 247)
[    1.331479] io scheduler noop registered
[    1.331483] io scheduler deadline registered
[    1.331494] io scheduler cfq registered (default)
[    1.332738] xilinx-dpdma fd4c0000.dma: Xilinx DPDMA engine is probed
[    1.333032] Write failed gate address:1000f02
[    1.333133] xilinx-zynqmp-dma fd500000.dma: ZynqMP DMA driver Probe success
[    1.333270] xilinx-zynqmp-dma fd510000.dma: ZynqMP DMA driver Probe success
[    1.333406] xilinx-zynqmp-dma fd520000.dma: ZynqMP DMA driver Probe success
[    1.333540] xilinx-zynqmp-dma fd530000.dma: ZynqMP DMA driver Probe success
[    1.333675] xilinx-zynqmp-dma fd540000.dma: ZynqMP DMA driver Probe success
[    1.333810] xilinx-zynqmp-dma fd550000.dma: ZynqMP DMA driver Probe success
[    1.333952] xilinx-zynqmp-dma fd560000.dma: ZynqMP DMA driver Probe success
[    1.334086] xilinx-zynqmp-dma fd570000.dma: ZynqMP DMA driver Probe success
[    1.334293] xilinx-zynqmp-dma ffa80000.dma: ZynqMP DMA driver Probe success
[    1.334432] xilinx-zynqmp-dma ffa90000.dma: ZynqMP DMA driver Probe success
[    1.334568] xilinx-zynqmp-dma ffaa0000.dma: ZynqMP DMA driver Probe success
[    1.334704] xilinx-zynqmp-dma ffab0000.dma: ZynqMP DMA driver Probe success
[    1.334843] xilinx-zynqmp-dma ffac0000.dma: ZynqMP DMA driver Probe success
[    1.334982] xilinx-zynqmp-dma ffad0000.dma: ZynqMP DMA driver Probe success
[    1.335118] xilinx-zynqmp-dma ffae0000.dma: ZynqMP DMA driver Probe success
[    1.335254] xilinx-zynqmp-dma ffaf0000.dma: ZynqMP DMA driver Probe success
[    1.335429] zynqmp_pm firmware: Power management API v0.3
[    1.370301] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[    1.371712] ff000000.serial: ttyPS0 at MMIO 0xff000000 (irq = 40, base_baud = 6249999) is a xuartps
[    2.335166] console [ttyPS0] enabled
[    2.339105] ff010000.serial: ttyPS1 at MMIO 0xff010000 (irq = 41, base_baud = 6249999) is a xuartps
[    2.348282] [drm] Initialized
[    2.351528] [drm] load() is defered & will be called again
[    2.357451] xilinx-drm-dp-sub fd4aa000.dp_sub: Xilinx DisplayPort Subsystem is probed
[    2.365360] Unable to detect cache hierarchy from DT for CPU 0
[    2.376566] brd: module loaded
[    2.382867] loop: module loaded
[    2.386726] ahci-ceva fd0c0000.ahci: ceva,p1-cominit-params property not defined
[    2.394070] ahci-ceva: probe of fd0c0000.ahci failed with error -22
[    2.400411] mtdoops: mtd device (mtddev=name/number) must be supplied
[    2.407620] m25p80 spi0.0: found n25q256a, expected n25q512a
[    2.413326] m25p80 spi0.0: n25q256a (65536 Kbytes)
[    2.418143] 3 ofpart partitions found on MTD device spi0.0
[    2.423549] Creating 3 MTD partitions on "spi0.0":
[    2.428325] 0x000000000000-0x000000100000 : "boot"
[    2.433755] 0x000000100000-0x000000140000 : "bootenv"
[    2.439238] 0x000000140000-0x000001740000 : "kernel"
[    2.445668] libphy: Fixed MDIO Bus: probed
[    2.450916] tun: Universal TUN/TAP device driver, 1.6
[    2.455897] tun: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
[    2.462223] CAN device driver interface
[    2.466529] macb ff0e0000.ethernet: Not enabling partial store and forward
[    2.473858] libphy: MACB_mii_bus: probed
[    2.479542] macb ff0e0000.ethernet eth0: Cadence GEM rev 0x50070106 at 0xff0e0000 irq 30 (f6:f0:f3:80:f8:43)
[    2.489288] TI DP83867 ff0e0000.etherne:09: attached PHY driver [TI DP83867] (mii_bus:phy_addr=ff0e0000.etherne:09, irq=-1)
[    2.500887] usbcore: registered new interface driver asix
[    2.506244] usbcore: registered new interface driver ax88179_178a
[    2.512305] usbcore: registered new interface driver cdc_ether
[    2.518117] usbcore: registered new interface driver net1080
[    2.523758] usbcore: registered new interface driver cdc_subset
[    2.529661] usbcore: registered new interface driver zaurus
[    2.535234] usbcore: registered new interface driver cdc_ncm
[    2.541421] usbcore: registered new interface driver uas
[    2.546688] usbcore: registered new interface driver usb-storage
[    2.552955] mousedev: PS/2 mouse device common for all mice
[    2.558874] rtc_zynqmp ffa60000.rtc: rtc core: registered ffa60000.rtc as rtc0
[    2.566045] i2c /dev entries driver
[    2.569704] cdns-i2c ff030000.i2c: 400 kHz mmio ff030000 irq 32
[    2.576565] usbcore: registered new interface driver uvcvideo
[    2.582228] USB Video Class driver (1.1.1)
[    2.586841] cdns-wdt fd4d0000.watchdog: Xilinx Watchdog Timer at ffffff8008ee9000 with timeout 10s
[    2.595890] Bluetooth: HCI UART driver ver 2.3
[    2.600250] Bluetooth: HCI UART protocol H4 registered
[    2.605372] Bluetooth: HCI UART protocol BCSP registered
[    2.610663] Bluetooth: HCI UART protocol LL registered
[    2.615783] Bluetooth: HCI UART protocol ATH3K registered
[    2.621166] Bluetooth: HCI UART protocol Three-wire (H5) registered
[    2.627454] Bluetooth: HCI UART protocol Intel registered
[    2.632834] Bluetooth: HCI UART protocol Broadcom registered
[    2.638440] Bluetooth: HCI UART protocol QCA registered
[    2.643687] usbcore: registered new interface driver bcm203x
[    2.649323] usbcore: registered new interface driver bpa10x
[    2.654877] usbcore: registered new interface driver bfusb
[    2.660347] usbcore: registered new interface driver btusb
[    2.665782] Bluetooth: Generic Bluetooth SDIO driver ver 0.1
[    2.671479] usbcore: registered new interface driver ath3k
[    2.677021] EDAC MC: ECC not enabled
[    2.680681] EDAC DEVICE0: Giving out device to module zynqmp-ocm-edac controller zynqmp_ocm: DEV ff960000.memory-controller (INTERRUPT)
[    2.693297] cpufreq: cpufreq_online: CPU0: Running at unlisted freq: 1099999 KHz
[    2.700666] cpufreq: cpufreq_online: CPU0: Unlisted initial frequency changed to: 1199999 KHz
[    2.709530] sdhci: Secure Digital Host Controller Interface driver
[    2.715623] sdhci: Copyright(c) Pierre Ossman
[    2.719962] sdhci-pltfm: SDHCI platform and OF driver helper
[    2.726078] ledtrig-cpu: registered to indicate activity on CPUs
[    2.732135] usbcore: registered new interface driver usbhid
[    2.737634] usbhid: USB HID core driver
[    2.743191] fpga_manager fpga0: Xilinx ZynqMP FPGA Manager registered
[    2.750213] pktgen: Packet Generator for packet performance testing. Version: 2.75
[    2.757896] Netfilter messages via NETLINK v0.30.
[    2.762637] ip_tables: (C) 2000-2006 Netfilter Core Team
[    2.767910] Initializing XFRM netlink socket
[    2.772165] NET: Registered protocol family 10
[    2.777018] ip6_tables: (C) 2000-2006 Netfilter Core Team
[    2.782375] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[    2.788632] NET: Registered protocol family 17
[    2.793001] NET: Registered protocol family 15
[    2.797427] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[    2.810348] Ebtables v2.0 registered
[    2.813958] can: controller area network core (rev 20120528 abi 9)
[    2.820107] NET: Registered protocol family 29
[    2.824503] can: raw protocol (rev 20120528)
[    2.828752] can: broadcast manager protocol (rev 20161123 t)
[    2.834396] can: netlink gateway (rev 20130117) max_hops=1
[    2.839922] Bluetooth: RFCOMM TTY layer initialized
[    2.844731] Bluetooth: RFCOMM socket layer initialized
[    2.849851] Bluetooth: RFCOMM ver 1.11
[    2.853580] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[    2.858870] Bluetooth: BNEP filters: protocol multicast
[    2.864084] Bluetooth: BNEP socket layer initialized
[    2.869027] Bluetooth: HIDP (Human Interface Emulation) ver 1.2
[    2.874931] Bluetooth: HIDP socket layer initialized
[    2.880040] 9pnet: Installing 9P2000 support
[    2.884239] Key type dns_resolver registered
[    2.888938] registered taskstats version 1
[    2.893373] Btrfs loaded, crc32c=crc32c-generic
[    2.908659] [drm] load() is defered & will be called again
[    2.914768] xilinx-psgtr fd400000.zynqmp_phy: Lane:3 type:8 protocol:4 pll_locked:yes
[    2.922820] xilinx-drm-dp fd4a0000.dp: device found, version 4.010
[    2.928916] xilinx-drm-dp fd4a0000.dp: Display Port, version 1.0200 (tx)
[    2.936509] xhci-hcd xhci-hcd.0.auto: xHCI Host Controller
[    2.941929] xhci-hcd xhci-hcd.0.auto: new USB bus registered, assigned bus number 1
[    2.949794] xhci-hcd xhci-hcd.0.auto: hcc params 0x0238f625 hci version 0x100 quirks 0x02010010
[    2.958432] xhci-hcd xhci-hcd.0.auto: irq 220, io mem 0xfe200000
[    2.964527] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[    2.971231] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    2.978432] usb usb1: Product: xHCI Host Controller
[    2.983291] usb usb1: Manufacturer: Linux 4.9.0-xlnx-v2017.3-zynqmp-fpga xhci-hcd
[    2.990756] usb usb1: SerialNumber: xhci-hcd.0.auto
[    2.995936] hub 1-0:1.0: USB hub found
[    2.999623] hub 1-0:1.0: 1 port detected
[    3.003683] xhci-hcd xhci-hcd.0.auto: xHCI Host Controller
[    3.009088] xhci-hcd xhci-hcd.0.auto: new USB bus registered, assigned bus number 2
[    3.016769] usb usb2: We don't know the algorithms for LPM for this host, disabling LPM.
[    3.024872] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003
[    3.031573] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    3.038775] usb usb2: Product: xHCI Host Controller
[    3.043635] usb usb2: Manufacturer: Linux 4.9.0-xlnx-v2017.3-zynqmp-fpga xhci-hcd
[    3.051100] usb usb2: SerialNumber: xhci-hcd.0.auto
[    3.056243] hub 2-0:1.0: USB hub found
[    3.059922] hub 2-0:1.0: 1 port detected
[    3.111992] mmc0: SDHCI controller on ff160000.sdhci [ff160000.sdhci] using ADMA 64-bit
[    3.171994] mmc1: SDHCI controller on ff170000.sdhci [ff170000.sdhci] using ADMA 64-bit
[    3.180590] OF: graph: no port node found in /xilinx_drm
[    3.185820] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[    3.192412] [drm] No driver support for vblank timestamp query.
[    3.240883] mmc0: new HS200 MMC card at address 0001
[    3.246046] mmcblk0: mmc0:0001 Q2J55L 7.09 GiB
[    3.250620] mmcblk0boot0: mmc0:0001 Q2J55L partition 1 16.0 MiB
[    3.256581] mmcblk0boot1: mmc0:0001 Q2J55L partition 2 16.0 MiB
[    3.262544] mmcblk0rpmb: mmc0:0001 Q2J55L partition 3 4.00 MiB
[    3.269116]  mmcblk0: p1
[    3.282882] mmc1: new high speed SDHC card at address 59b4
[    3.288506] mmcblk1: mmc1:59b4 USDU1 7.31 GiB
[    3.293595]  mmcblk1: p1 p2
[    3.335061] random: fast init done
[    7.353304] xilinx-drm xilinx_drm: No connectors reported connected with modes
[    7.360450] [drm] Cannot find any crtc or sizes - going 1024x768
[    7.373197] Console: switching to colour frame buffer device 128x48
[    7.384446] xilinx-drm xilinx_drm: fb0:  frame buffer device
[    7.403991] [drm] Initialized xilinx_drm 1.0.0 20130509 on minor 0
[    7.410365] rtc_zynqmp ffa60000.rtc: setting system clock to 2018-01-24 07:53:12 UTC (1516780392)
[    7.419159] of_cfs_init
[    7.421600] of_cfs_init: OK
[    7.425176] ALSA device list:
[    7.428061]   No soundcards found.
[    7.432899] EXT4-fs (mmcblk1p2): couldn't mount as ext3 due to feature incompatibilities
[    7.454275] EXT4-fs (mmcblk1p2): mounted filesystem with ordered data mode. Opts: (null)
[    7.462308] VFS: Mounted root (ext4 filesystem) on device 179:34.
[    7.477456] devtmpfs: mounted
[    7.480559] Freeing unused kernel memory: 512K (ffffffc000bf0000 - ffffffc000c70000)
[    7.882410] systemd[1]: systemd 232 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
[    7.900592] systemd[1]: Detected architecture arm64.

Welcome to Debian GNU/Linux 9 (stretch)!

[    7.924838] systemd[1]: Set hostname to <debian-fpga>.
[    8.208607] systemd[1]: Listening on Syslog Socket.
[  OK  ] Listening on Syslog Socket.
[    8.224131] systemd[1]: Listening on udev Kernel Socket.
[  OK  ] Listening on udev Kernel Socket.
[    8.240049] systemd[1]: Reached target Remote File Systems.
[  OK  ] Reached target Remote File Systems.
[    8.256129] systemd[1]: Listening on Journal Socket.
[  OK  ] Listening on Journal Socket.
[    8.272161] systemd[1]: Started Dispatch Password Requests to Console Directory Watch.
[  OK  ] Started Dispatch Password Requests to Console Directory Watch.
[    8.296113] systemd[1]: Listening on /dev/initctl Compatibility Named Pipe.
[  OK  ] Listening on /dev/initctl Compatibility Named Pipe.
[    8.320054] systemd[1]: Reached target Swap.
[  OK  ] Reached target Swap.
[  OK  ] Listening on Journal Audit Socket.
[  OK  ] Listening on udev Control Socket.
[  OK  ] Listening on Journal Socket (/dev/log).
[  OK  ] Created slice System Slice.
         Mounting POSIX Message Queue File System...
         Starting Nameserver information manager...
[  OK  ] Created slice system-serial\x2dgetty.slice.
[  OK  ] Created slice system-getty.slice.
         Starting Remount Root and Kernel File Systems...
         Starting Load Kernel Modules...
         Starting Journal Service...
[  OK  ] Created slice User and Session Slice.
[  OK  ] Reached target Slices.
         Mounting Debug File System...
         Starting Create Static Device Nodes in /dev...
[  OK  ] Started Forward Password Requests to Wall Directory Watch.
[  OK  ] Reached target Encrypted Volumes.
[  OK  ] Reached target Paths.
[  OK  ] Mounted POSIX Message Queue File System.
[  OK  ] Mounted Debug File System.
[  OK  ] Started Journal Service.
[  OK  ] Started Remount Root and Kernel File Systems.
[  OK  ] Started Load Kernel Modules.
[  OK  ] Started Create Static Device Nodes in /dev.
[  OK  ] Started Nameserver information manager.
         Starting udev Kernel Device Manager...
         Starting Apply Kernel Variables...
         Mounting Configuration File System...
         Starting udev Coldplug all Devices...
[  OK  ] Reached target Local File Systems (Pre).
         Mounting /config...
         Starting Load/Save Random Seed...
         Starting Flush Journal to Persistent Storage...
[  OK  ] Mounted Configuration File System.
[  OK  ] Mounted /config.
[  OK  ] Started Apply Kernel Variables.
[  OK  ] Started Load/Save Random Seed.
[    8.886266] systemd-journald[1597]: Received request to flush runtime journal from PID 1
[  OK  ] Started udev Kernel Device Manager.
[  OK  ] Started Flush Journal to Persistent Storage.
[  OK  ] Started udev Coldplug all Devices.
[  OK  ] Found device /dev/ttyPS0.
[  OK  ] Listening on Load/Save RF Kill Switch Status /dev/rfkill Watch.
[    9.366280] random: crng init done
[  OK  ] Found device /dev/mmcblk1p1.
         Mounting /boot...
[  OK  ] Mounted /boot.
[  OK  ] Reached target Local File Systems.
         Starting Raise network interfaces...
[  OK  ] Started ifup for eth0.
         Starting Create Volatile Files and Directories...
[  OK  ] Started Create Volatile Files and Directories.
         Starting Update UTMP about System Boot/Shutdown...
[  OK  ] Reached target System Time Synchronized.
[  OK  ] Started Update UTMP about System Boot/Shutdown.
[  OK  ] Reached target System Initialization.
[  OK  ] Listening on Avahi mDNS/DNS-SD Stack Activation Socket.
[  OK  ] Started Daily apt download activities.
[  OK  ] Started Daily Cleanup of Temporary Directories.
[  OK  ] Started Daily apt upgrade and clean activities.
[  OK  ] Reached target Timers.
[  OK  ] Listening on D-Bus System Message Bus Socket.
[  OK  ] Reached target Sockets.
[  OK  ] Reached target Basic System.
[   10.090628] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
         Starting FPGA Clock Service....
         Starting User space mappable DMA Buffer Service....
[   10.116686] fclkcfg: loading out-of-tree module taints kernel.
         Starting Avahi mDNS/DNS-SD Stack...
[  OK  ] Started D-Bus System Message Bus.
[  OK  ] Started Avahi mDNS/DNS-SD Stack.
         Starting System Logging Service...
[  OK  ] Started Regular background program processing daemon.
         Starting Login Service...
[  OK  ] Started FPGA Clock Service..
[  OK  ] Started User space mappable DMA Buffer Service..
[  OK  ] Started System Logging Service.
[  OK  ] Started Login Service.
[  OK  ] Started Raise network interfaces.
[  OK  ] Reached target Network.
         Starting Permit User Sessions...
         Starting OpenBSD Secure Shell server...
[  OK  ] Reached target Network is Online.
         Starting Samba NMB Daemon...
         Starting LSB: Start NTP daemon...
[  OK  ] Started Permit User Sessions.
[  OK  ] Started Getty on tty1.
[  OK  ] Started Serial Getty on ttyPS0.
[  OK  ] Reached target Login Prompts.
[  OK  ] Started OpenBSD Secure Shell server.
[  OK  ] Started LSB: Start NTP daemon.
[   11.108309] macb ff0e0000.ethernet eth0: link up (1000/Full)
[   11.113950] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

Debian GNU/Linux 9 debian-fpga ttyPS0

debian-fpga login:

  1. 2018年01月24日 21:09 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

arm のLinuxでGUI の文字が豆腐状態になってしまったときの対処方法

UltraZed-EG Starter Kit の Debian Linux についてブログでやっているが、Xming を立ち上げて、Xウインドをパソコン上に持ってきてUltraZed-EG Starter Kit の Debian Linux 上のGUI アプリケーションソフトを操作している。その際にロケールを日本語にしていると、文字が豆腐状態になってしまうときがある。その時の対処方法を書いておく。

ここを参考にして、ikwzm さんに教えて頂いた xbase-clients と xterm をインストールした。
sudo apt-get install xbase-clients xterm

そして、
sudo apt-get install gnome-commander
でファイル・マネージャーのグノーム・コマンダーをインストールしたのだが、文字が豆腐になってしまった。

検索してみるとロケールを日本語にしているのに、日本語フォントが入っていないのが問題ということだった。
対処方法として、梅フォントをインストールした。
sudo apt-get install fonts-vlgothic
sudo apt-get install fonts-horai-umefont
sudo apt-get install fonts-umeplus


gnome-commander でグノーム・コマンダーを立ち上げると、日本語のフォントが表示された。
UltraZed-EG_StKit_Linux_166_180126.png

  1. 2018年01月24日 05:06 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

arm のDebian でsudo をする時に「ホスト…の名前解決ができません」といわれたときの対処方法

UltraZed-EG Starter Kit の Debian Linux についてブログでやっているが、sudo をすると「sudo: ホスト debian-fpga の名前解決ができません」と言われてしまう。その対処方法を書いておく。

検索してみると、Ubuntu の日本語フォーラムに「sudo つかうと「sudo ホストの名前解決ができません」と表示が出ます。」という記事があった。
その記事の一部を引用する。

ホスト名の変更はどのようにされましたか。
/etc/hostname ファイルと /etc/hosts ファイルの二箇所にホスト名が書いてあります。
両方とも変更して、そのあと再起動すれば直ると思います。(再起動は /etc/hostname の変更を反映させるため)


なるほど、/etc/hostname ファイルと /etc/hosts ファイルを見てみればよいとのことなので、UltraZed-EG Starter Kit の Debian Linux で見ると、/etc/hostname には、”debian-fpga”が書いてあるが、/etc/hosts には書いていない。
UltraZed-EG_StKit_Linux_163_180126.png

そこで、
sudo vi /etc/hosts
で debian-fpga を書き加える。でも、書き方が分からない。
そこで、”sudo すると名前解決が出来ませんとエラーが発生”を見ると書き方が分かったので書いた。

127.0.1.1 debian-fpga


UltraZed-EG_StKit_Linux_164_180126.png

/etc/hosts をセーブすると、sudo をしたときに、「sudo: ホスト debian-fpga の名前解決ができません」というメッセージは消えた。良かった。。。
  1. 2018年01月24日 04:48 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる9(実機で試す)

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる8(Debian9 Root File Systemの構築2)”の続き。

前回は、Debian9 Root File Systemの構築が終了した。今までビルドしてきたソフトウェアやRoot FSを使用して、UltraZed-EG Starter Kit で確かめてみようと思う。

参考にするのは、”UltraZed 向け Debian GNU/Linux ブートイメージの提供

まずは、Class 10 のMicroSDカードを用意して、SDFormatter でフォーマットを行った。この辺りのことは、””FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)”を試してみる2(Micro SDカードの準備)

”FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)”を試してみる2(Micro SDカードの準備)”を参考にして、MicroSDカードをフォーマットしたが、第2パーティションを ext4 でフォーマットした。また、第1パーティションの名前はULTRAZED-EG で第2パーティションの名前はROOT_FS にした。

ROOT_FS に debian9-rootfs-vanilla.tgz を解凍してコピーした。
sudo tar xfz debian9-rootfs-vanilla.tgz -C /media/ono/ROOT_FS/
UltraZed-EG_StKit_Linux_139_180123.png

ROOT_FS の内容を示す。
UltraZed-EG_StKit_Linux_140_180123.png

ROOT_FS の /home/fpga/debian ディレクトリにコピーする
cp fclkcfg-4.9.0-xlnx-v2017.3-zynqmp-fpga_0.0.1-1_arm64.deb /media/ono/ROOT_FS/home/fpga/debian
cp udmabuf-4.9.0-xlnx-v2017.3-zynqmp-fpga_0.0.1-1_arm64.deb /media/ono/ROOT_FS/home/fpga/debian

UltraZed-EG_StKit_Linux_141_180126.png

cp linux-image-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-1_arm64.deb /media/ono/ROOT_FS/home/fpga/debian
cp linux-headers-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-1_arm64.deb /media/ono/ROOT_FS/home/fpga/debian

UltraZed-EG_StKit_Linux_141_2_180126.png

/media/ono/ROOT_FS/home/fpga/debian を示す。
UltraZed-EG_StKit_Linux_142_180126.png

ULTRAZED-EG フォルダへコピー
~/ZynqMP-FPGA-Linux/target/UltraZed-EG-IOCC/boot ディレクトリの以下のファイルを共有ドライブ経由でWindows 10 上でMicroSDカードのULTRAZED-EG フォルダにコピーした。

devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dtb
devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dts
image-4.9.0-xlnx-v2017.3-fpga
uEnv.txt


UltraZed-EG_StKit_Linux_143_180126.png

Windows 10 上でMicroSDカードのULTRAZED-EG フォルダを示す。
UltraZed-EG_StKit_Linux_144_180126.png

BOOT.bin を生成する。
@ikwzm さんの”UltraZed 向け Debian GNU/Linux の構築(BOOT.BIN編)”の”BOOT.BIN を作るための設定ファイル”の boot.bif と同じ設定になるようにして、同じ設定になるようにBOOT.bin を生成した。
@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる2(Sample FPGA Design編)”で作ったVivado 2017.4 の uzed-eg-ex1_174 プロジェクトから、
起動したSDK で作成した zynqmp_fsbl.elf とzynqmp_pmufw.elf (”@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる3(FSBLとPMUFWを作る)”参照)と、
@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる4(BL31を作る)”で作った bl31.elf 、
@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる4(U-Bootを作る)”で作った u-boot.elf を使用して、SDKで BOOT.bin を作成しよう。

SDK の zynqmp_fsbl アプリケーション・プロジェクトを右クリックし、右クリックメニューから Create Boot Image を選択する。

Create Boot Image ダイアログが表示された。
ビットファイルをDelete する。
Add ボタンをクリックして、出てきたEdit the boot image partition ダイアログで、File Path のBrowse... ボタンをクリックして、zynqmp_pmufw.elf を選択し、Partition type を pmu (loaded by bootro に変更した。
UltraZed-EG_StKit_Linux_148_180126.png

Create Boot Image ダイアログで Add ボタンをクリックし、Edit the boot image partition ダイアログで、File Path のBrowse... ボタンをクリックして、bl31.elf を選択し、Partition type をデフォルトの datafile にした。Advanced の Exception Level を EL3 にした。また、Enable Trust Zone にチェックを入れた。
UltraZed-EG_StKit_Linux_149_180126.png

最後にもう一度、Create Boot Image ダイアログで Add ボタンをクリックし、Edit the boot image partition ダイアログで、File Path のBrowse... ボタンをクリックして、u-boot.elf を選択し、Partition type をデフォルトの datafile にした。Advanced の Exception Level を EL3 にした。
UltraZed-EG_StKit_Linux_150_180126.png

Create Boot Image ダイアログに戻った。Create Boot Image ボタンをクリックして、BOOT.bin を生成する。
UltraZed-EG_StKit_Linux_146_180126.png

出来上がった BOOT.bin を Windows 10 上の MicroSDカードの ULTRAZED-EG フォルダにコピーする。
UltraZed-EG_StKit_Linux_147_180126.png

これでMicroSDカードが出来上がったので、UltraZed-EG Starter Kit の MicroSD カード・スロットにさして電源をON した。
MicroB USB ケーブルでUltraZed-EG Starter Kit と パソコンを接続する。これは、FPGAのコンフィギュレーションとUARTの機能がある。UARTの機能を使用して、Tera Term をシリアル・インターフェースにして接続した。
そうしたところ、無事にDebian が立ち上がった。
UltraZed-EG_StKit_Linux_151_180126.png
  1. 2018年01月23日 21:58 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる8(Debian9 Root File Systemの構築2)

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる7(Debian9 Root File Systemの構築1)”の続き。

前回は、Debian9 Root File Systemの構築を途中までやったので、今回はその続きをやってみる。

hostname とパスワードの設定
echo "debian-fpga" > /etc/hostname
passwd
cat <<EOT >> /etc/securetty
# Seral Port for Xilinx Zynq
ttyPS0
EOT

UltraZed-EG_Linux_113_170121.png

adduser fpga
パスワードも fpga にした。
UltraZed-EG_Linux_115_170121.png

echo "fpga ALL=(ALL:ALL) ALL" > /etc/sudoers.d/fpga
sed -i -e 's/#PasswordAuthentication/PasswordAuthentication/g' /etc/ssh/sshd_config

sshd のコンフィグ
UltraZed-EG_Linux_116_170121.png

タイムゾーンの設定
dpkg-reconfigure tzdata
UltraZed-EG_Linux_117_170121.png

Configuring tzdata ダイアログが表示された。Asia を選択して、OKをクリックした。
UltraZed-EG_Linux_118_170121.png

次の画面で、Tokyo を選択して、OKをクリックした。
UltraZed-EG_Linux_119_170121.png

タイムゾーンの設定が終了した。Local time is now が JST になっているのが分かる。
UltraZed-EG_Linux_120_170121.png

cat <<EOT > /etc/fstab
/dev/mmcblk1p1    /boot    auto        defaults    0    0
none        /config    configfs    defaults    0    0
EOT
cat < /etc/network/interfaces.d/eth0
allow-hotplug eth0
iface eth0 inet dhcp
EOT
mkdir /lib/firmware

UltraZed-EG_Linux_122_170121.png

ワイヤレスツールとファームウェア
apt-get install -y wireless-tools
apt-get install -y wpasupplicant
apt-get install -y firmware-realtek
apt-get install -y firmware-ralink

UltraZed-EG_Linux_123_170121.png

開発ツールのインストール
apt-get install -y build-essential
apt-get install -y git
apt-get install -y u-boot-tools
apt-get install -y socat
apt-get install -y ruby ruby-msgpack ruby-serialport
gem install rake

UltraZed-EG_Linux_124_170121.png

Python のインストール
apt-get install -y python python-dev python-setuptools python-wheel python-pip
apt-get install -y python3 python3-dev python3-setuptools python3-wheel python3-pip
apt-get install -y python-numpy python3-numpy
pip3 install msgpack-rpc-python

UltraZed-EG_Linux_125_170121.png

デバイスツリー・コンパイラのビルドとインストール
apt-get install -y flex bison
UltraZed-EG_Linux_126_170121.png

cd root
mkdir src
cd src
git clone https://git.kernel.org/pub/scm/utils/dtc/dtc.git dtc

ここで、git がインストールしていないとエラーが発生
apt-get install git
UltraZed-EG_Linux_127_170121.png

もう一度、
git clone https://git.kernel.org/pub/scm/utils/dtc/dtc.git dtc
cd dtc

UltraZed-EG_Linux_129_170121.png

make
UltraZed-EG_Linux_130_170121.png

make HOME=/usr/local install-bin
cd /

UltraZed-EG_Linux_131_170121.png

samba などをインストール
apt-get install -y avahi-daemon
apt-get install -y samba

UltraZed-EG_Linux_132_170121.png

Linux モジュールのインストール
mv boot boot.org
mkdir boot
dpkg -i linux-image-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-1_arm64.deb

UltraZed-EG_Linux_133_170121.png

dpkg -i linux-headers-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-1_arm64.deb
rm boot/*
rmdir boot
mv boot.org boot
apt-get clean

APT Cache に大量にダウンロードしたパッケージがキャッシュされているそうなので、clean する。
UltraZed-EG_Linux_134_170121.png

これで、build-debian9-rootfs-with-qemu.sh のスクリプトは終わり。

ルート・ディレクトリを~/ZynqMP-FPGA-Linux/debian9-rootfs ディレクトリから元に戻して、不要なファイルを消去
exit
sudo rm -f $targetdir/usr/bin/qemu-aarch64-static
sudo rm -f $targetdir/build-debian9-rootfs-with-qemu.sh
sudo rm -f $targetdir/linux-image-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-1_arm64.deb
sudo rm -f $targetdir/linux-headers-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-1_arm64.deb

UltraZed-EG_Linux_135_170121.png

~/ZynqMP-FPGA-Linux/debian9-rootfs ディレクトリの現在の内容を示す。
UltraZed-EG_Linux_136_170121.png

構築したルート・ファイル・システムを圧縮して、debian9-rootfs-vanilla.tgz を作成する
cd $targetdir
sudo tar cfz ../debian9-rootfs-vanilla.tgz *

UltraZed-EG_Linux_137_170121.png

~/ZynqMP-FPGA-Linux ディレクトリに debian0-rootfs-vanilla.tgz が生成された。
UltraZed-EG_Linux_138_170122.png
  1. 2018年01月22日 04:59 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる7(Debian9 Root File Systemの構築1)

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる6(最新のdtc をビルド)”の続き。

前回は、最新の dtc をビルドして、もう一度、dtb を逆コンパイルした。今回は、Debian9 Root File Systemの構築をやってみよう。

参考というか丸写しするのは、”UltraZed 向け Debian GNU/Linux の構築(Debian9 Root File System編)”だ。
本当に出てくるコマンドを調べるだけでも勉強になる。。。ありがたいことだ。。。

UltraZed 向け Debian GNU/Linux の構築(Debian9 Root File System編)”を参考にするのだが、途中から build-debian9-rootfs-with-qemu.sh を見ながらやってみる。

環境を整えるためのパッケージのインストール
apt-get install qemu-user-static debootstrap binfmt-support
UltraZed-EG_Linux_94_170121.png

環境変数の設定
export targetdir=debian9-rootfs
export distro=stretch

UltraZed-EG_Linux_95_170121.png

arm 64 アーキテクチャのルート・ファイル・システムを debootstrap --arch=arm64 --foreign で作ることができる。”Debian/debootstrap
mkdir $targetdir
sudo debootstrap --arch=arm64 --foreign $distro $targetdir

UltraZed-EG_Linux_96_170121.png

UltraZed-EG_Linux_97_170121.png

~/ZynqMP-FPGA-Linux/debian9-rootfs ディレクトリにディレクトリができていた。
UltraZed-EG_Linux_98_170121.png

ファイルをコピー
ちょっとミスってしまった。
sudo cp /usr/bin/qemu-aarch64-static $targetdir/usr/bin
sudo cp /etc/resolv.conf $targetdir/etc
sudo cp scripts/build-debian9-rootfs-with-qemu.sh $targetdir
sudo cp linux-image-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-1_arm64.deb $targetdir
sudo cp linux-headers-4.9.0-xlnx-v2017.3-zynqmp-fpga_4.9.0-xlnx-v2017.3-zynqmp-fpga-1_arm64.deb $targetdir

UltraZed-EG_Linux_99_170121.png

~/ZynqMP-FPGA-Linux/debian9-rootfs ディレクトリ
UltraZed-EG_Linux_100_170121.png

ルート・ディレクトリを~/ZynqMP-FPGA-Linux/debian9-rootfs ディレクトリに変更する
sudo chroot $targetdir
ls

UltraZed-EG_Linux_101_170121.png

ブートストラップ処理の完了
distro=stretch
export LANG=C
/debootstrap/debootstrap --second-stage

UltraZed-EG_Linux_121_170121.png

ファイルの生成
cat << EOT ..... EOT についての解説ページ
cat < /etc/apt/sources.list
deb http://ftp.jp.debian.org/debian stretch main contrib non-free
deb-src http://ftp.jp.debian.org/debian stretch main contrib non-free
deb http://ftp.jp.debian.org/debian stretch-updates main contrib non-free
deb-src http://ftp.jp.debian.org/debian stretch-updates main contrib non-free
deb http://security.debian.org/debian-security stretch/updates main contrib non-free
deb-src http://security.debian.org/debian-security stretch/updates main contrib non-free
EOT

UltraZed-EG_Linux_102_170121.png

cat < /etc/apt/apt.conf.d/71-no-recommends
APT::Install-Recommends "0";
APT::Install-Suggests "0";
EOT

UltraZed-EG_Linux_103_170121.png

apt-get update -y
UltraZed-EG_Linux_104_170121.png

apt-get update -y
UltraZed-EG_Linux_104_170121.png

UltraZed-EG_Linux_105_170121.png

基本的なアプリケーションのインストール
apt-get install -y locales dialog
UltraZed-EG_Linux_106_170121.png

dpkg-reconfigure locales
UltraZed-EG_Linux_107_170121.png

dpkg-reconfigure locales コマンドを実行するとPackage Configuration の Configuring locals 画面が立ち上がった。
ja_JP.UTF-8 UTF-8 でスペースキーを押して * を付けて、OK をクリックする。
UltraZed-EG_Linux_108_170121.png

次に画面で、ja_JP.UTF-8 を選択して、OK をクリックした。
UltraZed-EG_Linux_109_170121.png

Package Configuration の Configuring locals 画面が終了した。
UltraZed-EG_Linux_110_170121.png

パッケージのインストール
apt-get install -y net-tools openssh-server ntpdate resolvconf sudo less hwinfo ntp tcsh zsh
UltraZed-EG_Linux_111_170121.png

UltraZed-EG_Linux_112_170121.png

  1. 2018年01月21日 17:54 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる6(最新のdtc をビルド)

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる5(Linux カーネルを作る)”の続き。

前回は、Linux カーネルをビルドしたが、dtc のバージョンが古いため --symbols オプションが使用できなかった。今回は、 --symbols オプションが使用できる最新の dtc をビルドする。

@ikwzm さんの”UltraZed 向け Debian GNU/Linux の構築(Linux Kernel編)”にも記事が追加されたが、”デバイスツリーにシンボル情報を埋め込む”の”Device Tree Compiler 1.4.4 のビルド”に最新のDevice Tree Compiler のビルド方法が書いてある。ちなみに私がビルドした dtc のバージョンは 1.4.6 だった。

さて、”Device Tree Compiler 1.4.4 のビルド”の通りにやってみる。

~/ZynqMP-FPGA-Linux ディレクトリにDevice Tree Compiler のソースコードを git clone しよう。
git clone https://git.kernel.org/pub/scm/utils/dtc/dtc.git
ls -l dtc

UltraZed-EG_Linux_83_170120.png

Device Tree Compiler のビルド
cd dtc
ls
make

UltraZed-EG_Linux_84_170120.png

UltraZed-EG_Linux_85_170120.png

flex と bison がインストールしてなかったので、エラーが出てしまった。

flex と bison をインストール
sudo apt install flex bison
UltraZed-EG_Linux_86_170120.png

UltraZed-EG_Linux_87_170120.png

もう一度
make
UltraZed-EG_Linux_88_170120.png

今度は成功。

/usr/local/bin に dtc をインストールし、インストールできたことを確認
sudo make HOME=/usr/local install-bin
ls -l /usr/local/bin/dtc

UltraZed-EG_Linux_89_170120.png

dtc のバージョンを確認
dtc --version
UltraZed-EG_Linux_90_170120.png

dtc のバージョンは 1.4.6 だった。

これで dtc は最新になったので、”@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる5(Linux カーネルを作る)”に戻って、dtc をやってみよう。
  1. 2018年01月20日 05:37 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる5(Linux カーネルを作る)

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる4(U-Bootを作る)”の続き。

前回は、U-Boot を作った。今回はLinux カーネルを作ってみよう。

参考にするのは、
UltraZed 向け Debian GNU/Linux の構築(Linux Kernel編)

~/ZynqMP-FPGA-Linux ディレクトリに移動して、Xilinx が提供してる linux-xlnx を git clone する。
cd ~/ZynqMP-FPGA-Linux
git clone https://github.com/Xilinx/linux-xlnx.git linux-xlnx-v2017.3-zynqmp-fpga
ls

UltraZed-EG_Linux_72_170118.png

xilinx-v2017.3 をチェックアウト
cd linux-xlnx-v2017.3-zynqmp-fpga
ls
git checkout -b linux-xlnx-v2017.3-zynqmp-fpga refs/tags/xilinx-v2017.3

UltraZed-EG_Linux_73_170118.png

ZynqMP 用のファイルを追加してコミット
patch -p0 < ../files/linux-xlnx-v2017.3-zynqmp-fpga.diff
git add --update
git add arch/arm64/boot/dts/xilinx/zynqmp-uz3eg-iocc.dts
git commit -m "[patch] for linux-xlnx-v2017.3-zynqmp-fpga."

コマンド入力をミスってしまった。
UltraZed-EG_Linux_74_170118.png

Debian Package を作る際の問題を修正
patch -p0 < ../files/linux-xlnx-v2017.3-builddeb.diff
git add --update
git commit -m "[fix] build wrong architecture debian package when ARCH=arm64 and cross compile."

UltraZed-EG_Linux_75_170118.png

タグとバージョン番号の設定
git tag -a xilinx-v2017.3-zynqmp-fpga -m "release xilinx-v2017.3-zynqmp-fpga"
echo 0 > .version

UltraZed-EG_Linux_76_170118.png

構築の準備
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make xilinx_zynqmp_defconfig

UltraZed-EG_Linux_77_170118.png

カーネルと Debian パッケージの構築
export DTC_FLAGS=--symbols
make deb-pkg

UltraZed-EG_Linux_78_170118.png

カーネル・ビルド終了
UltraZed-EG_Linux_79_170118.png

arch/arm64/boot/Image ができた。
UltraZed-EG_Linux_80_170118.png

arch/arm64/boot/dts/xilinx/zynqmp-uz3eg-iocc.dtb ができた。
UltraZed-EG_Linux_81_170118.png

構築したカーネルのイメージとデバイスツリーを target/UltraZed-EG-IOCC/boot にコピー
cp arch/arm64/boot/Image ../target/UltraZed-EG-IOCC/boot/image-4.9.0-xlnx-v2017.3-fpga
cp arch/arm64/boot/dts/xilinx/zynqmp-uz3eg-iocc.dtb ../target/UltraZed-EG-IOCC/boot/devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dtb
dtc -I dtb -O dts --symbols -o ../target/UltraZed-EG-IOCC/boot/devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dts ../target/UltraZed-EG-IOCC/boot/devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dtb

UltraZed-EG_Linux_82_170118.png

最後の dtc でエラーが出ている。”--symbols”というオプションは無いそうだ。

(2018/01/20 :追記)
@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる6(最新のdtc をビルド)”で最新の dtc をインストールすることができたので、dtc をもう一度やってみよう。

dtc -I dtb -O dts --symbols -o ../target/UltraZed-EG-IOCC/boot/devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dts ../target/UltraZed-EG-IOCC/boot/devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dtb

UltraZed-EG_Linux_91_170120.png

UltraZed-EG_Linux_92_170120.png

ワーニングは出たが、dts は逆コンパイルできたようだ。
UltraZed-EG_Linux_93_170120.png

ワーニング・メッセージを示す。

../target/UltraZed-EG-IOCC/boot/devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dts: Warning (unit_address_vs_reg): Node /memory has a reg or ranges property, but no unit name
../target/UltraZed-EG-IOCC/boot/devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dts: Warning (unit_address_vs_reg): Node /amba_pl@0 has a unit name, but no reg property
../target/UltraZed-EG-IOCC/boot/devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dts: Warning (unit_address_format): Node /amba/spi@ff0f0000/flash@0/partition@0x00000000 unit name should not have leading "0x"
../target/UltraZed-EG-IOCC/boot/devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dts: Warning (unit_address_format): Node /amba/spi@ff0f0000/flash@0/partition@0x00000000 unit name should not have leading 0s
../target/UltraZed-EG-IOCC/boot/devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dts: Warning (unit_address_format): Node /amba/spi@ff0f0000/flash@0/partition@0x00100000 unit name should not have leading "0x"
../target/UltraZed-EG-IOCC/boot/devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dts: Warning (unit_address_format): Node /amba/spi@ff0f0000/flash@0/partition@0x00100000 unit name should not have leading 0s
../target/UltraZed-EG-IOCC/boot/devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dts: Warning (unit_address_format): Node /amba/spi@ff0f0000/flash@0/partition@0x00140000 unit name should not have leading "0x"
../target/UltraZed-EG-IOCC/boot/devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dts: Warning (unit_address_format): Node /amba/spi@ff0f0000/flash@0/partition@0x00140000 unit name should not have leading 0s
../target/UltraZed-EG-IOCC/boot/devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dts: Warning (pci_device_reg): Node /amba/pcie@fd0e0000/legacy-interrupt-controller missing PCI reg property
../target/UltraZed-EG-IOCC/boot/devicetree-4.9.0-xlnx-v2017.3-fpga-zynqmp-uz3eg-iocc.dts: Warning (gpios_property): Could not get phandle node for /__symbols__:gpio(cell 0)

  1. 2018年01月19日 06:06 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる4(U-Bootを作る)

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる4(BL31を作る)”の続き。

前回は、ステージ2 ブートローダー(BL31 - ARM Trusted Firmware Boot Loader Stage 3-1)を作成した。今回は、U-Bootを作ってみよう。

2018/01/17 : 修正、make が失敗したのですが、ソースコードに files/u-boot-xlnx-v2017.3-ultrazed-eg-iocc-i2c-patch.diff が追加され、うまく行ったので、最初からうまく行ったように書き直しました。現在は、この手順通りにやればうまく行くと思います。

今回参照するのは、
UltraZed 向け Debian GNU/Linux の構築(U-Boot編)

まずはU-Boot のソースコードをダウンロードしよう。
cd target/UltraZed-EG-IOCC/build
git clone https://github.com/Xilinx/u-boot-xlnx.git u-boot-xlnx-v2017.3

UltraZed-EG_Linux_51_170117.png

xilinx-v2017.3 をチェックアウト
cd u-boot-xlnx-v2017.3
git checkout -b xilinx-v2017.3-ultrazed-eg-iocc refs/tags/xilinx-v2017.3

UltraZed-EG_Linux_52_170117.png

パッチを行って、UltraZed-EG-IOCC 用のファイルを追加
patch -p0 < ../../../../files/u-boot-xlnx-v2017.3-ultrazed-eg-iocc.diff
UltraZed-EG_Linux_53_170117.png

git add arch/arm/dts/zynqmp-uz3eg-iocc.dts
git add board/xilinx/zynqmp/zynqmp-uz3eg-iocc/psu_init_gpl.c
git add board/xilinx/zynqmp/zynqmp-uz3eg-iocc/psu_init_gpl.h
git add configs/xilinx_zynqmp_uz3eg_iocc_defconfig
git add include/configs/xilinx_zynqmp_uz3eg_iocc.h
git add --update
git commit -m "patch for UltraZed-EG-IOCC"

コミットでエラーが出てしまった。
UltraZed-EG_Linux_54_170117.png

どうやら、メールアドレスと名前をセットする必要があるらしい?
git config --global user.email "xxxx@yyyy.zzz"
git config --global user.name "marsee101"

メールアドレスはちゃんとしたメールアドレスを設定した。

メールアドレスと名前をセットしたところで、もう一度コミット。今度は成功。
git commit -m "patch for UltraZed-EG-IOCC"
git tag -a xilinx-v2017.3-ultrazed-eg-iocc-0 -m "release xilinx-v2017.3-ultrazed-eg-iocc release 0"

UltraZed-EG_Linux_55_170117.png

i2c のパッチを行う。
patch -p0 < ../../../../files/u-boot-xlnx-v2017.3-ultrazed-eg-iocc-i2c-patch.diff
git add --update
git commit -m "[fix] bug for I2C freeze when reboot"
git tag -a xilinx-v2017.3-ultrazed-eg-iocc-1 -m "release xilinx-v2017.3-ultrazed-eg-iocc release 1"

UltraZed-EG_Linux_63_170117.png 

make の準備
export ARCH=arm
export CROSS_COMPILE=aarch64-linux-gnu-
make xilinx_zynqmp_uz3eg_iocc_defconfig

UltraZed-EG_Linux_64_170117.png 

make
UltraZed-EG_Linux_69_170117.png

make は成功した。

u-boot.elf ができていた。
u-boot.elf を ~/ZynqMP-FPGA-Linux/target/UltraZed-EG-IOCC/build にコピーした。
cp u-boot.elf ~/ZynqMP-FPGA-Linux/target/UltraZed-EG-IOCC/build/u-boot.elf
UltraZed-EG_Linux_70_170117.png

~/ZynqMP-FPGA-Linux/target/UltraZed-EG-IOCC/build の内容を示す。
UltraZed-EG_Linux_71_170117.png
  1. 2018年01月17日 20:31 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる4(BL31を作る)

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる3(FSBLとPMUFWを作る)”の続き。

前回は、ハードウェアをエクスポートして、SDK を起動し、FSBL とPMUFW を作成した。今回は、ステージ2 ブートローダー(BL31 - ARM Trusted Firmware Boot Loader Stage 3-1)を作成しよう。

今回参照するのは、
UltraZed 向け Debian GNU/Linux の構築(Sample FPGA Design編)”と
UltraZed 向け Debian GNU/Linux の構築(BL31編)”だ。

まずは、自分でGUI でサンプル・デザインを作ってしまったので、”UltraZed 向け Debian GNU/Linux の構築(Sample FPGA Design編)”の”Sample FPGA Design の構築”で https://github.com/ikwzm/ZynqMP-FPGA-Linux を git clone していなかった。よって、この git clone をやる必要がある。
git clone https://github.com/ikwzm/ZynqMP-FPGA-Linux
UltraZed-EG_Linux_44_170116.png

すると、ZynqMP-FPGA-Linux ディレクトリができた。
UltraZed-EG_Linux_49_170117.png

ここから、”UltraZed 向け Debian GNU/Linux の構築(BL31編)”を参照する。

ZynqMP-FPGA-Linux/target/UltraZed-EG-IOCC/build ディレクトリに入って、arm-trusted-firmware.git を git clone した。
cd ZynqMP-FPGA-Linux
cd target/UltraZed-EG-IOCC/build
git clone https://github.com/Xilinx/arm-trusted-firmware.git

UltraZed-EG_Linux_45_170116.png

arm-trusted-firmware ディレクトリができた。(make の後の状態)
UltraZed-EG_Linux_50_170117.png

arm-trusted-firmware ディレクトリに入って、make を行った。
cd arm-trusted-firmware
make CROSS_COMPILE=aarch64-linux-gnu- PLAT=zynqmp RESET_TO_BL31=1

UltraZed-EG_Linux_46_170116.png

build/zyqmp/release/bl31/ ディレクトリに行くと、生成されたステージ2 ブートローダーの bl31.elf が生成されているのが分かった。
UltraZed-EG_Linux_48_170116.png
  1. 2018年01月17日 04:29 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる3(FSBLとPMUFWを作る)

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる2(Sample FPGA Design編)”の続き。

前回は、AXI_GPIO を 3 個使ったシンプルなデザインを作成して、論理合成、インプリメント、ビットストリームの生成まで終了した。今回は、ハードウェアをエクスポートして、SDK を起動し、FSBL とPMUFW を作成しよう。

今日参考にするのは、
UltraZed 向け Debian GNU/Linux の構築(FSBL編)”と
UltraZed 向け Debian GNU/Linux の構築(PMUFW編)”だ。

Vivado 2017.4 のFile メニューからExport -> Export Hardware... を選択する。

Export Hardware ダイアログが表示された。
Inclucde bitstream にチェックを入れて、OK ボタンをクリックする。
UltraZed-EG_Linux_35_170116.png

File メニューからLaunch SDK を選択する。
Launch SDK ダイアログが表示された。OK ボタンをクリックする。
UltraZed-EG_Linux_36_170116.png

SDK が立ち上がった。
UltraZed-EG_Linux_37_170116.png

FSBLの作成
File メニューからNew -> Application project を選択する。
New Project のApplication project ダイアログが表示された。
Project name に zynqmp_fsbl と入力して、Next > ボタンをクリックする。
UltraZed-EG_Linux_38_170116.png

Available Templates から Zynq MP FSBL を選択して、Finish ボタンをクリックする。
UltraZed-EG_Linux_39_170116.png

zynqmp_fsbl.elf ができた。
UltraZed-EG_Linux_40_170116.png

PMUFW の作成
File メニューからNew -> Application project を選択する。
New Project のApplication project ダイアログが表示された。
Project name に zynqmp_pmufw と入力し、Processor をプルダウンメニューから psu_pmu_0 を選択する。
Next > ボタンをクリックする。
UltraZed-EG_Linux_41_170116.png

Available Templates で、ZynqMP PMU Firmware が選択されているので、Finish ボタンをクリックする。
UltraZed-EG_Linux_42_170116.png

zynqmp_pmufw.elf ができた。
UltraZed-EG_Linux_43_170116.png
  1. 2018年01月16日 04:57 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる2(Sample FPGA Design編)

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる1(前振り編)”の続き。

前回は、@ikwzm さんの”UltraZed 向け Debian GNU/Linux の構築”をやってみることにした。今回は、”UltraZed 向け Debian GNU/Linux の構築(Sample FPGA Design編)”をやってみる。この記事では、TCL スクリプトでやっているが、私はGUI を使用してみようと思う。

Vivado 2017.4 を立ち上げて、Create Project をクリックする。

Create a New Vivado Project 画面で Next> ボタンをクリックする。

Project Name 画面で、Project name を uzed_eg_ex1_174 とした。Next> ボタンをクリックする。
UltraZed-EG_Linux_1_170115.png

Project Type 画面でRTL Project のラジオボタンがクリックされているのを確認して、Next > ボタンをクリックする。

Add Sources 画面もデフォルトのまま、Next > ボタンをクリックする。

Add Constrains (optinal) 画面もデフォルトのまま、Next > ボタンをクリックする。

Default Part 画面では、Vender を em.avnet.com を選択して、Display Name から Avnet Ultra-3EG IO Carrier Card を選択した。(Vivado 2017.4 にボード・ファイルを入れておく必要がある)
UltraZed-EG_Linux_2_170115.png

New Project Summary 画面が表示された。Finish ボタンをクリックする。
UltraZed-EG_Linux_3_170115.png

uzed_eg_ex1_174 プロジェクトが作成された。
UltraZed-EG_Linux_4_170115.png

Flow Navigator の Create Block Design をクリックし、表示されたCreate Block Design ダイアログで、Design name を uzed_eg_ex1 に設定した。OK ボタンをクリックする。
UltraZed-EG_Linux_5_170115.png

uzed_eg_ex1 ブロック・デザインが生成された。
UltraZed-EG_Linux_6_170115.png

Diagram ウインドウをフロートし、真ん中の + ボタンをクリックする。

Zynq UltraScale+ MPSoC をダブルクリックする。
UltraZed-EG_Linux_7_170115.png

zynq_ultra_ps_e_0 がAdd IP された。
UltraZed-EG_Linux_8_170115.png

Run Block Automation ダイアログが表示された。OK ボタンをクリックする。
UltraZed-EG_Linux_9_170115.png

Vivado 2017.4 でBoard タブをクリックした。
Generate Purpose Input or Output の DIP switches を右クリックし、右クリックメニューからConnect Board Component... をクリックした。
UltraZed-EG_Linux_10_170115.png

Connect Board Component ダイアログが表示された。
Create new IP の GPIO をクリックし、OK ボタンをクリックする。
UltraZed-EG_Linux_11_170115.png

dip_switches_8bits ポートに接続された axi_gpio_0 がインスタンスされた。
Run Connection Automation をクリックする。
UltraZed-EG_Linux_12_170115.png

Run Connection Automation ダイアログが表示された。OK ボタンをクリックする。
UltraZed-EG_Linux_13_170115.png

IP が追加され、配線された。
UltraZed-EG_Linux_14_170115.png

Vivado 2017.4 で LED を右クリックし、右クリックメニューからConnect Board Component... を選択した。
UltraZed-EG_Linux_15_170115.png

Connect Board Component ダイアログが表示された。
Create new IP の GPIO をクリックし、OK ボタンをクリックする。
UltraZed-EG_Linux_16_170115.png

led_8bits ポートと axi_gpio_1 が追加された。
Run Connection Automation をクリックする。
UltraZed-EG_Linux_17_170115.png

配線された。(なお、下の図はRegenerate Layout を行っている)
UltraZed-EG_Linux_18_170115.png

最後のPush buttons を右クリックし、右クリックメニューからConnect Board Component... を選択した。
UltraZed-EG_Linux_19_170115.png

Connect Board Component ダイアログが表示された。
Create new IP からAXI_GPIO のGPIO を選択した。
UltraZed-EG_Linux_20_170115.png

push_buttons_3bits ポートと axi_gpio_2 が追加された。
Run Connection Automation をクリックする。
UltraZed-EG_Linux_21_170115.png

Run Connection Automation ダイアログが表示された。
OK ボタンをクリックする。
UltraZed-EG_Linux_22_170115.png

配線された。
Regenerate Layout アイコンをクリックする。
UltraZed-EG_Linux_23_170115.png

レイアウトが再生成された。
Validate Design アイコンをクリックする。
UltraZed-EG_Linux_24_170115.png

Validate Design ダイアログが表示された。
成功した。
OK ボタンをクリックする。
UltraZed-EG_Linux_25_170115.png

Address Editor を示す。
UltraZed-EG_Linux_26_170115.png

Source タブをクリックし、Design Sources の uzed_eg_ex1 を右クリックし、右クリックメニューからCreate HDL Wapper... を選択した。
UltraZed-EG_Linux_28_170115.png

Create HDL Wrapper ダイアログが表示された。
OK ボタンをクリックする。
UltraZed-EG_Linux_29_170115.png

uzed_eg_ex1_wrapper.v のトップ・ファイルが生成された。
これで、すべてのソース・ファイルができたので、Flow Navigator からGenerate Bitstream をクリックする。
UltraZed-EG_Linux_30_170115.png

No Implementation Results Available ダイアログが表示された。
Yes ボタンをクリックする。
UltraZed-EG_Linux_31_170115.png

Launch Runs ダイアログが表示された。
OK ボタンをクリックする。
UltraZed-EG_Linux_32_170115.png

しばらくして、論理合成、インプリメント、ビットストリームの生成が終了した。
結果を示す。
UltraZed-EG_Linux_33_170115.png
UltraZed-EG_Linux_34_170115.png

問題ないようだ。
  1. 2018年01月15日 04:59 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる1(前振り編)

@ikwzm さんの”UltraZed 向け Debian GNU/Linux の構築”をやってみて、UltraZed-EG Starter Kit 用のDebian を構築して、ZYBO やZYBO Z7 と同様に使いたいというのが趣旨です。
そして、@ikwzm さんの”UltraZed 向け Debian GNU/Linux の構築”で作ったDebian に tcf-agnet をインストールできれば、パソコンで動作するVivado SDKからリモートデバッグできて、とても便利です。よってこれを試してみたいと思います。(この規模とCPU性能だと自分の所に eclipse をインストールして自分でデバッグでも良いとは思いますが)
できればYOLO2 か何か規模のある程度、大きなディープ・ニューラルネットワークをUltraZed-EG Starter Kit に載せてみたいと思っている。そのためのプラットフォームとして使用してみたい。それから、DNNを実装するに当たって、今のVivado HLS では自分の意図するようにネットワークをHDLに展開してくれないので、展開 C コードを自動生成するPython(が良いですかね?)スクリプトを作りたいと思っている。

前振りが長くなってしまったが、最初に、記事を書いて頂いた @ikwzm さんに深い感謝を表したいと思います。本当にありがとうございました。助かります。

UltraZed 向け Debian GNU/Linux の構築(イントロ編)”だが、申し訳ないけど、前振りなので、飛ばす。

UltraZed 向け Debian GNU/Linux の構築(Boot Loader編)”をやってみよう。

起動ファイルのBOOT.bin について書かれている。Linux を起動するときに BOOT.bin を構成するファイルは、次の5つだそだ。下に引用する。

FSBL (First Stage Boot Loader)
PMUFW (Platform Manager Unit Firmware)
BL31 (ARM Trusted Firmware Boot Loader state 3-1)
U-Boot
PL-Bitstream (option)


ノーマルZynq からだと、PMUFW と BL31 が増えているようだ。

ZynqMP のブートシーケンス
ステージ0 (内部ROM)
ステージ1 (FSBL - First Stage Boot Loader)
  ここで、PMUFW がロードされるそうだ。
ステージ2 (BL31 - ARM Trusted Firmware Boot Loader Stage 3-1)
ステージ3 (U-Boot)
  1. 2018年01月14日 08:52 |
  2. UltraZed-EG
  3. | トラックバック:0
  4. | コメント:0

Zynq+Vivado HLS勉強会が終了

今日で、Zynq+Vivado HLS勉強会が終了した。

今までZynq+Vivado HLS勉強会は8 回開催した。大体 3 時間程度。少し長くなって 4 時間くらいのもあったけど。
最初は 35 人くらいだったが、最後の今日は周知不足もあって 3 人だった。大体は 15 人くらいかな?

1.Zynqの概要+AXIインターフェース+Vivado HLS (概要) (2017/11/01)
2.Vivado HLS勉強会1(基礎編) (2017/11/10)
3.Vivado HLS勉強会2(レジスタの挿入とPIPELINEディテクティブ) (2017/11/17)
4.Vivado HLS勉強会3(AXI4 Lite Slave) (2017/12/01)
5.Vivado HLS勉強会4(AXI4 Master) (2017/12/08)
6.Vivado HLS勉強会5(AXI4 Stream) (2017/12/15)
7.Vivado HLSのIPをLinuxから使用する (2017/12/22)
8.任意精度固定小数点データ型+Vivado HLSのビデオ関数 (2018/01/12)

他の大学でもやってみたいとは思っているのだが、丸4日かかるので長すぎるよね。。。
  1. 2018年01月12日 20:54 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

TCF agent を使ってLinaro Ubuntu14.04LTSが動作してるZYBO へパソコンのSDK からリモートデバッグする2

TCF agent を使ってLinaro Ubuntu14.04LTSが動作してるZYBO へパソコンのSDK からリモートデバッグする1”の続き。

前回は、Linaro Ubuntu14.04LTSが動作してるZYBO上に tcf-agent をインストールした。今回は、パソコンのSDK でZYBO 上にSFTP したアプリケーションソフトをリモートデバッグしてみよう。

まずは、Linaro Ubuntu14.04LTSが動作してるZYBO上でスーパーユーザーで tcf-agent を起動した。
sudo tcf-agent &
tcf-agent_9_180111.png

使用するVivado 2017.3 のプロジェクトは、白線間走行用畳み込みニューラルネットワークが入っていて、白線間を走行するミニ・ロボットカーのプロジェクト(ZYBO_0_173_9)だ。
tcf-agent_10_180111.png

ハードウェアをエクスポートした上でSDK を立ち上げてある。
tcf-agent_11_180111.png

File メニューからNew -> Application project を選択した。

New Project ダイアログが表示された。Project name に wl_tracing_cnn4linux と入力した。Next > ボタンをクリックする。
tcf-agent_12_180111.png

New Project ダイアログの Templates で、Linux Empty Application を選択して、Finish ボタンをクリックする。
tcf-agent_13_180111.png

wl_tracing_cnn4linux フォルダが作成された。
tcf-agent_14_180111.png

wl_tracing_cnn4linux フォルダの下の src フォルダを右クリックし、右クリックメニューから New -> Source File を選択した。
tcf-agent_15_180111.png

Source file に wl_tracing_cnn4linux.c と入力して、Finish ボタンをクリックする。
tcf-agent_16_180111.png

wl_tracing_cnn4linux.c が新規作成されたので、”カーブ、直線用白線間走行用畳み込みニューラルネットワーク18(ミニ・ロボットカーでの走行テスト)”の wl_tarcing_cnn.c をコピー&ペーストした。
tcf-agent_17_180111.png

xpwm.h でエラーが出てしまっている。すべてのVivado HLS で作成した IP のドライバのインクルード・ファイルでエラーが出ている。

とりあえず、ビルドを clean してみた。
tcf-agent_18_180111.png

だが、エラーは解消されない。Linux のアプリケーション・プロジェクトでは、ハードウェア・プラットフォームのドライバは使われないようだ。
それならば、Vivado HLS で作成した IP のドライバを wl_tracing_cnn4linux フォルダの下の src フォルダにすべて入れることにした。
tcf-agent_19_180111.png

Vivado HLS で作成した IP のドライバの xxx_sint.c 以外のドライバを wl_tracing_cnn4linux フォルダの下の src フォルダにすべてコピーした。
tcf-agent_20_180111.png

wl_tracing_cnn4linux フォルダを右クリックし、右クリックメニューから Debug As -> Debug Configuration... を選択した。
tcf-agent_21_180111.png

Debug Configurations ダイアログが表示された。
Xilinx C/C++ application (System Debugger) を右クリックし、右クリックメニューから New を選択した。
tcf-agent_22_180111.png

Xilinx C/C++ application (System Debugger) の下に、System Debugger using Debug_wl_tracing_cnn4linux.elf on Linux Agent ができた。
Connection の New ボタンをクリックする。
tcf-agent_23_180111.png

Target Connection Details の New Target Connection ダイアログが表示された。
Target Name を ZYBO に、Set as default target にチェックを入れて、Host に現在のZYBO 上のLinux の IP アドレスを入力した。
tcf-agent_24_180111.png

Test Connection ボタンをクリックすると、Connection successful! が表示されて、成功した。
tcf-agent_25_180111.png

Target Connection Details の New Target Connection ダイアログで、OK ボタンをクリックし、終了した。
Debug Configurations ダイアログで、Debug ボタンをクリックした。
tcf-agent_26_180111.png

パースペクティブをデバッグモードに変更するダイアログが表示されたが、OK ボタンをクリックしたと思う。
SDKがデバッグモードになって、最初の wl_tracing_cnn4linux.c の最初のコードが表示されている。SDK からのリモートデバッグ成功だ。
tcf-agent_27_180111.png

ZYBO のLinux の /mnt ディレクトリの下に wl_tracing_cnn4linux.elf が SFTP アップロードされている。
tcf-agent_28_180111.png

/mnt ディレクトリの下にアップロードされたのは、Debug Configurations ダイアログのApplication タブで、Remot File Path に指定されているからだ。
tcf-agent_30_180111.png

SDKのリモートデバッグも、ステップオーバーすると、次の行に行くので動作しているようだ。
tcf-agent_29_180111.png

tcf-agent を起動することで、念願だった Linux が起動しているZynq チップへのSDK からのリモートデバッグを行うことができた。とっても良かったと思う。
  1. 2018年01月12日 05:05 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

TCF agent を使ってLinaro Ubuntu14.04LTSが動作してるZYBO へパソコンのSDK からリモートデバッグする1

以前、”Linaro Ubuntu14.04LTSが動作してるZYBOへWindowsのSDKからリモートデバッグする”で、Linaro Ubuntu14.04LTSが動作してるZYBOへWindowsのSDKからリモートデバッグをトライしてみたが、うまく行かなかった。最近、それは、TCF (Target Communication Framwork) agent が無いからだというのをK林さんから聞いたので、やってみようと思う。

TCF agent で検索すると、Diginet Forum の”Zybo - Debugging with System Debugger (TCF)”が見つかった。このQ&Aでは、”Embedded linux on zybo”で構築したLinux へSDK からデバッグできないという記事なので、私と状況が一緒だ。
解決方法は、SDK のリモートデバッグには tcf-agent が必要で、ramdisk に tcf-agent があると言っている。また、tcf-agent をゼロから構築するには、”TCF/Raspberry Pi”を参照するということだった。

最初、”TCF/Raspberry Pi”を参照してやってみても make でエラーが出てしまった。
それは、Ubuntu のパッケージが足りなかったためらしい。追加で、Eclipse Community Forums の”TCF Agent [message #1770486]”を見て、”git uuid uuid-dev libssl-dev”の各パッケージが必要ということが分かった。

それでは情報がそろったところで、Linaro Ubuntu14.04LTSが動作してるZYBOへ TCF agent をゼロからインストールしてみよう。
まずは、Linaro Ubuntu14.04LTSが動作してるZYBO上で、
sudo apt-get update
を行った。
tcf-agent_1_180110.png

sudo apt-get upgrade
tcf-agent_2_180110.png

sudo apt-get install git uuid uuid-dev libssl-dev
tcf-agent_3_180110.png

git clone git://git.eclipse.org/gitroot/tcf/org.eclipse.tcf.agent.git
tcf-agent_4_180110.png

cd org.eclipse.tcf.agent/agent
make

tcf-agent_5_180110.png

make が成功した。なお、MACHINE=arm に設定されるようで、アーキテクチャ名をコピーせずに、machine/arm で通ったようだ。

make install
で /tmp ディレクトリにインストールされた。
tcf-agent_6_180110.png

sudo make install INSTALLROOT=
で、インストールした。
tcf-agent_7_180110.png

tcf-agent & コマンドで起動した。(sudo tcf-agent & かも?)
tcf-agent_8_180110.png

その後、”TCF/Raspberry Pi”では、TCF agent をデーモンとして登録しているようだが、たまにしか使わないし、自分で起動しても良いかな?ということで、とりあえずデーモンとして登録せずに自分で起動することにした。

とりあえず Linaro Ubuntu14.04LTSが動作してるZYBOへ TCF agent をインストールすることができたので、次は、パソコンのSDKからリモートデバッグできるかどうか確かめてみよう。
  1. 2018年01月11日 03:57 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

ZYBO Z7-20でPcam 5Cを使用する8(シリアル・インターフェースで設定変更)

ZYBO Z7-20でPcam 5Cを使用する7(Pcam 5Cの設定を変更)”の続き。

前回は、pcam_vdma_hdmi アプリケーション・プロジェクトの src フォルダの ov5640 フォルダの OV5640.h を変更してカメラの設定を変更した。今回は、pcam_vdma_hdmi アプリケーション・ソフトウェアは、シリアル・インターフェースを使用して設定を変更できる機能があるので、それを使用してみた。

まずは、起動時のTera Term の画面を示す。
MIPI_camera_63_180108.png

Digiletn のZybo Z7 Pcam 5C Demo の”Using the Zybo Z7 Pcam 5C Demo”の”Pcam 5C Image Sensor and Post Processing Options”から引用する。

a - Change Resolution
This option can be used to change the resolution of the video coming from the sensor. Currently 1080p@15Hz is not supported and will cause problems if used.
b - Change Liquid Lens Focus
This option is not compatible with this version of the Pcam 5C and should be ignored
d - Change Image Format
This option was included for debugging purposes and should always be set to RAW mode (option 2)
e - Write a Register inside the Image Sensor
This option allows you to write a value to any register inside the Image sensor over the OmniVision SCCB interface. You will need to refer to the OV5640 datasheet for information on the register map. This option is very useful for exploring the features of the image sensor.
f - Read a Register inside the Image Sensor
This option allows you to read the value of any register inside the Image sensor over the OmniVision SCCB interface.
g - Change Gamma Correction Factor Value
This option allows you to change the amount of gamma correction that is done by the custom AXI stream IP inside the FPGA.
h - Change AWB Settings
This option allows you to adjust how the image sensor is doing auto white balancing. There are 3 modes: Advanced, simple, and disabled. The advanced mode sometimes causes dramatic shifts between “red-ish” and “blue-ish” tints.


最初の”a”とリターンキーをタイプすると、解像度とフレームレートを変更することができる。
MIPI_camera_64_180108.png

2 の 1920 x 1080 15fps はサポートされていないそうなので、やってみると画像が乱れる。3. 1920 x 1080 30fps が標準だ。その時のカメラ画像を示す。
MIPI_camera_70_180110.jpg

1. 1280 x 720 60fps の時の画像を示す。
MIPI_camera_71_180110.jpg
(部屋が散らかっていて申し訳ありません)

b は機能がないそうなので、d とリターンキーをタイプすると、RGB と RAW に変更できるという?
MIPI_camera_65_180108.png

どこを変更しているのか良く分からないが? 1. にしてみた。
MIPI_camera_72_180110.jpg

色がおかしい。。。 2. にすると元に戻った。

f. Read a Register inside the Image Sensor はカメラのレジスタを Read できる機能だ。アドレスを指定するとレジスタの値を表示する。
vfilp の0x3820 のレジスタの値を読んでみよう。
”r”とリターンキーをタイプすると、アドレスを入れるモードになるので、3820 を入力した。
すると、レジスタの値の 40 を表示する。
MIPI_camera_66_180110.png

e. Write a Register inside the Image Sensor はカメラのレジスタを Write できる機能だ。アドレスを指定して、レジスタの値を入力する。 0x3820 に 0x46 を書くと上下反転した。
MIPI_camera_67_180110.png

g. Change Gamma Correction Factor Value は画像のガンマ値を変更することができる。
MIPI_camera_68_180110.png

1. が一番暗くて、5. が一番明るい。

1. の画像を示す。
MIPI_camera_73_180110.jpg

5. の画像を示す。
MIPI_camera_74_180110.jpg

h. Change AWB Settings はホワイト・バランスをアドバンスドとシンプルとオフから選択できる。
MIPI_camera_69_180110.png

1. と 2 . は変化が無かった。
3. のAWB をオフにすると、色が変わってしまった。
MIPI_camera_75_180110.jpg
  1. 2018年01月10日 06:34 |
  2. ZYBO Z7
  3. | トラックバック:0
  4. | コメント:0

ZYBO Z7-20でPcam 5Cを使用する7(Pcam 5Cの設定を変更)

ZYBO Z7-20でPcam 5Cを使用する6(Pcam 5Cのカメラ画像を表示できた)”の続き。

前回は、Digilent 社のデモ・プロジェクトで Pcam 5Cのカメラ画像を表示することができた。今回は、Pcam 5Cのカメラ画像をレジスタを設定することで、画像を変更してみた。

なお、参考にしたのは、Digilent 社のデモ・プロジェクトの OV5640.h と、Linux のドライバーの ov5640.c だ。
後は、Interface 2014年11月号の 「第4章 まずは体験! 最新処理画像機能で OV5642 の機能」を紹介しているエンヤ ヒロカズさんの記事だ( 42 ページ)。

まずは、下の写真の様に、Pcam 5Cのカメラを下に垂らした方が使いやすい。
MIPI_camera_57_180108.jpg

現状では、こうすると、画像は上下が逆になってしまう。
MIPI_camera_60_180108.jpg

ov5640 のデータシートの 39 ページの 4 image sensor core digital functions 、4.1 mirror and flip を引用する。
MIPI_camera_62_180108.png

pcam_vdma_hdmi アプリケーション・プロジェクトの src フォルダの ov5640 フォルダの OV5640.h を見ると、

{0x3820, 0x46}

になっていた。
MIPI_camera_55_180108.png

これは、vfilp がイネーブルになっている。つまり、上下方向で反転されている。Pcam 5C のシルクの向きとは反対なので、搭載方法をミスったのだろうか?

{0x3820, 0x40}

にすれば、上下反転が直るはず。
MIPI_camera_56_180108.png

こう修正すると上下反転したというか、上下反転が直った。
MIPI_camera_61_180108.jpg

次に、少し色が薄い気がするので、Interface 2014年11月号の 「第4章 まずは体験! 最新処理画像機能で OV5642 の機能」の 47 、48 ページの色飽和度を参考にして、0x5001, 0x 5583, 0x5584, 0x5580 のレジスタをいじってみたが、変化は無かった。

Interface 2014年11月号の 「第4章 まずは体験! 最新処理画像機能で OV5642 の機能」の 49、50 ページの「4 - 5 明るさを補正する・・・露出補正」をやってみた。最初、本の通りの値を入れたが、うまく行かない。カメラの型番が違うので、デフォルト値が違うのかも?ということで、レジスタのデフォルト値を読みだして、それを変更したら、露出補正がうまく行った。

まずは、露出補正後のカメラ画像を示す。レースのカーテン越しに外の状況が分かる。室内は暗くなっている。
MIPI_camera_58_180108.jpg

OV5640.h の修正部分のコードを示す。
MIPI_camera_52_180108.png

normal に戻す。
MIPI_camera_53_180108.png

すると、カメラ画像の外は白飛びしてしまう。
MIPI_camera_59_180108.jpg

そのときの OV5640.h の修正部分のコードを貼っておく。

        {0x5001, 0x03},

        // by marsee 2018/01/08
        //EV
        /*{0x3a0f,0x30}, // more dark
        {0x3a10,0x20},
        {0x3a1b,0x30},
        {0x3a1e,0x20},
        {0x3a11,0x88},
        {0x3a1f,0x40}*/
        {0x3a0f,0x78}, // normal
        {0x3a10,0x68},
        {0x3a1b,0x78},
        {0x3a1e,0x68},
        {0x3a11,0xD0},
        {0x3a1f,0x40}

  1. 2018年01月09日 04:22 |
  2. ZYBO Z7
  3. | トラックバック:0
  4. | コメント:0

牛久シティマラソンに出ました

今日は、6時30分頃、家を出て牛久シティマラソンに行ってきました。
直接、会場まで行けないので、中央生涯学習センターに行ってそこからシャトルバスです。

Ushiku_City_M_1_180108.jpg

Ushiku_City_M_2_180108.jpg

(ミズノ)MIZUNO ランニングウィンドブレーカーシャツ [メンズ]を買ったので、直前までウインドブレーカーを着ていられました。これはウエストポーチになるウインドブレーカーです。

5km は 9時15分スタートでした。牛久シティマラソンは高架をくぐるのでアップダウンが多くて疲れました。
やはり、タイムは振るわずにネットで27分ちょうどでした。
Ushiku_City_M_3_180108.jpg

帰りは20分くらいシャトルバスを待っていました。もうちょっと、シャトルバスの運行間隔を短くしてほしいです。
  1. 2018年01月08日 21:03 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ZYBO Z7-20でPcam 5Cを使用する6(Pcam 5Cのカメラ画像を表示できた)

ZYBO Z7-20でPcam 5Cを使用する5(SDK1)”の続き。

前回は、SDKのビルドでエラーが出て解消できなかった。今回は、ブロック・デザインで階層を設けないでやってみた。結果的にこれでうまく行ってPcam 5Cのカメラ画像を表示することができた。

ZYBO Z7-20でPcam 5Cを使用する3(インプリメント)”でPcam 5C用の階層とHDMI 出力の階層を分けてしまったので、そのまま分けないでフラットなブロック・デザインとしてやってみた。
MIPI_camera_38_180106.png

MIPI_camera_39_180106.png

拡大した。
MIPI_camera_40_180106.pngMIPI_camera_41_180106.png

Address Editor 画面。
MIPI_camera_42_180106.png

これで、論理合成、インプリメント、ビットストリームの生成を行った。
結果を示す。
MIPI_camera_43_180106.png

同様に sdk フォルダの内容を import すると、今度は、pcam_vdma_hdmi_bsp にBSP Documentation フォルダと ps7_cortexa9_0 フォルダができていた。これでOKそうだ。ビルドも通っている。
MIPI_camera_44_180106.png

Zybo Z7 Pcam 5C Demo”を参考にしながら、Pcam 5Cを接続して、ZYBO Z7の電源をONした。
PROG/UART のMicro USB ポートからパソコンに接続した。
MIPI_camera_45_180107.jpg

FPGAにビット・ファイルをダウンロードして、pcam_vdma_hdmi.elf を起動したところ、HDMI 出力にカメラ画像が表示された。
MIPI_camera_46_180107.jpg

彩度があまりよくないような気がするし、明るくなってくると白飛びしてしまうので、AGCが効いていないのかもしれない?もっと設定を頑張る必要あるとは感じた。

さて、これまではVivado 2016.4でやっていたのだが、Vivado 2017.4 にアップグレードしてみた。
IP をアップグレードしたら、ブロック・デザインも正常になったので、問題ないようだ。
MIPI_camera_47_180107.png

論理合成、インプリメント、ビットストリームの生成を行った。
結果を示す。
MIPI_camera_48_180107.png

critical warnings が増えているが、タイミングエラーの値は同じだ。Vivado 2017.4 になってからクリティカル・ワーニングの数が増えたような気がする。

ハードウエアをエクスポートして、SDK を立ち上げた。
同様に sdk フォルダの内容を import しても、エラーが出てしまう。

pcam_vdma_hdmi アプリケーションソフトをC++ の Empty Application テンプレートで新規作成して、sdk フォルダの hdmi, ov5640, platform フォルダと main.cc ファイルを src フォルダの下にコピーした。
MIPI_camera_51_180107.png

すると、pcam_vdma_hdmi_bsp の ps7_cortexa9_0 -> libsrc -> ddynclk_v1_0 -> ddynclk_g.c がエラーになっていた。
DDynClk_Config DDynClk_ConfigTable の[] の中の文字列の定義(名前を忘れちゃいました。。。)がないということで、エラーになってしまっていた。
よって、xparameters.h を見て、XPAR_AXI_DYNCLK_NUM_INSTANCES と入れ替えた。
MIPI_camera_50_180107.png

MIPI_camera_49_180107.png

こうすると、ビルドできた。
SDK 2016.4 の時と同様にFPGA にビット・ファイルをダウンロードして、pcam_vdma_hdmi.elf を起動したところ、HDMI 出力にカメラ画像が表示された。
  1. 2018年01月07日 15:41 |
  2. ZYBO Z7
  3. | トラックバック:0
  4. | コメント:0

ZYBO Z7-20でPcam 5Cを使用する5(SDK1)

ZYBO Z7-20でPcam 5Cを使用する4(タイミングエラーの検討)”の続き。

前回は、タイミングエラーを検証した。今回は、とりあえず、SDKでアプリケーションソフトを作成してみよう。

Vivado 2016.4 のFile メニューからExport -> Export Hardware... を選択する。

Export Hardware ダイアログで、Include bitstream にチェックを入れてから、OK ボタンをクリックする。

File メニューからLaunch SDK を選択して、SDK を起動した。
MIPI_camera_28_180106.png

Using Digilent Github Demo Projects の4. Import SDK Projects の Launch from Vivado に従って進めていく。

最初にFile メニューから Import... を選択する。
MIPI_camera_29_180106.png

Select ダイアログで、Existing Projects into Workspace を選択する。Next > ボタンをクリックする。
MIPI_camera_30_180106.png

Import Projects ダイアログで、Select root directory のBrowse... ボタンをクリックする。
MIPI_camera_31_180106.png

フォルダーの参照ダイアログで、Zybo-Z7-20-pcam-5c-master フォルダ下の sdk フォルダをクリックして、OK ボタンをクリックする。
MIPI_camera_32_180106.png

Import Projects ダイアログに、情報が入った。
Options の Copy projects into workspace にチェックを入れておく。
MIPI_camera_33_180106.png

pcam_vdma_hdmi アプリケーション・プロジェクトの platform.c がエラーになってしまう。
pcam_vdma_hdmi_bsp にインクルードのフォルダが無いからだ。
MIPI_camera_34_180106.png

それではということでBSP プロジェクトをリジェネレートしてみよう。
pcam_vdma_hdmi_bsp を右クリックして、右クリックメニューからRe-generate BSP Sources を選択した。
MIPI_camera_35_180106.png

Re-generate BSP Sources ダイアログが表示された。OK ボタンをクリックする。
MIPI_camera_36_180106.png

それでも必要なインクルード・フォルダなのどのソースは生成されない。SDK Log を見るとエラーが表示されていた。
MIPI_camera_37_180106.png
  1. 2018年01月07日 05:14 |
  2. ZYBO Z7
  3. | トラックバック:0
  4. | コメント:0
»