« セキュリティキャンプ2018の講師を努めました | トップページ | UltraScale+用のJTAG書き込みアルゴリズム »

2018.08.18

高位合成のお勉強

私もZynqberryでSDSoCで高位合成の勉強を始めることにしました。

ADCやDACを扱いたいので、AXI Streamを入力して、AXI Streamを出力したりAD変換データを処理するようなコアをC言語で作りたいと思います。

まずは、入力を出力にそのまま出すだけのコア「pass_through」を作ります。

SDSoCでAXI Streamを扱うには、AXI-4 Stream Data FIFOを置くようです。

入力側(SDSoCのにとってのデータソース)をaxis_data_fifo_0とし、出力側をaxis_data_fifo_1としました。そして、そのポートに

set_property PFM.AXIS_PORT { M_AXIS {type "M_AXIS"} } [get_bd_cells /axis_data_fifo_0]
set_property PFM.AXIS_PORT { S_AXIS {type "S_AXIS"} } [get_bd_cells /axis_data_fifo_1]

でアトリビュートを設定し、DSAファイルを作成します。

SDSoCのプログラムでは、

#pragma SDS data sys_port (A:axis_data_fifo_0_M_AXIS)
#pragma SDS data sys_port (B:axis_data_fifo_1_S_AXIS)
//#pragma SDS data copy(A[0:32], B[0:32])
#pragma SDS data zero_copy(A[0:32], B[0:32])
void pass_through(unsigned long *A, unsigned long *B)
{
#pragma HLS INLINE
#pragma HLS interface axis port=A
#pragma HLS interface axis port=B
	unsigned long A_in;
	A_in = *A;
	*B = A_in;
}

Sdsoc_axis_1

とします。

#pragma SDS data sys_port の引数の部分にモジュール名_ポート名を書くと、そのポートにつながるようです。

こんなものでいいのかと思ったのですが、作られた回路を見ると、

Sdsoc_axis_2

pass_through_1_ifというモジュールが作られていて、pass_through関数の入力と出力をラップしているように見えます。

SDSoCが作ったと思われるコードを見てみると、

Sdsoc_axis_3

・・・

作りたかったものは、こうじゃない。

シンプルなデータパスルーでさえ、簡単には作れません。(;ω;)

覚書として、プラットフォームを作成するときに使用したプロパティの設定などを書いておきます。

set_property PFM.AXIS_PORT { M_AXIS {type "M_AXIS"} } [get_bd_cells /axis_data_fifo_0]
set_property PFM.AXIS_PORT { S_AXIS {type "S_AXIS"} } [get_bd_cells /axis_data_fifo_1]

set_property PFM_NAME "tokudenkairo.co.jp:zbstd:zbstd:1.1"\
[get_files [get_property FILE_NAME [get_bd_designs]]]

set_property PFM.CLOCK { \
 clk_out1 {id "2" is_default "true" proc_sys_reset "proc_sys_reset_0" } \
 clk_out2 {id "1" is_default "false" proc_sys_reset "proc_sys_reset_1" } \
 } [get_bd_cells /clk_wiz_0]
 
set_property PFM.AXI_PORT { \
M_AXI_GP1 {memport "M_AXI_GP"} \
S_AXI_ACP {memport "S_AXI_ACP" sptag "ACP" memory "processing_system7_0 ACP_DDR_LOWOCM"} \
S_AXI_HP2 {memport "S_AXI_HP" sptag "HP2" memory "processing_system7_0 HP2_DDR_LOWOCM"} \
S_AXI_HP3 {memport "S_AXI_HP" sptag "HP3" memory "processing_system7_0 HP3_DDR_LOWOCM"} \
} [get_bd_cells /processing_system7_0]

set intVar []
for {set i 2} {$i < 16} {incr i} {
lappend intVar In$i {}
}
set_property PFM.IRQ $intVar [get_bd_cells /xlconcat_0]

write_dsa -force d:/zbstd/zbstd.dsa

|

« セキュリティキャンプ2018の講師を努めました | トップページ | UltraScale+用のJTAG書き込みアルゴリズム »

コメント

コメントを書く



(ウェブ上には掲載しません)




« セキュリティキャンプ2018の講師を努めました | トップページ | UltraScale+用のJTAG書き込みアルゴリズム »