(C) by T.IZUMI, Oct 2015
Ver. 2015.10.06a
高位合成による回路設計トレーニング課題
Xilinx Vivado HLS によるモジュールの開発サンプル
ソースコードを含むアーカイブ一式はこちら:
http://www.ritsumei.ac.jp/se/re/izumilab/lecture/15Nexys4VivadoHls.zip
- ターゲットボード
- Nexys-4
- ターゲットFPGA
- XC7A100T-1CSG324C
- (他のボードでトライする場合は、ボードの仕様に合わせてxdcファイルとトップ記述を書き換える)
- 開発環境
- Xilinx Vivado 2015.2
- Xilinx SDK 2015.2
- この課題の習得項目は次の通り。
- Vivado HLS の基本操作
- Vivado HLS によるレジスタインターフェースとステートマシンの設計
- Vivado HLS によるストリームインターフェースとデータパスの設計
- Nexys-4 による実機動作確認
- この課題は次の項目を習得済みの者を対象とする。
- Verilog HDL による RTL設計とシミュレーション
- LED/SW の取扱い
- UART の取扱い
- C言語によるプログラミング
- Vivado による RTL 設計の基礎(→推奨)
- この課題終了後には次の課題を推奨する。
- 以下、特に指定の無い項目は規定値(デフォルト、最初から入っている値)を設定する。
- Vivado は深くフォルダを掘ってトラブルを起こすので、
課題を実行するフォルダにドライブ文字を割り当てておくとよい。
subst_dir.bat のフォルダ名を変更して実行すると良い。
1. C記述と高位合成(Vivado HLS)
- モジュール hls_regtest と hls_strmtest を合成する。
- hls_regtest ... レジスタインターフェースによるコントロールの一例
- hls_strmtest ... ストリームインターフェースによるデータパスの一例
1-1.新規プロジェクトの登録
- Vivado HLS を起動
- Create New Project
- プロジェクト名と場所を設定
Name hls_regtest_prj
Project Location 例 C:/cygwin/home/t-izumi/Nexys4_VivadoHLS
- 合成する Design Files を登録
Top Function: hls_regtest
Design Files
regtest.c
- シミュレーション用 TestBench Files は登録しない(この練習では C シミュレーションはしないので)
- 合成のための設定
Solution Name: export
Clock Period: 10
Part: xc7a100tcsg324-1
1-2. 画面の確認
- (A) メインメニューと各種ボタン
- (B) Explorer 領域、各種オブジェクトを指定
- (C) メイン領域、ソースコード、合成結果、分析結果などの表示
- (D) 合成用指示(Directive/Pragma)の確認など
- (E) 操作のモード (Debug, Synthesis, Analysis)
- (F) 各種メッセージなど
- 目的の領域を見失ったら…
- +マークを展開する
- それぞれの領域上部のタブを切り替える
- 対象オブジェクトをクリックする(B)(C)
- モードを変える(E)
- メインメニュー(A)のWindowから指示する
1-3. プロジェクトの設定
1-4. ソースコードと設計指示の確認
- Explorer 領域(B)の /hls_regtest_prj/Source/regtest.c をダブルクリックして開く
- Synthesis モード(E)になっていることを確認
- メイン画面 (C)でregtest.cの内容を確認、ここで編集できる
- Directive タブ(D)で設計指示(Directive/Pragma)を確認、右クリックで追加・編集・削除できる
1-5. 合成
- 高位合成 〜 (A)メインメニュー Solution -> Run C Synthesis -> Active Solution
- (C)メイン画面で Synthesis Report を確認、特に /Interface/Summary で信号線を確認
(hls_regtest合成結果の例)
- RTL記述の出力 〜 (A)メインメニュー Solution -> Export RTL
- Explorer 領域の /hls_regtest_prj/export/impl/ip の中を確認
- その下 hdl/verilog/hls_regtest.v が生成されていることを確認
1-6. もうひとつのプロジェクトを合成
2. プロジェクトの合成(Vivado)
- Vivado を起動する。
既存のプロジェクトが開いていたら [File] -> [Close Project] する。
2-1. プロジェクト登録
2-2. ソースファイルの登録
- 上端メインメニュー File, Add Sources を選択。
- (*) Add or create constraints を選択。
- +を押下、Add Files を実行、Nexys4.xdc を登録。
- 同様に、上端メインメニュー File, Add Sources を選択。
- (*) Add or create design sources を選択。
- +を押下、Add Files を実行、Nexys4_top.v, hexilum.v, uart.v を登録。
- ウィンドウで Sources タブを選ぶ。
- Nexys4_top がトップ(太字)になっていることを確認する。
- この時点では clkhalf, hls_regtest, hls_strmtest が未定義
2-3. クロック生成器の生成と登録 (IP Catalog)
- 右側 Flow Navigator 内 /Project Manager/IP Catalog を選択
- メイン画面内 FPGA Feacures and Design/Clocking/Clocking Wizard を右クリックし Customize IP
- Component Name: clkhalf
- Output Clocks タブ 〜 clk_out2 をチェック, Output Freq を 100MHz に設定
- Output Clocks タブ 〜 Reset Type を Active Low にする
- Project Manager 内 Sources で clkhalf が定義されたことを確認
2-4. 高位合成したモジュールの登録
- 上端メインメニュー File → Add Sources
- (*) Add or create design sources
- +を押下、Add Directories を実行、次のふたつを登録。
(そのフォルダあるファイルすべて)
- hls_regtest_prj/export/impl/ip/hdl/verilog
- hls_strmtest_prj/export/impl/ip/hdl/verilog
- Project Manager 内 Sources で hls_regtest と hls_strmtest が定義されたことを確認
2-5. コンパイル
- Run Syntehsis
- Run Implementation
- Generate Bitstream
3. ボードのコンフィグ(Vivado)
- Flow Navigator領域内、Program and Debug の Hardware Manager の Open Target を選択、localhost???が登録済みなら選択。(無ければOpen New Targetを実行、Local server から選択)
- 右画面、右上の localhost の中の xc7a100t_0 を右クリックし Program Device を実行する。
4. 実機実行と動作確認
4-1. HDL 部の動作の確認
- 以下の動作は Verilog HDL のみで記述されている
- SWの下位8ビットの値を0,1,2,...,8にすると、LEDが下位から0,1,2,...,8個点灯
- プッシュボタン(BTNC,L,R,U,D)を押すと、カラーLED(LD16,17)が点灯
- 7SEG LED の小数点がカウントアップしている
4-2. レジスタ動作 hls_regtest の確認
- SWの下位8ビットの値を16(10000)に設定する。
- 各種表示、スイッチ、ボタンの機能は次の通り
- LD15-8 … hls_regtest()の戻値
- LD3-0 … hls_regtest()の制御信号 idle, ready, start, done
- SW15-8 … hls_regtest()の引数idata
- BTND の立ち上がりパルス、あるいは BTNU がhls_regtest()の start
- 7SEG LED の上位4桁…カウンタ値
- 7SEG LED の下位4桁…入力値2桁と積算値2桁
- BTNL ... カウント実行
- BTNC ... カウント停止
- BTNR ... hls_regtest()の終了
- BTND でモジュール起動、BTNR で終了
- 実行の度に入力(SW15-8)の累積値を出力(LD15-8)するのを確認
- (例 SW15-8=00000001 なら LD15-8 が1ずつ増えていく)
- 実行中は BTNL/BTNC でカウントの実行/停止
4-3. ストリーム動作 hls_regtest の確認
- ターミナルエミュレータ(TeraTerm等)でUART接続する。115200bps,8bit,no parity
- SWの下位8ビットの値を32(100000)に設定する。
- 各種表示、スイッチ、ボタンの機能は次の通り
- LD15-8 … hls_strmtest()の戻値
- LD7-6 … 引数 ist の valid, ready
- LD5-4 … 引数 ost の valid, ready,
- LD3-0 … hls_regtest()の制御信号 idle, ready, start, done
- SW15-8 … hls_regtest()の引数idata
- BTND の立ち上がりパルス、あるいは BTNU がhls_strmtest()の start
- BTND でモジュール実行開始
- ターミナルエミュレータから英小文字を入力すると引数値(SW15-8)だけズレた文字を出力する
- 文字 ~ を入力すると終了、処理した文字数を返す(LD15:8に表示)
- (例 SW15-8=00000001 として起動し、hal と入力すると ibm と出力される。
5. ループを明示しない記述法
上述の例では、繰り返しのループを明示的にCの関数内に記述した。
関数の中で単純に繰り返すだけであれば、
関数内のループを無くし変数をstaticにして、関数を繰り返し実行すれば良い。
そのような関数の記述例を示す。
上述の流れのソース等を次に変更して、合成・実行する。
- HLS プロジェクト: hls_regtest_prj -> hls_regtest2_prj
- HLS ソースファイル:regtest.c -> regtest2.c
- HLS 関数 : hls_regtest() -> hls_regtest2()
- HLS プロジェクト: hls_strmtest_prj -> hls_strmtest2_prj
- HLS ソースファイル:strmtest.c -> strmtest2.c
- HLS 関数 : hls_strmtest() -> hls_strmtest2()
- Vivado プロジェクト:nexys4hls -> nexys4hls2
- Verilog トップ記述: Nexys4_top.v -> Nexys4_top2.v
学習
- regtest.c, strmtest.c を読んで、C記述とモジュールの動作を理解すること
- Nexys4_top.v の hls_regtest, hls_strmtest のあたりを読んで、接続と駆動方法を理解すること
- regtest2.c, strmtest2.c を読んで、C記述とモジュールの動作を理解すること
- Nexys4_top2.v の hls_regtest2, hls_strmtest2 のあたりを読んで、接続と駆動方法を理解すること