高位合成のお勉強
私も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; }
とします。
#pragma SDS data sys_port の引数の部分にモジュール名_ポート名を書くと、そのポートにつながるようです。
こんなものでいいのかと思ったのですが、作られた回路を見ると、
pass_through_1_ifというモジュールが作られていて、pass_through関数の入力と出力をラップしているように見えます。
SDSoCが作ったと思われるコードを見てみると、
・・・
作りたかったものは、こうじゃない。
シンプルなデータパスルーでさえ、簡単には作れません。(;ω;)
覚書として、プラットフォームを作成するときに使用したプロパティの設定などを書いておきます。
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
| 固定リンク
コメント