Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Vivado hls勉強会1(基礎編)

19,907 views

Published on

Vivado HLS勉強会資料の最初です。
掛け算回路をC言語で書いてVivado HLSでIPにします。そのIPをVivadoでZYBO用にインプリメントして、スイッチとLEDを使って動作させます。
Vivado HLSを使う時の初めの1歩として、いかがでしょうか?

Published in: Technology
  • If you want to download or read this book, copy link or url below in the New tab ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { http://bit.ly/2m77EgH } ......................................................................................................................... Download EPUB Ebook here { http://bit.ly/2m77EgH } .........................................................................................................................
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • ACCESS that WEBSITE Over for All Ebooks (Unlimited) ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { http://bit.ly/2m77EgH } ......................................................................................................................... DOWNLOAD FULL EPUB Ebook here { http://bit.ly/2m77EgH } ......................................................................................................................... Download Full PDF EBOOK here { http://bit.ly/2m77EgH } ......................................................................................................................... Download EPUB Ebook here { http://bit.ly/2m77EgH }
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • -- DOWNLOAD THIS BOOKS INTO AVAILABLE FORMAT -- ......................................................................................................................... ......................................................................................................................... Download FULL PDF EBOOK here { http://bit.ly/2m77EgH } ......................................................................................................................... (Unlimited)
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • ..............ACCESS that WEBSITE Over for All Ebooks ................ ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Full EPUB Ebook here { http://bit.ly/2m6jJ5M } .........................................................................................................................
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • If you want to download or read this book, copy link or url below in the New tab ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { https://urlzs.com/UABbn } .........................................................................................................................
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Vivado hls勉強会1(基礎編)

  1. 1. 1 Vivado HLS勉強会1 (基礎編) 小野 雅晃
  2. 2. 2 事前準備 ● Vivado 2015.4をVivado HLS付きでインストール しておいてください
  3. 3. 3 注意点 ● 元はVivado HLS 2014.4で作製した資料を修正が 必要なところだけVivado HLS 2015.4に修正して あります ● よって、Vivado HLSのウインドウにOpen Wave viewer…が無い画面がありますがご了承下さい
  4. 4. 4 Windowsの弱点と克服方法 ● VivadoをWindowsで使う場合はフォルダを深い階層ま で作るので、すぐにWindowsのパス名の長さの限界に 達してしまう ● Windowsのパス名の長さの限界は260文字。 ● 解決策 ー substコマンドを使おう ● substコマンドはフォルダにドライブを割り振るコマンド – 例えばC:UsersOnoDocumentsHDLZynqZYBOSimを Z:ドライブに割り当てる – コマンド プロンプトを立ち上げて下のコマンドを入力する – subst z: C:UsersOnoDocumentsHDLZynqZYBOSim
  5. 5. 5 Vivado HLS勉強会の進め方 ● 基本的にハンズオン – 自分で資料を見ながらチュートリアルをやってみてくださ い ● 各単元ごとに説明します – 黒のタイトル ー ハンズオン・スライドなど – 青のタイトル ー 説明のスライド ● 眠くなるので、説明のみは概要の説明だけです
  6. 6. 6 掛け算器ブロック図 * multi_in0multi_in0 multi_in1 multi_out 8 ビット 8 ビット 16 ビット 組み合わせ回路
  7. 7. 7 C++ソースコード (multi_apuint.cpp) // multi_apuint.cpp #include <ap_int.h> void multi_apuint(ap_uint<8> multi_in0, ap_uint<8> multi_in1, ap_uint<16> *multi_out){ *multi_out = multi_in0 * multi_in1; }
  8. 8. 8 これから何するのか?1 ● Vivado HLS 2015.4 – 掛け算のプロジェクト、Cソースコードの作製 – Cのテストベンチを作製してCシミュレーション – CからHDLを生成 – C/RTLコシミュレーション – VivadoでC/RTLコシミュレーションの波形を確認 – ディレクティブを追加して再度CからHDLを生成 – IPとしてパッケージ
  9. 9. 9 これから何するのか?2 ● Vivado 2015.4 – Vivadoでプロジェクトを作製 – Vivado HLSプロジェクト(multi_apuint)のIPをIP Catalogに登録 – ブロックデザインにIPを追加し、回路を構成 – 制約ファイルを追加 – 論理合成、インプリメント、ビットストリームの生成 – 実機確認
  10. 10. 10 Vivado HLS→Vivadoの手順 Vivado HLSで C/C++ソースコード作成 Cシミュレーション Cシミュレーションでデバック ソースコード修正 Cコードの合成 条件を満たさない場合 ソースコード、 指示子(ディレクティブ)の修正 C/RTLコシミュレーション IPパッケージの出力 Vivado HLSのIPを IP Catalogに追加 IP Integratorのブロックデザイン にIPを追加、回路の構成 Vivadoの新規 プロジェクトの作成 制約ファイルを 追加 論理合成、インプリメント ビットストリームの生成 実機確認 Vivado HLSでの手順 Vivadoでの手順 GONG NG NG GO GO GO NG C/RTLコシミュレーションを 省略した場合 NG
  11. 11. 11 これから何するのか?1 ● Vivado HLS 2015.4 – 掛け算のプロジェクト、Cソースコードの作製 – Cのテストベンチを作製してCシミュレーション – CからHDLを生成 – C/RTLコシミュレーション – VivadoでC/RTLコシミュレーションの波形を確認 – ディレクティブを追加して再度CからHDLを生成 – IPとしてパッケージ
  12. 12. 12 Vivado HLS 2015.4の起動と 新規プロジェクト作製 ● Vivado HLS 2015.4を起動する ● Create New Projectをクリックして、新規プロジェクトを作製する
  13. 13. 13 プロジェクト作成パスと プロジェクト名の指定 ● Locationに適当なフォルダを指定する(ここでは、V_HLS_study_meetingを指 定した) ● Project nameにmulti_apuintを入力する ● Next >ボタンをクリックする
  14. 14. 14 Add/Remove C-based source files ● デフォルト状態で、Next >ボタンをクリックする
  15. 15. 15 Add/Remove C-based testbench files ● デフォルト状態で、Next >ボタンをクリックする
  16. 16. 16 Solution Configuration 1 ● solution1の設定を行う ● Clock Periodは10(ns)なので、そのままとする ● FPGAの種類を選択するためにPart Selectionの…ボタンをクリックする
  17. 17. 17 Device Selection Dialog ● Filterを上図のように設定する ● xc7z010clg400-1を選択して、OKボタンをクリックする
  18. 18. 18 Solution Configuration 2 ● Part SelectionのPartにxc7z010clg400-1が設定された ● Finishボタンをクリックする
  19. 19. 19 Vivado HLS起動 ● Vivado HLSが起動した
  20. 20. 20 New Source ● ProjectメニューからNew Source…を選択して、新 しいC++ファイルを作製する
  21. 21. 21 c++ソースファイルの生成 ● ファイル名にmulti_apuint.cppと入力する ● 保存ボタンをクリックする
  22. 22. 22 multi_apuint.cpp ● C++コードを入力し、セーブボタンをクリックする
  23. 23. 23 C++ソースコード (multi_apuint.cpp) // multi_apuint.cpp #include <stdio.h> #include <string.h> #include <ap_int.h> void multi_apuint(ap_uint<8> multi_in0, ap_uint<8> multi_in1, ap_uint<16> *multi_out){ *multi_out = multi_in0 * multi_in1; }
  24. 24. 24 CとC++の任意精度型 ● Cの任意精度型 – #include “ap_cint.h” – int15 aaa - 符号付き15ビット幅 – uint52 bbb ー 符号なし52ビット幅 – 幅の最大値は1024ビット ● C++の任意精度型 – #include “ap_int.h” – ap_int<96> aaa - 符号付き96ビット幅 – ap_uint<128> bbb ー 符号なし128ビット幅 – デフォルトの値の幅は1024ビットだが、32768までの値なら ば設定することができる
  25. 25. 25 Vivado HLSで取扱いできるデータ型 ● (unsigned) char、 (unsigned) short、 (unsigned) int ● (unsigned) long、 (unsigned) long long ● float、 double ● 任意精度型(int15, ap_int<56>)
  26. 26. 26 関数の引数のタイプによる 入力ポート、出力ポートの生成 ● void test(ap_int<8> aaa, ap_int<8> *bbb){ } ● 値渡し(aaa)の場合は入力ポート ● ポインタ渡し(bbb)の場合は入力ポートにも出力 ポートにもなる ● 例えば、*bbb = aaa + 1; だと出力ポートのみ ● *bbb += aaa; だったら入力ポートと出力ポートの 両方が生成される
  27. 27. 27 これから何するのか?1 ● Vivado HLS 2015.4 – 掛け算のプロジェクト、Cソースコードの作製 – Cのテストベンチを作製してCシミュレーション – CからHDLを生成 – C/RTLコシミュレーション – VivadoでC/RTLコシミュレーションの波形を確認 – ディレクティブを追加して再度CからHDLを生成 – IPとしてパッケージ
  28. 28. 28 テストベンチファイルの生成 ● ExplorerのTest Benchを右クリックし、右クリックメ ニューからNew File...を選択する
  29. 29. 29 multi_apuint_tb.cpp ● ファイル名にmulti_apuint_tb.cppと入力する ● 保存ボタンをクリックする
  30. 30. 30 テストベンチを保存 ● テストベンチのC++コードを入力し、セーブボタンを クリックする
  31. 31. 31 テストベンチのソースコード (multi_apuint_tb.cpp) // multi_apuint_tb.c #include <stdio.h> #include <string.h> #include <ap_int.h> int multi_apuint(ap_uint<8> multi_in0, ap_uint<8> multi_in1, ap_uint<16> *multi_out); int main(){ using namespace std; ap_uint<8> multi_in0; ap_uint<8> multi_in1; ap_uint<16> multi_out; multi_in0 = 10; multi_in1 = 10; multi_apuint(multi_in0, multi_in1, &multi_out); cout << "multi_out = " << multi_out << endl; if (multi_out == (multi_in0*multi_in1)) return(0); else return(1); }
  32. 32. 32 Cシミュレーション ● Run C Simulationボタンをクリックして、Cシミュ レーションを行う
  33. 33. 33 C Simulation Dialog ● ダイアログが開く ● OKボタンをクリックする
  34. 34. 34 Cシミュレーション結果 ● Cシミュレーション結果が表示された ● 10 x 10 = 100
  35. 35. 35 これから何するのか?1 ● Vivado HLS 2015.4 – 掛け算のプロジェクト、Cソースコードの作製 – Cのテストベンチを作製してCシミュレーション – CからHDLを生成 – C/RTLコシミュレーション – VivadoでC/RTLコシミュレーションの波形を確認 – ディレクティブを追加して再度CからHDLを生成 – IPとしてパッケージ
  36. 36. 36 Top Functionの指定1 ● Cコードを合成する前に、Top Functionを指定する。 ● これがCコードの合成の最上位関数になる。 ● ProjectメニューからProject Settings...を選択する
  37. 37. 37 Top Functionの指定2 ● 左のウインドウで、Synthesisを選択する ● Top Functionの右のBrows...ボタンをクリックする
  38. 38. 38 Top Functionの指定3 ● multi_apuint.cppのmulti_apuintを選択する ● OKボタンをクリックする
  39. 39. 39 Top Functionの指定4 ● Top Functionにmulti_apuintが入った ● OKボタンをクリックする
  40. 40. 40 Cコードの合成 ● Run C Synthesisボタンをクリックして、Cソース コードの合成を行う
  41. 41. 41 Cコードの合成結果 ● TimingのSummaryでClockのTarget周期が10nsのところ、 6.38nsなので問題無い ● Uncertaintyはクロックのばらつきの値(デフォルト:12.5%)
  42. 42. 42 Cコードの合成結果2 ● 下にスクロールして合成結果を見る ● Latencyは0、Intervalは1 ● DSP48Eを1個のみ使用している
  43. 43. 43 HDLコードの確認 ● Verilog HDL(multi_apuint.v) ● VHDL(multi_apuint.vhd) ● 2つのHDLファイルが生成されている
  44. 44. 44 Verilog HDLコード(multi_apuint.v) 1/3``timescale 1 ns / 1 ps (* CORE_GENERATION_INFO="multi_apuint,hls_ip_2015_4, {HLS_INPUT_TYPE=cxx,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=1,HLS_INPUT_PART= xc7z010clg400- 1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK=6.38000 0,HLS_SYN_LAT=0,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=1,HLS_SYN_FF =0,HLS_SYN_LUT=0}" *) module multi_apuint ( ap_start, ap_done, ap_idle, ap_ready, multi_in0_V, multi_in1_V, multi_out_V, multi_out_V_ap_vld ); parameter ap_const_logic_1 = 1'b1; parameter ap_true = 1'b1; parameter ap_const_logic_0 = 1'b0;
  45. 45. 45 Verilog HDLコード(multi_apuint.v) 2/3 input ap_start; output ap_done; output ap_idle; output ap_ready; input [7:0] multi_in0_V; input [7:0] multi_in1_V; output [15:0] multi_out_V; output multi_out_V_ap_vld; reg multi_out_V_ap_vld; wire [7:0] r_V_fu_43_p0; wire [7:0] r_V_fu_43_p1; wire [15:0] r_V_fu_43_p00; wire [15:0] r_V_fu_43_p10; always @ (ap_start) begin if (~(ap_start == ap_const_logic_0)) begin multi_out_V_ap_vld = ap_const_logic_1; end else begin multi_out_V_ap_vld = ap_const_logic_0; end end
  46. 46. 46 Verilog HDLコード(multi_apuint.v) 3/3 assign ap_done = ap_start; assign ap_idle = ap_const_logic_1; assign ap_ready = ap_start; assign multi_out_V = (r_V_fu_43_p0 * r_V_fu_43_p1); assign r_V_fu_43_p0 = r_V_fu_43_p00; assign r_V_fu_43_p00 = multi_in1_V; assign r_V_fu_43_p1 = r_V_fu_43_p10; assign r_V_fu_43_p10 = multi_in0_V; endmodule //multi_apuint
  47. 47. 47 VHDL HDLコード(multi_apuint.vhd) 1/3 library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; entity multi_apuint is port ( ap_start : IN STD_LOGIC; ap_done : OUT STD_LOGIC; ap_idle : OUT STD_LOGIC; ap_ready : OUT STD_LOGIC; multi_in0_V : IN STD_LOGIC_VECTOR (7 downto 0); multi_in1_V : IN STD_LOGIC_VECTOR (7 downto 0); multi_out_V : OUT STD_LOGIC_VECTOR (15 downto 0); multi_out_V_ap_vld : OUT STD_LOGIC ); end;
  48. 48. 48 VHDL HDLコード(multi_apuint.vhd) 2/3 architecture behav of multi_apuint is attribute CORE_GENERATION_INFO : STRING; attribute CORE_GENERATION_INFO of behav : architecture is "multi_apuint,hls_ip_2015_4, {HLS_INPUT_TYPE=cxx,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=1,HLS_INPU T_PART=xc7z010clg400- 1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK= 6.380000,HLS_SYN_LAT=0,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DS P=1,HLS_SYN_FF=0,HLS_SYN_LUT=0}"; constant ap_const_logic_1 : STD_LOGIC := '1'; constant ap_true : BOOLEAN := true; constant ap_const_logic_0 : STD_LOGIC := '0'; signal r_V_fu_43_p0 : STD_LOGIC_VECTOR (7 downto 0); signal r_V_fu_43_p1 : STD_LOGIC_VECTOR (7 downto 0); signal r_V_fu_43_p00 : STD_LOGIC_VECTOR (15 downto 0); signal r_V_fu_43_p10 : STD_LOGIC_VECTOR (15 downto 0); begin
  49. 49. 49 VHDL HDLコード(multi_apuint.vhd) 3/3ap_done <= ap_start; ap_idle <= ap_const_logic_1; ap_ready <= ap_start; multi_out_V <= std_logic_vector(resize(unsigned(r_V_fu_43_p0) * unsigned(r_V_fu_43_p1), 16)); -- multi_out_V_ap_vld assign process. -- multi_out_V_ap_vld_assign_proc : process(ap_start) begin if (not((ap_start = ap_const_logic_0))) then multi_out_V_ap_vld <= ap_const_logic_1; else multi_out_V_ap_vld <= ap_const_logic_0; end if; end process; r_V_fu_43_p0 <= r_V_fu_43_p00(8 - 1 downto 0); r_V_fu_43_p00 <= std_logic_vector(resize(unsigned(multi_in1_V),16)); r_V_fu_43_p1 <= r_V_fu_43_p10(8 - 1 downto 0); r_V_fu_43_p10 <= std_logic_vector(resize(unsigned(multi_in0_V),16)); end behav;
  50. 50. 50 インターフェース ● Vivado HLSでは、CをHDL(ハードウェア)へ変換する ● HDLにする場合には他のモジュールとの接続のため のインターフェースが必要になる ● ブロックレベルとIOレベルのインターフェース ● ブロックレベル – ブロック用の制御信号(ap_ctrl_hs, ap_ctrl_none) ● IOレベル – IO用の制御信号(ap_hs, ap_none, m_axi, s_axilite, axis) ● 生成されるインターフェースは57、58ページを参照
  51. 51. 51 ブロックレベルのインターフェース ● ap_ctrl_none ● ap_ctrl_hs ● ap_ctrl_chain
  52. 52. 52 ap_ctrl_hsプロトコル (ブロックレベル) ● ap_start, ap_done, ap_idle, ap_ready ● ブロック・レベルのインターフェース・プロトコル ー ap_ctrl_hs(デフォルト値) ● ap_returnがあるが、関数の戻り値がvoidのため削除
  53. 53. 53 ap_ctrl_hsプロトコル タイミング波形 ● ブロックレベルI/Oプロトコル ● ap_startが1になると処理が開始される ● ap_readyが1になるまで、ap_startを1に保つ Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2014.3) 2014年10月 1日 405ページ 図 4 6 : ap_ctrl_hs‐ イ ン ターフ ェ イスの動作 から引用
  54. 54. 54 ap_ctrl_hsプロトコル タイミング波形の続き ● ap_startが1になるとap_idleが0になる ● 入力はap_idleが0になった後の最初のクロック・ エッジでサンプルされる – この場合はHDLが組み合わせ回路なので、クロック・ エッジはなし ● ブロックの処理が終了するとap_doneが1になる ● ap_returnはap_doneが1の時に有効(あれば) ● ap_idleはap_doneが1になった次のクロックで1に なる
  55. 55. 55 IOレベルのインターフェース ● axis, s_axilite, m_axi ● ap_none, ap_stable ● ap_ack, ap_vld, ap_ovld, ap_hs ● ap_memory, bram, ap_fifo ● ap_bus
  56. 56. 56 ap_hs (ap_ack、 ap_vld、 および ap_ovld)プロトコル Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2014.3) 2014年10月 1日 408ページ 図 4 8 : ap_hs‐ イ ン ターフ ェ イスの動作 から引用
  57. 57. 57 ap_hs (ap_ack、 ap_vld、 および ap_ovld)プロトコル ● I/Oプロトコル ● Valid( _vld)信号とACK( _ack)信号を持つ ● ap_ack ー ACK信号のみ ● ap_vld ー Valid信号のみ ● ap_ovld ー Valid信号のみ、出力ポートか入出力 ポート
  58. 58. 58 ap_none ● I/Oプロトコル ● ハンドシェーク信号は無しで入力、出力、入出力 データのみ ● 入力の場合トランザクションの間、値を保持する必 要がある ● 入力のデフォルト値
  59. 59. 59 データ型とインターフェース合成の サポート 1/2 Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2014.3) 2014年10月 1日 129ページ 図 1 49 :‐ デー タ型と イ ン ターフ ェ イス合成のサポー ト から引用
  60. 60. 60 データ型とインターフェース合成の サポート 2/2 Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2014.3) 2014年10月 1日 129ページ 図 1 49 :‐ デー タ型と イ ン ターフ ェ イス合成のサポー ト から引用
  61. 61. 61 Analysis表示への切替 ● 右上のAnalysisボタンをクリックするとAnalysis表 示になる
  62. 62. 62 Analysis表示(Performanceタブ) ● Performanceタブ表示 ● 下のResourceタブをクリックするとResource表示となる
  63. 63. 63 Analysis表示(Resourceタブ) ● +ボタンをクリックしてすべて展開する ● read, write, *の掛け算を実行(組み合わせ回路) ● Synthesisボタンをクリックして画面を戻す
  64. 64. 64 これから何するのか?1 ● Vivado HLS 2015.4 – 掛け算のプロジェクト、Cソースコードの作製 – Cのテストベンチを作製してCシミュレーション – CからHDLを生成 – C/RTLコシミュレーション – VivadoでC/RTLコシミュレーションの波形を確認 – ディレクティブを追加して再度CからHDLを生成 – IPとしてパッケージ
  65. 65. 65 C/RTLコシミュレーション ● 右上のSynthesisボタンをクリックして表示を戻す ● Run C/RTL Cosimulationボタンをクリックする ● CやC++で書かれたテストベンチのデータをHDLシミュ レータに入力してシミュレーションを行う
  66. 66. 66 Co-simulation Dialog ● Dump Trace を none から all に設定を変更 する ● allにすると、すべてのシ ミュレーション波形が記 録される(portとallが選 べる) ● OKボタンをクリックする とC/RTLコシミュレー ションが始まる
  67. 67. 67 C/RTLコシミュレーション結果 ● C/RTLコシミュレーションが終了した ● LatencyもIntervalも0クロックだった
  68. 68. 68 これから何するのか?1 ● Vivado HLS 2015.4 – 掛け算のプロジェクト、Cソースコードの作製 – Cのテストベンチを作製してCシミュレーション – CからHDLを生成 – C/RTLコシミュレーション – VivadoでC/RTLコシミュレーションの波形を確認 – ディレクティブを追加して再度CからHDLを生成 – IPとしてパッケージ
  69. 69. 69 Open Wave viewer…ボタンをクリック ● Open Wave viewer…ボタンをクリックする
  70. 70. 70 Vivadoが立ち上がった
  71. 71. 71 Waveformウインドウを表示 ● WindowメニューからWaveformを選択する
  72. 72. 72 Vivadoによる シミュレーション波形表示
  73. 73. 73 波形ウインドウをフロート ● 波形ウインドウのFloatボタンをクリックして、波形 ウインドウをフローティング・ウインドウにする
  74. 74. 74 波形ウインドウ1 ● Zoom Fitボタンをクリックして、波形全体を表示 ● Nameペインで右クリックメニューからSelect Allを選択
  75. 75. 75 波形ウインドウ2 ● 選択部分を右クリックし、右クリックメニューから Radix -> Unsigned Decimal を選択
  76. 76. 76 波形ウインドウ3 ● multi_in0_Vに 10、multi_in1_Vに 10 を入力した クロックでmulti_out_Vに 100 が出力されているの がわかる
  77. 77. 77 これから何するのか?1 ● Vivado HLS 2015.4 – 掛け算のプロジェクト、Cソースコードの作製 – Cのテストベンチを作製してCシミュレーション – CからHDLを生成 – C/RTLコシミュレーション – VivadoでC/RTLコシミュレーションの波形を確認 – ディレクティブを追加して再度CからHDLを生成 – IPとしてパッケージ
  78. 78. 78 ap_***、***_vld信号の削除 ● ap_***(ap_start, ap_idleなど)、出力の***_vldの信号 は入力をスイッチ、出力をLEDにするのに邪魔なので消 去しよう ● ブロック・レベルのインターフェースをap_ctrl_noneに変 更する ● 出力のmulti_outのI/Oプロトコルをap_noneに変更する ● 変更方法ーディレクティブを使用する ● ディレクティブの書き方 – Cソース・ファイルに書く – ディレクティブ・ファイルに書く ● Cソース・ファイルに書く方法でやってみよう
  79. 79. 79 ディレクティブ ● いろいろなディレクティブ(指示子)を指定してHDL コードの最適化を行う – PIPELINE, INTERFACE, UNROLL, ARRAY_PARTITION… ● 今回はINTERFACEディレクティブを使ってブロッ ク・レベルのプロトコルをap_ctrl_noneに、 I/Oプロ トコルをap_noneにしてみよう
  80. 80. 80 ディレクティブを入力1 ● Vivado HLSの右のウインドウでDirectiveタブをク リックする ● multi_apuintを右クリックし、右クリックメニューから Insert Directive...を選択する
  81. 81. 81 Vivado HLS Directive Editor ● Vivado HLS Directive Editor が開く ● DirectiveからINTERFACEを 選択する ● DestinationではSource File を選択する ● Optionsのmodeは ap_ctrl_noneを選択する ● OKボタンをクリックする
  82. 82. 82 INTERFACEディレクティブの挿入 ● Cソースに”#pragma HLS INTERFACE ap_ctrl_none port=return”が追加された ● Directiveウインドウにも表示された
  83. 83. 83 multi_outをap_noneへ変更 ● Vivado HLSの右のウインドウでDirectiveタブをクリックする ● multi_outを右クリックし、右クリックメニューからInsert Directive...を選択する
  84. 84. 84 Vivado HLS Directive Editor ● Vivado HLS Directive Editor が開く ● DirectiveからINTERFACEを 選択する ● DestinationではSource Fileを 選択する ● Optionsのmodeはap_noneを 選択する ● OKボタンをクリックする
  85. 85. 85 INTERFACEディレクティブの挿入 ● Cソースに”#pragma HLS INTERFACE ap_none port=multi_out”が挿入された ● Directiveウインドウにも表示された ● Cソースファイルをセーブする
  86. 86. 86 Cコードの合成(2回目) ● C Synthesisボタンをクリックして、Cソースコードの 合成を行う
  87. 87. 87 Cコードの合成結果(2回目) ● TimingのSummaryでClockのTarget周期が10nsのとこ ろ、6.38nsなので問題無い ● 成功
  88. 88. 88 Cコードの合成結果2 ● 下にスクロールして合成結果を見る ● Latencyは0、Intervalは1 ● DSP48Eを1個のみ使用している
  89. 89. 89 HDLコードの確認 (Verilog HDLコード) ● multi_in0_V, multi_in1_V, multi_out_V ポートの みになった
  90. 90. 90 HDLコードの確認 (VHDLコード) ● multi_in0_V, multi_in1_V, multi_out_V ポートの みになった
  91. 91. 91 これから何するのか?1 ● Vivado HLS 2015.4 – 掛け算のプロジェクト、Cソースコードの作製 – Cのテストベンチを作製してCシミュレーション – CからHDLを生成 – C/RTLコシミュレーション – VivadoでC/RTLコシミュレーションの波形を確認 – ディレクティブを追加して再度CからHDLを生成 – IPとしてパッケージ
  92. 92. 92 IPのパッケージ ● 合成したHDLをIPとしてパッケージ化 ● Export RTLをクリックする
  93. 93. 93 Export RTL Dialog ● Exprot RTLダイアログが開く ● デフォルトのIP Catalog(Vivado用)を選択 ● OKボタンをクリックする
  94. 94. 94 IP生成が完了 ● solution1の下にimplフォルダが作られ、その下の ipフォルダにIPが生成された
  95. 95. 95 impl/ipフォルダ ● solution1/impl/ipフォルダ ● xilinx_com_hls_multi_apuint_1_0.zipにIPが圧縮されて いる
  96. 96. 96 Vivado HLSで作ったIPを使ってみよう ● 今までの工程(Vivado HLS) – Cシミュレーション – CからHDLを合成 – C/RTLコシミュレーション – VivadoでC/RTLコシミュレーションの波形を確認 – HDLをIPとしてパッケージ ● 次の工程(Vivado) – Vivadoでプロジェクトを作製 – ブロックデザインにIPを追加し、回路を構成 – 制約ファイルを追加 – 論理合成、インプリメント、ビットストリームの生成 – 実機確認
  97. 97. 97 これから何するのか?2 ● Vivado 2015.4 – Vivadoでプロジェクトを作製 – Vivado HLSプロジェクト(multi_apuint)のIPをIP Catalogに登録 – ブロックデザインにIPを追加し、回路を構成 – 制約ファイルを追加 – 論理合成、インプリメント、ビットストリームの生成 – 実機確認
  98. 98. 98 Vivado 2015.4の起動 ● Vivado 2015.4を起動する ● Create New Projectボタンをクリックする
  99. 99. 99 New Project ダイアログ ● New Project ダイアログが開く ● Next >ボタンをクリックする
  100. 100. 100 Project Nameの設定 ● Project locationを適当なところに設定する ● Project nameに”multi_ex1”と入力する
  101. 101. 101 Project Typeの設定 ● RTL Projectのラジオボタンが選択されていることを確認 する ● Next >ボタンをクリックする
  102. 102. 102 Add Sources ● デフォルトのまま、Next >ボタンをクリックする
  103. 103. 103 Add Existing IP (optional) ● デフォルトのまま、Next >ボタンをクリックする
  104. 104. 104 Add Contraints (optional) ● デフォルトのまま、Next >ボタンをクリックする
  105. 105. 105 Default Parts ● 上図のように項目を選択して、xc7z010clg400-1を 選択する
  106. 106. 106 New Project Summary ● Finishボタンをクリックする
  107. 107. 107 multi_ex1プロジェクト ● multi_ex1プロジェクトが立ち上がった
  108. 108. 108 これから何するのか?2 ● Vivado 2015.4 – Vivadoでプロジェクトを作製 – Vivado HLSプロジェクト(multi_apuint)のIPをIP Catalogに登録 – ブロックデザインにIPを追加し、回路を構成 – 制約ファイルを追加 – 論理合成、インプリメント、ビットストリームの生成 – 実機確認
  109. 109. 109 Vivado HLSプロジェクト(multi_apuint) のIPをIP Catalogに登録 ● Vivado HLSプロジェクトのsolution?/impl/ipフォル ダをIP Catalogのリポジトリに追加するとVivado HLSで作製したIPが使用できる ● どこでIPを使うか? – IPインテグレーターのブロック・デザイン内で使用できる ● Vivado HLS製のIPをAddするとVivado HLSの マークがIPのシンボルに付く
  110. 110. 110 IP Catalogを開く ● Project NavigatorからIP Catalogをクリックする
  111. 111. 111 IP Setting ● IP Catalogが開いた ● IP Catalog内で右クリックし、右クリックメニューからIP Settings…を選択する
  112. 112. 112 Project Settingsダイアログ ● Repository Managerタブを クリックし て、Addボタン をクリックする (Vivado HLS で作製したIPを 追加する)
  113. 113. 113 Vivado HLSのIPの選択 ● V_HLS_study_meetingmulti_apuintsolution1implip を選択する ● Selectボタンをクリックする
  114. 114. 114 Add Repositoryダイアログ ● OKボタンをクリックする
  115. 115. 115 Repository Manager ● Multi_apuintが 選択された ● OKボタンをク リックすると、IP Catalogに追加 される
  116. 116. 116 IP Catalogに追加された ● Multi_apuintがIP Catalogに追加された
  117. 117. 117 IPインテグレーター ● ブロック・デザインを新規作成する ● multi_apuint IPをAdd IPする ● Slice IPをAdd IPし、multi_apuintとI/Oのバス幅を 合わせる ● ベリファイして回路があっているかどうか?を確認 する
  118. 118. 118 ブロック・デザインの作製 ● Flow Navigator -> IP Integrator -> Create Block Designをクリックする
  119. 119. 119 Create Block Designダイアログ ● Create Block Designダイアログが開く ● Design nameにmulit_bdと入力する ● OKボタンをクリックする
  120. 120. 120 ちょっと一息、便利なTips (Flow Navigatorを表示/非表示) ● Flow Navigatorの<<ボタンをクリックすると表示/非表示 の切替ができる ● <<ボタンをクリックして非表示にする
  121. 121. 121 これから何するのか?2 ● Vivado 2015.4 – Vivadoでプロジェクトを作製 – Vivado HLSプロジェクト(multi_apuint)のIPをIP Catalogに登録 – ブロックデザインにIPを追加し、回路を構成 – 制約ファイルを追加 – 論理合成、インプリメント、ビットストリームの生成 – 実機確認
  122. 122. 122 ZYBOへの入出力ポートのマッピング ● ZYBOの実機でmulti_apuintの機能、つまり掛け算の機 能を検証する ● 入力は4個のスライドスイッチ ● 出力は4個のLED ● multi_in0_Vに2個、multi_in1_Vに2個のスライドスイッ チを割り当てる – どちらも2ビット入力 ● multi_out_Vに4個のLEDを割り当てる – 4ビット出力 ● 入力はConcat、Constantを使用する ● 出力はSliceを使用する
  123. 123. 123 Constant, Concat, Slice ● IP Integratorの便利なIP ● Constant, Concat, Slice, Utility Vector Logic, Utility Recuced Logic ● Constant – 任意のビット幅の定数を与える ● Concat – 複数の入力ポートを1つの出力ポートにまとめる ● Slice - 入力ポートの任意のビット幅を出力ポートに出力する ● Utility Vector Logic – 各ビットごとに演算を行う – and, or, xor, not ● Utility Reduced Logic – 各ビット同士を演算して1ビット出力 とする – and, or, xor ● http://marsee101.blog19.fc2.com/blog-entry-3209.html
  124. 124. 124 Constant
  125. 125. 125 Concat
  126. 126. 126 Slice
  127. 127. 127 Utility Vector Logic
  128. 128. 128 Utility Reduced Logic
  129. 129. 129 Add IP ● Diagramタブ内を右クリックし、右クリックメニュー からAdd IP...を選択する
  130. 130. 130 Multi_apuintをAdd IP ● 開いたダイアログのSearchに”multi”と入力する ● 文字列が検索されて候補が表示される ● Multi_apuintをダブルクリックする
  131. 131. 131 multi_apuint_0を追加 ● multi_apuint_0が追加された
  132. 132. 132 Slice IPの追加 ● 先ほどと同様にDiagramタブ内で右クリックし、右クリックメニューから Add IP...を選択する ● ダイアログのSearchに”Slice”と入力し、Sliceをダブルクリックする
  133. 133. 133 Slice ● xlslice_0をダブルクリックし、設定画面を開く
  134. 134. 134 xlslice_0のバス幅設定 ● Din Widthを16に、Din Fromを3、Din Down Toを0に設 定する ● OKボタンをクリックする
  135. 135. 135 multi_apuintとxlslice_0の配線 ● IPのシンボルのポートにマウス・カーソルを持っていくと 鉛筆の形になる ● ドラックすると配線することができる
  136. 136. 136 ウインドウをフロートして見やすく ● VivadoのウインドウはIDEに統合しておくこともで きるが、単独でフロート・ウインドウとすることもでき る。 ● フロートする場合は、Floatボタンをクリックする
  137. 137. 137 Concatの追加 ● Diagramウインドウで右クリックし、右クリックメニューからAdd IP...を選択する ● ダイアログのSearchに”Concat”と入力する ● Concatをダブルクリックする
  138. 138. 138 Concatを追加した ● もう1つ同様に”Concat”を追加した
  139. 139. 139 Concatの設定 ● xlconcat_0をダブルクリックする ● Number of Portsを2、In0 WidthをManualの2、In1 Widthを6に設定する ● Xlconcat_1も同様に設定する
  140. 140. 140 ConcatとMulti_apuint間の配線 ● xlconcat_0、xlconcat_1のdoutとmulti_apuintの 入力ポートを配線する
  141. 141. 141 Constantの追加 ● Diagramウインドウで右クリックし、右クリックメニューから Add IP...を選択する ● ダイアログのSearchに”Constant”と入力する
  142. 142. 142 Constantを追加した ● 同様にもう1つ”Constant”を追加した
  143. 143. 143 Constantの設定 ● xlconstant_0をダブルクリックする ● Const Widthを6、Const Valを0に設定する ● xlconstant_1も同様に設定する
  144. 144. 144 ConstantとConcatの間の配線 ● ConstantのdoutとConcatのIn1の間を配線する
  145. 145. 145 Make Externalを選択 ● xlconcat_0の In0の配線部分 で右クリックし、 右クリックメ ニューから Make External を選択する
  146. 146. 146 入力ポートIn0 ● xlconcat_0にIn0ポートに入力ポートIn0が接続さ れた
  147. 147. 147 すべてのポートをMake Externalする ● xlconcat_1のIn0とxslice_0のDoutをMake Externalした
  148. 148. 148 Validate Design ● Validate Designボタンをクリックする(もし表示され ていない場合は、Diagramウインドウの左下端の 下向き▼2つをクリックする)
  149. 149. 149 Validate Designダイアログ ● Validate Designダイアログが表示される ● OKボタンをクリックする
  150. 150. 150 Regenerate Layout ● Regenerate Layoutボタンをクリックして全体のレ イアウトを整えた
  151. 151. 151 ブロック・デザイン完成 ● Save Block Designボタンをクリックしてブロック・ デザインをセーブする
  152. 152. 152 HDL Wrapperファイルの生成 ● Sourcesウインド ウのSourcesタブ をクリックする ● multi_bdブロッ ク・デザインを右 クリックし、右ク リックメニューか らCreate HDL Wrapper...を選 択する
  153. 153. 153 Create HDL Wrapperダイアログ ● Create HDL Wrapperダイアログが開く ● デフォルトのままでOKボタンをクリックする
  154. 154. 154 multi_bd_wrapper.v ● multi_bd_wrapper.vが生成された
  155. 155. 155 これから何するのか?2 ● Vivado 2015.4 – Vivadoでプロジェクトを作製 – Vivado HLSプロジェクト(multi_apuint)のIPをIP Catalogに登録 – ブロックデザインにIPを追加し、回路を構成 – 制約ファイルを追加 – 論理合成、インプリメント、ビットストリームの生成 – 実機確認
  156. 156. 156 制約ファイルを追加する ● 作製済みの制約ファイルを追加する(multi_bd_wrapper.xdc) ● 制約ファイルはFilesフォルダ→Vivado HLS勉強会1用 →multi_bd_wrapper.xdc – コピーしてmulti_ex1フォルダにペーストする ● 制約ファイルの役割 – 入力ポート、出力ポートに対応するFPGAのピンの位置の指定 – 動作周波数の指定 – タイミングの指定 ● FPGA用の回路をコンパイルする場合に必要不可欠なファイル です ● In0にsw3, sw2、In0_1にsw1, sw0、DoutにLEDを割り当てる
  157. 157. 157 制約ファイルを追加 ● SourcesウインドウのDesign Sourcesを右クリック し、右クリックメニューからAdd Sources…を選択 する
  158. 158. 158 Add Sourcesダイアログ ● Add or create constraintsのラジオボタンをクリックする ● Next >ボタンをクリックする
  159. 159. 159 Add Files ● Add Files… ボタンをクリックする
  160. 160. 160 multi_bd_wrapper.xdcを選択 ● multi_bd_wrapper.xdcを選択する ● OKボタンをクリックする
  161. 161. 161 Add Sourcesダイアログ ● multi_apuint_wrapper.xdcが入った ● Finishボタンをクリックする
  162. 162. 162 multi_apuint_wrapper.xdc ● SourcesウインドウのConstraintsのconstrs_1に multi_apuint_wrapper.xdcが入った
  163. 163. 163 multi_apuint_wrapper.xdc (1/2) # multi_apuint_wrapper.xdc # 2015/07/02 by marsee # ##Switches ##IO_L19N_T3_VREF_35 sw0 set_property PACKAGE_PIN G15 [get_ports {In0_1[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {In0_1[0]}] ##IO_L24P_T3_34 sw1 set_property PACKAGE_PIN P15 [get_ports {In0_1[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {In0_1[1]}] ##IO_L4N_T0_34 sw2 set_property PACKAGE_PIN W13 [get_ports {In0[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {In0[0]}] ##IO_L9P_T1_DQS_34 sw3 set_property PACKAGE_PIN T16 [get_ports {In0[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {In0[1]}]
  164. 164. 164 multi_apuint_wrapper.xdc (2/2) ##LEDs ##IO_L23P_T3_35 Dout[0] set_property PACKAGE_PIN M14 [get_ports {Dout[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {Dout[0]}] ##IO_L23N_T3_35 Dout[1] set_property PACKAGE_PIN M15 [get_ports {Dout[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {Dout[1]}] ##IO_0_35 Dout[2] set_property PACKAGE_PIN G14 [get_ports {Dout[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {Dout[2]}] ##IO_L3N_T0_DQS_AD1N_35 Dout[3] set_property PACKAGE_PIN D18 [get_ports {Dout[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {Dout[3]}] set_switching_activity -signal_rate 1 -static_probability .99 [get_ports]
  165. 165. 165 これから何するのか?2 ● Vivado 2015.4 – Vivadoでプロジェクトを作製 – Vivado HLSプロジェクト(multi_apuint)のIPをIP Catalogに登録 – ブロックデザインにIPを追加し、回路を構成 – 制約ファイルを追加 – 論理合成、インプリメント、ビットストリームの生成 – 実機確認
  166. 166. 166 Flow Navigatorを表示 ● Flow NavigatorをクリックしてFlow Navigatorを表 示させる
  167. 167. 167 論理合成、インプリメント ビットストリームの生成 ● Flow NavigatorのProgram and Debugを開いて、Generate Bitstreamをクリックする ● 論理合成、インプリメント、ビットストリームの生成が行われる
  168. 168. 168 No Implementation Results Availableダイアログ ● ダイアログが表示されるので、Yesボタンをクリアす る
  169. 169. 169 Bitstream Generation Completed ダイアログ ● 論理合成、インプリメント、ビットストリームの生成まで成 功し、ダイアログが表示される ● Cancelボタンをクリックする
  170. 170. 170 Feedback Requestダイアログ ● Feedback Requestダイアログが表示される ● Laterボタンをクリックする ● 出ないこともあります
  171. 171. 171 Project Summaryの表示 ● Project Summaryボタンをクリックして、サーマリー を表示させる
  172. 172. 172 Project Summary ● Project Summaryが 表示された
  173. 173. 173 これから何するのか?2 ● Vivado 2015.4 – Vivadoでプロジェクトを作製 – Vivado HLSプロジェクト(multi_apuint)のIPをIP Catalogに登録 – ブロックデザインにIPを追加し、回路を構成 – 制約ファイルを追加 – 論理合成、インプリメント、ビットストリームの生成 – 実機確認
  174. 174. 174 ZYBOを用意しよう ● JP5のショートピンをJTAGの位置にする ● JP7のショートピンをUSBの位置にする ● PROG/UARTのMicro USB-Bコネクタからケーブ ルでパーソナルコンピューターのUSB-Aコネクタに 接続する ● 電源SWをONする
  175. 175. 175 ZYBO JP5 JP7 電源SW
  176. 176. 176 Open Hardware Manager ● Flow Navigator のProgram and Debugの Open Hardware Managerを開い て、Open Target をクリックし、Auto Connectをクリッ クする
  177. 177. 177 Auto Connectダイアログ ● Auto Connectダイアログが表示されて、自動的に 設定を行う
  178. 178. 178 ZYBOをプログラム ● Program deviceをクリックし、xc7z010_1をクリック して、ZYBOのZynq-7010をプログラムする
  179. 179. 179 Program Deviceダイアログ ● Program Deviceダイアログが表示された ● Programボタンをクリックする
  180. 180. 180 プログラム成功 ● ZYBOのLD10(DONE)の緑のLEDが点灯する ● ビットストリームがダウンロードされて成功した
  181. 181. 181 掛け算器のテスト ● Cソースコードで書いた掛け算器がZYBOに実装さ れたのでテストしよう ● SW3→In0[1], SW2→In0[0], SW1→In0_1[1], SW0->In0_1[0] ● LD3~LD0がDout[3:0]に対応している ● SWを動かして掛け算された値がLEDに表示され るかどうか?を確かめてみよう
  182. 182. 182 まとめ1 ● Vivado HLS 2015.4 – 掛け算のプロジェクト、Cソースコードの作製 – Cのテストベンチを作製してCシミュレーション – CからHDLを生成 – C/RTLコシミュレーション – VivadoでC/RTLコシミュレーションの波形を確認 – ディレクティブを追加して再度CからHDLを生成 ● ap_ctrl_none, ap_none – IPとしてパッケージ
  183. 183. 183 まとめ2 ● Vivado 2015.4 – Vivadoでプロジェクトを作製 – ブロックデザインにIPを追加し、回路を構成 – 制約ファイルを追加 – 論理合成、インプリメント、ビットストリームの生成 – 実機確認
  184. 184. 184 参考文献 ● Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2014.3) 2014 年 10 月 1 日 – http://japan.xilinx.com/support/documentation/sw_m anuals_j/xilinx2014_4/ug902-vivado-high-level-synt hesis.pdf ● Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2015.3) 2015 年 9 月 30 日 – http://japan.xilinx.com/support/documentation/sw_m anuals_j/xilinx2015_3/ug902-vivado-high-level-synt hesis.pdf –

×