前回は、”
Vivado HLSのaxi_stream_no_side_channel_dataを試す1”
今回は、axi_stream_side_channel_dataを試すことにする。
・Vivado HLSを立ちあげて、Open Example Project をクリックした。
・axi_stream_side_channel_data を選択して、Next> ボタンをクリックした。

・Location を選択して、Finishボタンをクリックした。

・Vivado HLSが立ち上がった。

このCソースは、また強烈な書き方だね。example()関数の引数にもろにap_axis が書いてある。ap_axis構造体は ap_axi_sdata.h に書いてあって、下のような宣言になっていた。
template<int D,int U,int TI,int TD>
struct ap_axis{
ap_int<D> data;
ap_uint<D/8> keep;
ap_uint<D/8> strb;
ap_uint<U> user;
ap_uint<1> last;
ap_uint<TI> id;
ap_uint<TD> dest;
};
AXI4 Stream の信号がそのまま構造体になっていた。
・C Simulation を行った。

・次に、C Synthesis を行った。レイテンシが 51クロックでインターバルが52クロックだった。この状態では、かなり遅い。

・インターフェースは、ap_ctrl_hs 1つと ap_fifoがたくさんある。

・C/RTL Co-Simulation をSystemC で行った。成功した。

・pcoreとして出力した。トップのVerilog HDLファイルを見ると、AとBのAXI Stream ができている。ap_start などはそのまま出ている。

AXI4 Stream 用の Vivado HLSの Cコードを書くと、どうしても時間の概念が入ってきてしまうと思う。
3x3のフィルタを実装するとなると、少なくとも2個のラインパッファが必要になる。
”Vivado Design Suite ユーザーガイド 高位合成 UG902 (v2013.2) 2013 年 6 月 19 日”の 177ページの”表 2-3 : ストレージコア”に載っている RAM_2P_BRAM などを使う必要があるのか?
でも、Cコードでそうするくらいならば HDL を書いたほうがマシなんじゃないだろうか?
Cでのラプラシアン・フィルタの実装としては、
前にやったようにC言語の基本となるメモリベースのAXI4 Master で memcpy()で1ラインずつ DMA転送してもらってラプラシアン・フィルタを実行するのが基本的な考え方だと思う。AXI4 Stream を使って実装すると、C言語のソフトウェア言語の書き方から外れてしまって、HDLで実装したほうがマシということになりはしないだろうか?
AXI4 Master での実装は、
たぶんバグ?のためにうまくいかないようなので、HDLでラプラシアン・フィルタを書くことにする。
- 2013年10月22日 04:52 |
- Vivado HLS
-
| トラックバック:0
-
| コメント:2
マルチコアプログラミングのように、時間や並行動作まで記述できないと直接H/Wに落とすのは難しそうですね。
そこまで行くとHDLで書いた方が簡単というのも、なんとなく理解できました。
現状では、OSI参照モデルのように階層に分けてHDL層/高位合成層/Cソース層みたいな設計するのがベターっぽいけど。
分ける手間を考えると・・・・
- 2013/10/22(火) 09:10:15 |
- URL |
- おる #qbIq4rIg
- [ 編集 ]
おるさん、こんにちは。
やはり、メモリ(配列含む)を読んで来て演算するという書き方でないとCで書いたとは言えませんね。その意味からすると、Cで書くというテーマからすると、AXI4 Streamを使うということは邪道になるんだと私はお思います。
- 2013/10/22(火) 18:43:37 |
- URL |
- marsee #f1oWVgn2
- [ 編集 ]