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

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

FPGAの部屋

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

「未来のミライ」(映画)を見てきました

昨日、「未来のミライ」(映画)を見てきました。
Yahoo映画では不評ですが、私的には良かったです。くんちゃんの成長が描かれていたと思います。下の子が生まれるとどうしてもこうなりますが、どこでもそのようなもので、懐かしく思い出しました。その時はそれどころじゃないですけどね。。。
  1. 2018年08月06日 05:37 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Ultra96用PMOD拡張ボードのPMOD端子のテストのために8ビットカウンタのLチカを作る2

Ultra96用PMOD拡張ボードのPMOD端子のテストのために8ビットカウンタのLチカを作る”の続き。

前回は、Lチカ IP をVivado HLS で作成した。今回はそのLチカ IP をVivado で実装した。

Vivado で ex_board_test プロジェクトを作成した。
ex_board_test.bd のブロック・デザインを作成した。
Ultra96_ext_board_32_180806.png

Ultra96_ext_board_33_180806.png

Lチカ IPの ex_board_test IP を 2 個入れてある。2 個のPMODコネクタに対応するためだ。

論理合成、インプリメンテーション、ビットストリームの生成を行った。
結果を示す。1 MHz の動作なので余裕がある。
Ultra96_ext_board_34_180806.png
Ultra96_ext_board_35_180806.png

ハードウェアをエクスポートし、SDK を起動した。
Hello World プロジェクトを作成した。こうしないとARMプロセッサがコンフィグレーションされない。
Ultra96_ext_board_36_180806.png

Hello World を起動した。Lチカが始まったがLEDが暗くて良く見えないが点滅している。電圧を測ると1.6 V 程度だった。
マニュアルを改めてよく読むと、プルアップ抵抗が必要のようだ。orz...
今の拡張基板に抵抗をハンダ付けして動作するかどうか?試してみよう。基板の改版はそれからだ。
  1. 2018年08月06日 05:22 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96用PMOD拡張ボード7(部品を実装した)

Ultra96用PMOD拡張ボード6(基板が届いた)”の続き。

前回は、Ultra96用PMOD拡張ボードが届いたので、今回は、部品を実装して、Ultra96ボードに挿入した。
Ultra96_ext_board_29_180805.jpg

部品を実装したUltra96用PMOD拡張ボードの表。
Ultra96_ext_board_30_180805.jpg

部品を実装したUltra96用PMOD拡張ボードの裏。
Ultra96_ext_board_31_180805.jpg

写真撮るの難しい。昼間に取れば良いのかな?
  1. 2018年08月05日 04:19 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96用PMOD拡張ボードのPMOD端子のテストのために8ビットカウンタのLチカを作る

Ultra96拡張ボードのPMOD端子のテストのために8ビットカウンタを作って2つのPMOD端子の 8 ビットに出力して出力できるかを見たい。

やはり、Vivado HLS 2018.2 で作ってみようと思う。8 ビットカウンタの最下位ビットは 4 HzでLチカして、最上位ビットは32秒間隔でLチカするようにしてみよう。そうすれば隣のピンとの接触も分かるに違いない。

Vivado HLS 2018.2 を使用して、ex_board_test プロジェクトを作成した。
Ultra96_ext_board_20_180804.png

ex_board_test.cpp を貼っておく。

// ex_board_test.cpp
// 2018/08/04 by marsee
// 1MHzのクロックを分周してoutcに上8ビットを割り当て
// 一番下は4Hz、一番上は1/32Hz

#include <ap_int.h>

void ex_board_test(ap_uint<8> &outc){
//#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS INTERFACE ap_none port=outc
    unsigned int i;

    for(i=0; i<33554432; i++){
        outc = i>>17;
    }
}


どうしてこの値になったか?というと、1MHz は 1000000 Hz なので、それを超えて一番近い 16 進数でぴったりの数は 0x100000 = 1,048,576(10進数)である。なので、ここを基準として、3 ビット分は 4 Hz , 2 Hz , 1 Hz なので 0x20 を掛けて、0x2000000 = 33,554,432(10進数)とした。(1 Hz は 0 → 1 で 1 セット)
Ultra96_ext_board_25_180804.png

次にテストベンチを示す。

// ex_board_test_tb.cpp
// 2018/08/04 by marsee
//

#include <ap_int.h>

void ex_board_test(ap_uint<8> &outc);

int main(){
    ap_uint<8> outc;

    ex_board_test(outc);

    printf("outc = %x\n", (unsigned int)outc);

    return(0);
}


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

outc = ff でこれで良いはず。

C コードの合成を行った。
Ultra96_ext_board_22_180804.png

Timing のTarget は 1000 ns だったが、Estimated は 1.133 ns で全く問題ない。
Latency は 33,554,433 で 1 クロック多いだけだった。
リソース使用量は FF が 28 個、LUT が 77 個だった。

C/RTL 協調シミュレーションを行った。
Ultra96_ext_board_23_180804.png

Latency は 33,554,433 だった。

C/RTL 協調シミュレーション波形を示す。
Ultra96_ext_board_24_180804.png

0x90 と 0x91 の間隔は 262 ms 程度で 4 Hz になっている。これで予定通りだ。

次に、

#pragma HLS INTERFACE ap_ctrl_none port=return

のコメントを外した。これは、この回路をフリーランさせたいためだ。
Ultra96_ext_board_26_180804.png

C コードの合成を行った。
Ultra96_ext_board_27_180804.png

コメントを外す前と同じだった。
合成されたVHDL ファイルを示す。

entity ex_board_test is
port (
    ap_clk : IN STD_LOGIC;
    ap_rst : IN STD_LOGIC;
    outc_V : OUT STD_LOGIC_VECTOR (7 downto 0) );
end;


ap_clk と ap_rst、そして出力 8 ビットの outc があるのが分かる。

Export RTLを行った。なお、Vivado synthesis, place and route にチェックを入れてある。
Ultra96_ext_board_28_180804.png

LUT が 12 個、FF が 28 個だった。CP achieved post-implementation が 1.753 ns で全く問題ない。
  1. 2018年08月04日 20:42 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Kerasで学習した重みとバイアスを使用した白線間走行用CNNをIPにする2

Kerasで学習した重みとバイアスを使用した白線間走行用CNNをIPにする1”の続き。

前回は、”カーブ、直線用白線間走行用畳み込みニューラルネットワーク13(AXI4 Stream版CNN IP 1)”の curve_conv_nn2_axis3 プロジェクトを利用して、curve_conv_nn2_axis3_k プロジェクトを作成し、C シミュレーションを行った。今回は、C コードの合成、Export RTLを行う。

C Synthesis ボタンをクリックして、C コードの合成を行った。結果を示す。
keras_curve_line_11_180804.png
keras_curve_line_12_180804.png

Estimated は 8.313 ns でTarget の 10 ns に比べて余裕がある。
Latency は 178833 クロックで、クロックが 100 MHz とすると 1.79 ms ということになる。以前は、1.94 ms だったので、Vivado HLS のバージョンが進んで最適化が進んだのかもしれない?
リソース使用量はBRAM_18Kが 13 個、DSP48E が 8 個、FF が 977 個、LUT が 2801 個で、以前と比べて大体減っているが、LUT は大幅に増えている。

次に、Export RTLを行った。なお、Vivado synthesis, place and route にチェックを入れてある。
結果を示す。
keras_curve_line_13_180804.png

LUT が 794 個、FF が 673 個、DSP が 3 個、BRAM が 16 個という結果になった。LUT、FF、DSP、は減っているが、BRAM は増えている。特にDSP はどうして 8 個から 3 個に減ってしまったのか?
  1. 2018年08月04日 05:42 |
  2. TensorFlow, Keras
  3. | トラックバック:0
  4. | コメント:0

Kerasで学習した重みとバイアスを使用した白線間走行用CNNをIPにする1

Kerasで学習した重みとバイアスを使用した白線間走行用CNNをVivado HLSで確かめる
Kerasで学習した重みとバイアスを使用した白線間走行用CNNをVivado HLSで確かめる2
で、Kerasで学習した重みとバイアスは使えるということが分かったので、実際にIP 化してみよう。

カーブ、直線用白線間走行用畳み込みニューラルネットワーク13(AXI4 Stream版CNN IP 1)”の curve_conv_nn2_axis3 プロジェクトを利用して、curve_conv_nn2_axis3_k プロジェクトを作成した。とりあえずは、ZYBO 用だ。

curve_conv_nn2_axis3_k プロジェクトを作成し、さっそく、C シミュレーションを行ったが、エラーとなってしまった。
keras_curve_line_8_180802.png

エラー内容は

./csim.exe: error while loading shared libraries: libOpenCL.so.1

でOpenCL のライブラリがないということかな?
ググると、”libOpenCL.so.1 error when starting claymore”がヒットした。
それによると解決策は、

sudo apt update
sudo apt install ocl-icd-opencl-dev

ということだったので、早速インストールした。
keras_curve_line_9_180802.png

その後、C シミュレーションを行ったところ、問題なく終了した。
keras_curve_line_10_180802.png

59 枚の実際にZYBOt の車載カメラから撮影した画像を使用して、エラーを見たところ、直進データはすべて正解、左旋回データもすべて正解だが、右旋回の 1 個だけ、正解は2 だけど、1 に間違っていた。

Straight error is 0

Left error is 0

*test_images_171129/right_turn_test8.bmp
correct data = 2, outs = 1
dot2[0] = -1.498047 dot2[1] = 1.787109 dot2[2] = -0.345703
Right error is 1


カーブ、直線用白線間走行用畳み込みニューラルネットワーク13(AXI4 Stream版CNN IP 1)”の curve_conv_nn2_axis3 プロジェクトでは、左旋回で 1 回、間違っていたが、今回の curve_conv_nn2_axis3 プロジェクトでは、左旋回でのエラーは無かったが、右旋回でのエラーが出てしまっている。
  1. 2018年08月03日 04:19 |
  2. TensorFlow, Keras
  3. | トラックバック:0
  4. | コメント:0

Ultra96用PMOD拡張ボード6(基板が届いた)

Ultra96用PMOD拡張ボード5”の続き。

前回は、ガーバー・ファイルを出力してSeeedStudio で発注した。昨日、DHL で基板が届いた。

Ultra96_ext_board_17_180802.jpg

基板の色は赤にした。板厚は通常の 1.6 mm にした。

表面。
Ultra96_ext_board_18_180802.jpg

裏面。
Ultra96_ext_board_19_180802.jpg

部品はすべて来ているので、実装して確かめてみよう。
  1. 2018年08月02日 04:15 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Kerasで学習した重みとバイアスを使用した白線間走行用CNNをVivado HLSで確かめる2

Kerasで学習した重みとバイアスを使用した白線間走行用CNNをVivado HLSで確かめる”の続き。

前回は、「ゼロから作るDeep Learning」のPython コードを使用して、学習した重みとバイアスをC のヘッダファイルにしたものを使用してVivado HLSで精度を確かめたブログ記事が”カーブ、直線用白線間走行用畳み込みニューラルネットワーク11(Vivado HLS でCNN を実装)”だ。これを重みとバイアス以外は使用して、Kerasで学習した重みとバイアスのVivado HLS 2018.2 での精度を見た。今回は、C コードの合成をやってみよう。

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

Estimated 8.682 ns で問題ない。
Latency は 171774 クロックで、100 MHz 動作では約 1.72 ms となる。
リソース使用量はBRAM_18Kが 14 個、DSP48E が 8 個、FF が 791 個、LUT が 2704 個だった。
  1. 2018年08月01日 05:09 |
  2. TensorFlow, Keras
  3. | トラックバック:0
  4. | コメント:0