FC2カウンター FPGAの部屋

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

FPGAの部屋

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

UltraZed-EG Starter Kit のチュートリアル2

UltraZed-EG Starter Kit のチュートリアル1”の続き。

前回は、UltraZed-EG Starter Kit のチュートリアルを初めて、Vivado で論理合成、インプリメント、ビットストリームの生成まで実行できた。今回は、SDKでアプリケーションソフトを作成して、実機テストしてみよう。

前回、インプリメントが成功したので、File メニューからExport -> Export Hardware... を選択して、ハードウェアをエクスポートした。
File メニューからLaunch SDK を選択して、SDK を起動した。
UltraZed-EG_StKit_tut_34_171114.png

SDK の File メニューからNew -> Board Support Package を選択した。

standalone を選択している。Finish ボタンをクリックした。
UltraZed-EG_StKit_tut_35_171114.png

Hardware Platform をクリックして見ると、プロセッサが全選択できるようだ。
UltraZed-EG_StKit_tut_36_171114.png

Board Support Package Settings ダイアログが開いた。
UltraZed-EG_StKit_tut_37_171114.png

Overview の standalone をクリックすると、stdin と stdout が psu_uart_0 になっているのが見えた。
UltraZed-EG_StKit_tut_38_171114.png

OKボタンをクリックすると、SDK で standalone_bsp_0 が生成された。
UltraZed-EG_StKit_tut_39_171114.png

SDK のFile メニューから New -> Application Project を選択した。
Project Name にHello_UltraZed と入力し、Board Support Package は先ほど生成した standalone_bsp_0 を選択した。
UltraZed-EG_StKit_tut_40_171114.png

Next -> をクリックして、次のTemplate 画面でデフォルトの Hello World を選択したままで、Finish ボタンをクリックした。
UltraZed-EG_StKit_tut_41_171114.png

SDK にHello_UltraZed が生成された。
UltraZed-EG_StKit_tut_42_171114.png

Console 画面を示す。
UltraZed-EG_StKit_tut_43_171114.png

UltraZed_EG_Starter_Kit_Tutorial_VIvado_2016_4.pdf の 29 ページの”7 Setting up the Hardware ”からUltraZed-EG Starter Kit の設定を引用する。

Please perform the following steps to setup the UltraZed-EG Starter Kit.
・ Plug the UltraZed-EG SOM onto the IO Carrier Card via JX1/JX2/JX3 connectors and connect
the fan to the fan header (JP5) on the IO Carrier Card.
・ Set the UltraZed-EG SOM SW2 Boot Mode switch (MODE[3:0] = SW2[4:1]) to ON, ON, ON,
and ON positions (Boot Mode set to JTAG, MODE[3:0] = 0x0).
・ Install a jumper on the IO Carrier Card JP1.
・ Connect the USB A-mini-B cable to the U18 USB port (SMT2 JTAG module on the IO Carrier
Card) and the USB port of the PC. This will provide JTAG connection to the board.
・ Connect the USB A-mini-B cable to J11 on the IO Carrier Card and the USB port of the PC.
This will provide USB-UART connection to the board.
・ Connect 12V power supply to J7 on the IO Carrier Card.
・ Connect an Ethernet cable to the J5 RJ45 connector on the IO Carrier Card and the Gigabit
Ethernet port of the PC.
・ Slide the SW8 power switch to the ON position on the IO Carrier Card.
・ Start a Tera Term session and set the serial port parameters to 115200 baud rate, 8 bits, 1
stop bit, no parity and no flow control (please refer to the Setting up the Host PC section at
the end of this document for installing the software driver for the USB-UART port and setting
up the UART).
・ Set the IP address of your PC to 192.168.1.1 with subnet mask of 255.255.255.0.


この後で、UltraZed-EG Starter Kit のUSB-Serial のドライバが無かったので、Silicon Labs のCP21XXのドライバをインストールした。
UltraZed-EG_StKit_tut_44_171114.png

Hello_UltraZed を右クリックし、右クリックメニューからRun As -> Launch on Hardware (System Debugger) を選択した。
UltraZed-EG_StKit_tut_45_171114.png

Tera Term に Hello World が表示された。
UltraZed-EG_StKit_tut_46_171114.png
  1. 2017年11月16日 05:29 |
  2. UltraZed-EG
  3. | トラックバック:0
  4. | コメント:0

intel HLS コンパイラを試してみる8(image_downsampleを試す2)

intel HLS コンパイラを試してみる7(image_downsampleを試す1)”の続き。

前回は、image_downsample で build test-msvc と build test-x86-64 をやってみた。今回は、build test-fpga をやってみる。

build test-fpga コマンドを実行した。
test-fpga.exe を実行したが、実行に1時間半くらいかかってしまった。
Intel_HLS_64_171115.png

レポートを見てみよう。
Summary 当たり前だが、counter よりもリソース使用量が多い。
Intel_HLS_65_171115.png

Loops analysis 左の行をクリックすると対応するソースコードがハイライトされる。
Intel_HLS_66_171115.png

Area analysis of system こちらも左の行をクリックすると対応するソースコードがハイライトされる。
Intel_HLS_67_171115.png

Area analysis of source
Intel_HLS_68_171115.png

Component Viewer
Intel_HLS_69_171115.png

Component memory viewer
Intel_HLS_70_171115.png

Component memory viewer
Intel_HLS_71_171115.png

Verification statistics Latency は 257012 クロックだった。
Intel_HLS_77_171115.png

Quartus Prime 17.1 を立ち上げて、プロジェクトを読み込んだ。
コンパイルを行って、成功した。
Intel_HLS_72_171115.png

resize:resize_inst をダブルクリックすると、IP Parameter Editor が立ち上がった。
Intel_HLS_73_171115.png

ModelSimを立ち上げて、 intelFPGA_lite\17.1\hls\examples\image_downsample\test-fpga.prj\verification のvsim.wlf を読み込んだ。約257 us シミュレーションしている。
Intel_HLS_74_171115.png

wave ウインドウを拡大した。
Intel_HLS_75_171115.png

wave ウインドウをさらに拡大した。
original_image のready と valid はこの画面ではすべて 1 だが、resized_imag の valid は1クロックおき位に 1 と 0 を繰り返している。これは、リサイズした画面のほうが小さいからだろう。
Intel_HLS_76_171115.png
  1. 2017年11月15日 04:36 |
  2. intel HLS
  3. | トラックバック:0
  4. | コメント:0

intel HLS コンパイラのレポート

F:\intelFPGA_lite\17.1\hls\examples\counter\test-fpga.prj\reports フォルダにある report.html だが、たくさん画面があったので、貼っておきたいと思う。

まずはデフォルトのSummary 画面。
Intel_HLS_55_171114.png

View report をクリックするとメニューが出てくる。ここから見たい項目を選択する。
Loops analysis を選択した。
Intel_HLS_56_171114.png

Loops analysis
Intel_HLS_63_171114.png

Area analysis of system
Intel_HLS_57_171114.png

Area analysis of source
Intel_HLS_58_171114.png

Component Viewer。これ面白そう。
Intel_HLS_59_171114.png

コンポーネントにマウスをオーバーライドすると、情報が表示される。
Intel_HLS_60_171114.png

Component memory viewer。counter では情報が無いみたいだ。
Intel_HLS_61_171114.png

Verification statistics
Intel_HLS_62_171114.png
  1. 2017年11月14日 04:42 |
  2. intel HLS
  3. | トラックバック:0
  4. | コメント:0

UltraZed-EG Starter Kit のチュートリアル1

UltraZed-EG Starter Kit のチュートリアルをやってみることにした。

UltraZed-EG Starter Kit Tutorial – Vivado 2016.4 をダウンロードして、その中に UltraZed_EG_Starter_Kit_Tutorial_Vivado_2016_4.pdf が入っているので、それを見ながら、Vivado 2017.3 でチュートリアルをやっていくことにした。
UltraZed-EG_StKit_tut_1_171113.png

UltraZed_EG_SK_Tutorial_2016_4_v1.zip には、UltraZed-EG Starter Kit のボードファイルが入っていたが、ES のものだったので、Github/Avnet のbdf/ultrazed_3eg_iocc/1.0 にC バージョンのボードファイルがあった。
UltraZed-EG_StKit_tut_2_171113.png

Vivado 2017.3 の Vivado\2017.3\data\boards\board_files フォルダに ultrazed_3eg_iocc フォルダをコピーした。
UltraZed-EG_StKit_tut_3_171113.png

Vivado 2017.3 を立ち上げて、プロジェクトを新規作成した。
デフォルトで進むダイアログは書かないことにする。

Project Name ダイアログ。
UltraZed-EG_StKit_tut_4_171113.png

Default Part ダイアログ。無事に UltraZed-3EG IO Carrier Card が出てきた。
UltraZed-EG_StKit_tut_5_171113.png

New Project Summary ダイアログ。
UltraZed-EG_StKit_tut_6_171113.png

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

Create Block Design を行った。
UltraZed-EG_StKit_tut_8_171113.png

ブロックデザインで、Add IP を行った。 zynq で検索して、Zynq UltraScale + MPSoC をダブルクリックした。
UltraZed-EG_StKit_tut_9_171113.png

zynq_ultra_ps_e_0 が追加された。Run Block Automation をクリックする。
UltraZed-EG_StKit_tut_10_171113.png

Run Block Automation ダイアログ。
UltraZed-EG_StKit_tut_11_171113.png

UltraZed-3EG IO Carrier Card の設定が入ったはず。
UltraZed-EG_StKit_tut_12_171113.png

zynq_ultra_ps_e_0 をダブルクリックして、設定ダイアログを表示した。
UltraZed-EG_StKit_tut_13_171113.png

I/O Configuration 画面 1/3 、Zynq よりもMIO が増えているようだ。
UltraZed-EG_StKit_tut_14_171113.png

I/O Configuration 画面 2/3。
UltraZed-EG_StKit_tut_15_171113.png

I/O Configuration 画面 3/3 、GT Lane もMIOにできているみたいだ。
UltraZed-EG_StKit_tut_16_171113.png

Clock Configuration 、pl_clk0 が見当たらないがどこにあるんだろうか?
UltraZed-EG_StKit_tut_17_171113.png

(2017/11/15:追加)
Clock Configuration に Output Clocks タブがあった。ここで、PLへのクロック周波数を設定していた。
UltraZed-EG_StKit_tut_61_171114.png 

DDR Configuration
UltraZed-EG_StKit_tut_18_171113.png

PS-PL Configuration
UltraZed-EG_StKit_tut_19_171113.png

ダイアログを閉じた。
Vivado の真ん中上のウインドウで、DIP switches をダブルクリックした。
UltraZed-EG_StKit_tut_20_171113.png

Connect Board Component ダイアログが開いた。デフォルトのままOKボタンをクリックした。
UltraZed-EG_StKit_tut_21_171113.png

axi_gpio_0 が Add IP されたので、Run Block Automation をクリックした。
UltraZed-EG_StKit_tut_22_171113.png

Run Block Automation ダイアログが開いた。デフォルトのままOKボタンをクリックした。
UltraZed-EG_StKit_tut_23_171113.png

2つ IP が追加され、配線された。
UltraZed-EG_StKit_tut_24_171113.png

Vivado の真ん中上のウインドウで、LED をダブルクリックした。
Connect Board Component ダイアログが開いた。デフォルトのままOKボタンをクリックした。
UltraZed-EG_StKit_tut_25_171113.png

axi_gpio_0 に GPIO2 が追加された。
UltraZed-EG_StKit_tut_26_171113.png

Vivado の真ん中上のウインドウで、Push buttons をダブルクリックした。
Connect Board Component ダイアログが開いた。デフォルトのままOKボタンをクリックした。
UltraZed-EG_StKit_tut_27_171113.png

axi_gpio_1 が追加された。Run Block Automation をクリックした。
UltraZed-EG_StKit_tut_28_171113.png

Run Block Automation ダイアログが表示された。デフォルトのままOKボタンをクリックした。
UltraZed-EG_StKit_tut_29_171113.png

ブロックデザインが完成した。
Validate Design をクリックした。
UltraZed-EG_StKit_tut_30_171113.png

成功した。
UltraZed-EG_StKit_tut_31_171113.png

Vivado の真ん中上のウインドウをSource タブをクリックし、design_1 を右クリックして、右クリックメニューから Create HDL Wapper... を選択した。
Creater HDL Wapper ダイアログが表示された。デフォルトのままOKボタンをクリックした。
design_1_wrapper.v が生成されて、トップのファイルになった。
UltraZed-EG_StKit_tut_32_171113.png

Flow Navigator から Generate Bitstream をクリックした。
ダイアログがいくつか開いたが、デフォルトのままOKボタンをクリックした。
論理合成、インプリメント、ビットストリームの生成が行われ、成功した。結果を示す。
UltraZed-EG_StKit_tut_33_171113.png
  1. 2017年11月14日 04:15 |
  2. UltraZed-EG
  3. | トラックバック:0
  4. | コメント:0

intel HLS コンパイラを試してみる7(image_downsampleを試す1)

intel HLS コンパイラを試してみる6(counter.cpp のコードを変更した)”の続き。

今回から counter を終了して、次のexample の image_downsample を試してみよう。 image_downsample はbmp ファイルの縦横のサイズを小さくするアプリケーションのようだ。

image_downsample のフォルダを示す。
Intel_HLS_45_171112.png

ファイルがたくさんあるが、bmp_tools.cpp は bmp のread と write を受け持っているようだ。
resize.cpp は画像のリサイズをするようだ。ここにハードウェアになる予定の

component void resize(unsigned ratio, int rows, int cols, input_image_stream& original_image, output_image_stream& resized_image);

がある。
Intel_HLS_46_171112.png

ここでは、入出力が

input_image_stream& original_image, output_image_stream& resized_image

で行われているが、これは、resize.h で

typedef ihc::stream_in<unsigned int=""> input_image_stream;
typedef ihc::stream_out<unsigned int=""> output_image_stream;

で定義されている。
これらは、Avalon® Streaming Interface のようだ。Intel High Level Synthesis Compiler User Guide のAvalon® Streaming Interface Arguments を見ると書いてある。
Avalon® Streaming Interface は入力は、read メソッドでストリームから読めて、出力は write メソッドでストリームに書けるようだ。

resize をどこから使っているか?というと main.cpp で呼ばれている。
Intel_HLS_47_171112.png
test.bmp を読んで、downsampled.bmp にダウンサンプリングして、expected.bmp と縦横サイズを比較しているようだ。

さて、build してみよう。その前に build.bat を -march=CycloneV -ghdl に修正した。
Intel_HLS_48_171112.png

これで build test-msvc を実行した。
次に、test-msvc.exe で実行した。
Intel_HLS_49_171112.png

増えたファイルを示す。
Intel_HLS_50_171112.png

test.bmp がこれだ。
Intel_HLS_53_171112.png

downsampled.bmp がこれだ。
Intel_HLS_54_171112.png

次に、build test-x86-64 コマンドを実行した。
test-x86-64.exe を実行した。
Intel_HLS_51_171112.png

増加したファイルを示す。
Intel_HLS_52_171112.png
  1. 2017年11月13日 04:57 |
  2. intel HLS
  3. | トラックバック:0
  4. | コメント:0

intel HLS コンパイラを試してみる6(counter.cpp のコードを変更した)

intel HLS コンパイラを試してみる5( ihc_hls_enqueue() と ihc_hls_component_run_all() )”の続き。

前回は、ihc_hls_enqueue() でキューに入れた実行待ち行列を ihc_hls_component_run_all() で実行するとパイプライン実行されるということが分かった。カウンタでは、1クロックごとに 1 カウントアップされている。
それでは、パイプライン実行しないとどうなるのか?をやってみた。

まずは、examples フォルダの下に、counter2 フォルダを作成して、build.bat と counter.cpp をコピーした。
そうして、counter.cpp を下の様に修正した。これは、ihtel HLS の counter.cpp のコードを参照して、変更している。
Intel_HLS_37_171110.png

build test-fpga を実行した。
ModelSim を立ち上げて、F:\intelFPGA_lite\17.1\hls\examples\counter2\test-fpga.prj\verification の vsim.wlf を読み込んだ。
Intel_HLS_38_171110.png

ihc_hls_enqueue() と ihc_hls_component_run_all() を使用したときは、1クロックで1カウントしている。
Intel_HLS_36_171110.png

しかし、ihc_hls_enqueue() と ihc_hls_component_run_all() を使用していない今回は、11クロックで 1 カウントだ。
2017/11/12:修正 startの 1 へのアサートが1クロックだけなので、11クロックに1クロックしかカウントしないことになっていました。つまりテストベンチの問題のようです。ハードウェアには関係ないようです。@Venginner さん、ご指摘ありがとうございました)
Intel_HLS_39_171110.png

次に、Quartus Prime でコンパイルしてみたところ、パイプライン実行の時と同じリソース使用量だった。何でだろうか?
Intel_HLS_40_171112.png


次に、普通に for() 文で書いたらどうなるのだろうか?
counter3 フォルダも作って、もう一度、build.bat と counter.cpp をコピーした。
component 文を修正して、for() 文に変更した。

#include "HLS/hls.h"
#include <stdio.h>

using namespace ihc;

const int SIZE = 100;

component int count(unsigned int &cnt) {
  for(int i=0; i<SIZE; i++)
    cnt++;
  return(0);
}

int main() {
  unsigned int cnt=0;

  count(cnt);

  if (cnt == 100) {
    printf("PASSED\n");
  }
  else {
    printf("FAILED\n");
  }

  return 0;

}


build test-fpga を実行すると、vsim.wlf が生成されなかった。何度かビルドを繰り返すと生成されるときがあった。
test-fpga はPASSED になっている。
Intel_HLS_43_171112.png

ModelSim で vsim.wlf を見ると、avmm_0_rw_... のポートがあって、Avalon MM の信号が入っている。つまり、cnt を参照呼出しにしたので、メモリにRead/Write するようになったのだろうか?でも cnt は 0 になっている。動作しないようだ。
Intel_HLS_41_171112.png

Quartus Prime を立ち上げた。トップファイルを見ると、やはりAvalon MM の信号が入っている。
Intel_HLS_42_171112.png

コンパイルしてみたが、やはり、リソース使用量が多い。
Intel_HLS_44_171112.png

このソースコードはうまく行かないようだ。
  1. 2017年11月12日 04:55 |
  2. intel HLS
  3. | トラックバック:0
  4. | コメント:0

intel HLS コンパイラを試してみる5( ihc_hls_enqueue() と ihc_hls_component_run_all() )

intel HLS コンパイラを試してみる4(ModelSim)”の続き。

intel HLS はIntel High Level Synthesis Compiler User Guide によると component で宣言された関数がHDLになるように書いてあるが、それだけでもないようだ。

intel HLS のサンプルの counter.cpp はcomponent 文の中身は

return c++

だけだが、100カウントするHDL が生成されている。これは、component 文だけではなく、main() の一部も合成されているのではないだろうか?今のところその境界がどこにあるのかが謎である?

さて、この counter.cpp には、

ihc_hls_enqueue(&result[i], &count);

で、count() を読んだ結果の戻り値を result[i] に入れて、キューに積んで、

ihc_hls_component_run_all(count);

でキューの内容を実行するとパイプライン実行になるようだ。これは、Intel High Level Synthesis Compiler User Guide の High-Throughput Simulation (Asynchronous Component Calls) Using Enqueue Function Calls に書いてある。
この結果は、”intel HLS コンパイラを試してみる4(ModelSim)”の最後のModelSim のWave ウインドウを見るとわかる。
Intel_HLS_36_171110.png

この波形を見ると1クロックで1カウント進んでいるのが分かると思う。count() の動作がインプリメントして、リターンするということを考えると、パイプライン実行されているということが言えると思う。

それじゃ、これを使わない実装にするとどうなるのか?
もうできているが、時間切れなので、明日書くことにする。
  1. 2017年11月11日 07:45 |
  2. intel HLS
  3. | トラックバック:0
  4. | コメント:0