FC2カウンター FPGAの部屋 2018年08月18日
FC2ブログ

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

FPGAの部屋

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

白線追従用CNNを使用したZYBOtの白線追従走行1(準備編)

ZYBOt用のMicro SDカードを作成”でZYBOt 用のDebian を起動するMicro SD カードを作成することができた。今回は、デバイスツリーやビットストリーム、ZYBOt を走らせるためのアプリケーションソフトの用意をして、デバイスドライバをロードしてみよう。

まずは、FPGAにロードするためのビットストリームの容易だが、通常のビットファイルではだめで、.bin に変換する必要がある。
Linux の FPGA Manager で Xilinx のビットストリームファイルを扱う方法”からfpga-bit-to-bin.py をもらってきて、ZYBO_0_wrapper.bit を変換して ZYBO_0_wrapper.bin を作成した。
python fpga-bit-to-bin.py --flip .\ZYBO_0_wrapper.bit .\ZYBO_0_wrapper.bin
ZYBOt_8_180817.png

次に、Address Editor を参考に、devicetree.dts を作成した。
なおクロックの設定は、”ikwzm さんの構築したPYNQ ボード用DebianでのPS出力クロックfclkの設定方法”を参照した。
ZYBOt_9_180818.png

/dts-v1/;
/ {
    fragment@0 {
        target-path = "/amba/fpga-region0";
        #address-cells = <0x1>;
        #size-cells = <0x1>;

        __overlay__ {
            #address-cells = <0x1>;
            #size-cells = <0x1>;

            firmware-name = "ZYBO_0_wrapper.bin";

            mt9d111_axi_iic@41600000 {
                compatible = "generic-uio";
                reg = < 0x41600000 0x10000>;
            };
            dmaw4gabor_0@43cb0000 {
                compatible = "generic-uio";
                reg = < 0x43cb0000 0x10000 >;
            };
            axis_switch_0@43c10000 {
                compatible = "generic-uio";
                reg = < 0x43c10000 0x10000 >;
            };
            axis_switch_1@43c20000 {
                compatible = "generic-uio";
                reg = < 0x43c20000 0x10000 >;
            };
            lap_filter_axis_0@43c30000 {
                compatible = "generic-uio";
                reg = < 0x43c30000 0x10000>;
            };    
            mt9d111_inf_axis_0@43C40000 {
                compatible = "generic-uio";
                reg = < 0x43C40000 0x10000>;
            };
            bitmap_disp_cntrler_axi_master_0@43c00000 {
                compatible = "generic-uio";
                reg = < 0x43c00000 0x10000>;
            };
            bitmap_disp_cntrler_axi_master_1@43c50000 {
                compatible = "generic-uio";
                reg = < 0x43c50000 0x10000>;
            };
            axi_gpio_0@41200000 {
                compatible = "generic-uio";
                reg = < 0x41200000 0x10000>;
            };
            frame_buffer_bmdc@17800000 {
                compatible = "generic-uio";
                reg = < 0x17800000 0x1000000>;
            };
            pwm_0@43c60000 {
                compatible = "generic-uio";
                reg = < 0x43c60000 0x10000>;
            };
            pwm_1@43c70000 {
                compatible = "generic-uio";
                reg = < 0x43c70000 0x10000>;
            };
            motor_monitor_0@43c80000 {
                compatible = "generic-uio";
                reg = < 0x43c80000 0x10000>;
            };
            motor_monitor_1@43c90000 {
                compatible = "generic-uio";
                reg = < 0x43c90000 0x10000>;
            };
            dmar4resize_gray_0@43ca0000 {
                compatible = "generic-uio";
                reg = < 0x43ca0000 0x10000>;
            };
            rgb2hsv_0@43cc0000 {
                compatible = "generic-uio";
                reg = < 0x43cc0000 0x10000>;
            };
            ultrasoninc_sensor_inf_0@43cd0000 {
                compatible = "generic-uio";
                reg = < 0x43cd0000 0x10000>;
            };
            resize_gray_0@43ce0000 {
                compatible = "generic-uio";
                reg = < 0x43ce0000 0x10000>;
            };
            curve_conv_nn2_axis3_0@43cf0000 {
                compatible = "generic-uio";
                reg = < 0x43cf0000 0x10000>;
            };

            pow2-udmabuf0 {
                compatible  = "ikwzm,udmabuf-0.10.a";
                device-name = "udmabuf0";
                size = <0x00600000>;
            };

            fclk0 {
                compatible    = "ikwzm,fclkcfg-0.10.a";
                clocks        = <1 15>;
                insert-rate    = "100000000";
                insert-enable = <1>;
            };
            fclk1 {
                compatible    = "ikwzm,fclkcfg-0.10.a";
                clocks        = <1 16>;
                insert-rate    = "40000000";
                insert-enable = <1>;
            };
            fclk2 {
                compatible    = "ikwzm,fclkcfg-0.10.a";
                clocks        = <1 17>;
                insert-rate    = "72000000";
                insert-enable = <1>;
            };
            fclk3 {
                compatible    = "ikwzm,fclkcfg-0.10.a";
                clocks        = <1 18>;
                insert-rate    = "65000000";
                insert-enable = <1>;
            };
        };
    } ;
} ;


ZYBOt のDebian のfpga ユーザーのホーム・ディレクトリ下に zybot/wl_tracing_cnn ディレクトリを作成した。そのディレクトリにWinSCP でFTP で ZYBO_0_wrapper.bin と devicetree.dts を書き込んだ。
build ディレクトリを作って、Vivado HLS で作成したIP のドライバとwl_tracing_cnn.cpp と Makefile を”カーブ、直線用白線間走行用畳み込みニューラルネットワーク18(ミニ・ロボットカーでの走行テスト)”からコピペした。
ZYBOt_10_180818.png

make
を行った。
wl_tracing_cnn ができた。
ZYBOt_11_180818.png

sudo cp ZYBO_0_wrapper.bin /lib/firmware/
で、ZYBO_0_wrapper.bin を /lib/firmware/ ディレクトリにコピペした。
sudo dtbocfg.rb -i --dts devicetree.dts wl_tracing_cnn
でデバイスツリーで示されるドライバをロードした。
ZYBOt_12_180818.png

コンソールに出た表示を示す。
ZYBOt_13_180818.png

[ 2112.992998] fpga_manager fpga0: writing ZYBO_0_wrapper.bin to Xilinx Zynq FPGA Manager
[ 2113.068111] udmabuf amba:fpga-region0:pow2-udmabuf0: driver probe start.
[ 2113.089995] alloc_contig_range: [1f100, 1f700) PFNs busy
[ 2113.099904] alloc_contig_range: [1f200, 1f800) PFNs busy
[ 2113.121499] alloc_contig_range: [1f200, 1f900) PFNs busy
[ 2113.130406] alloc_contig_range: [1f400, 1fa00) PFNs busy
[ 2113.141038] alloc_contig_range: [1f400, 1fb00) PFNs busy
[ 2113.154205] alloc_contig_range: [1f600, 1fc00) PFNs busy
[ 2113.183723] udmabuf udmabuf0: driver installed
[ 2113.188148] udmabuf udmabuf0: major number = 245
[ 2113.192866] udmabuf udmabuf0: minor number = 0
[ 2113.197527] udmabuf udmabuf0: phys address = 0x1f700000
[ 2113.202857] udmabuf udmabuf0: buffer size = 6291456
[ 2113.208019] udmabuf udmabuf0: dma coherent = 0
[ 2113.212572] udmabuf amba:fpga-region0:pow2-udmabuf0: driver installed.
[ 2113.221307] fclkcfg amba:fpga-region0:fclk0: driver installed.
[ 2113.228467] fclkcfg amba:fpga-region0:fclk0: device name : fclk0
[ 2113.234667] fclkcfg amba:fpga-region0:fclk0: clock name : fclk0
[ 2113.242843] fclkcfg amba:fpga-region0:fclk0: clock rate : 100000000
[ 2113.250352] fclkcfg amba:fpga-region0:fclk0: clock enabled : 1
[ 2113.258386] fclkcfg amba:fpga-region0:fclk1: driver installed.
[ 2113.264157] fclkcfg amba:fpga-region0:fclk1: device name : fclk1
[ 2113.272683] fclkcfg amba:fpga-region0:fclk1: clock name : fclk1
[ 2113.278958] fclkcfg amba:fpga-region0:fclk1: clock rate : 38888889
[ 2113.285413] fclkcfg amba:fpga-region0:fclk1: clock enabled : 1
[ 2113.295553] fclkcfg amba:fpga-region0:fclk2: driver installed.
[ 2113.301408] fclkcfg amba:fpga-region0:fclk2: device name : fclk2
[ 2113.307651] fclkcfg amba:fpga-region0:fclk2: clock name : fclk2
[ 2113.313850] fclkcfg amba:fpga-region0:fclk2: clock rate : 68421053
[ 2113.320440] fclkcfg amba:fpga-region0:fclk2: clock enabled : 1
[ 2113.327543] fclkcfg amba:fpga-region0:fclk3: driver installed.
[ 2113.333792] fclkcfg amba:fpga-region0:fclk3: device name : fclk3
[ 2113.340138] fclkcfg amba:fpga-region0:fclk3: clock name : fclk3
[ 2113.346338] fclkcfg amba:fpga-region0:fclk3: clock rate : 62500000
[ 2113.352906] fclkcfg amba:fpga-region0:fclk3: clock enabled : 1


PS の FCLK の設定を示す。
ZYBOt_15_180818.png

fclk0 は 100 MHz でぴったりなのだが、fclk1 は 40 MHz のところ、約 38.9 MHz 、fclk2 は 72 MHz のところ、約 68.4 MHz 、fclk3 は 65 MHz のところ、62.5 MHz だった。
fclk0 は良いのだが、その他のクロックはずれすぎている。それに Clock Source も IO PLL, ARM PLL, DDR PLL と変更したい。
  1. 2018年08月18日 05:06 |
  2. Zybot
  3. | トラックバック:0
  4. | コメント:0