Vivado IP Integratorでap_fifoとfifoを簡単に接続する
ap_fifoはfifoと接続されない
Vivado HLSでap_fifoを多用する私ですが、Vivado IP Integrator上でFIFO Generatorと接続しようとしてもそのままでは繋がりません。
↑の様に接続候補に現れない。
ap_fifoは何故かfullやempty信号が負論理になっているので反転する必要があります。
↑この様な形で配線が必要。
この配線を毎回するのは面倒な上にせっかくIP IntegratorでFIFO I/Fがまとめてられているのに毎度ばらして配線するのは見た目が悪いので変換するIPを作成した。
これを使うと↓の様に配線がすっきりする。
ap_fifo2fifo
まずIPにするRTLだが↓の様にFULLを反転するコードを用意する。
これでIPを作成すれば良い。
module ap_fifo2fifo( WR_DATA_o, FULL_N_o, WR_EN_o, WR_DATA_i, FULL_i, WR_EN_i ); parameter WIDTH = 32; //ap_fifo input [WIDTH-1:0] WR_DATA_o; output FULL_N_o; input WR_EN_o; //fifo output [WIDTH-1:0] WR_DATA_i; input FULL_i; output WR_EN_i; assign WR_DATA_i = WR_DATA_o; assign FULL_N_o = ~FULL_i; assign WR_EN_i = WR_EN_o; endmodule
このままIPを生成すると各ポートがそのままになるのでI/F定義が必要になる。
din側はInterface Definitionを"acc_fifo_write_rtl"のslaveにして各ポートを割り当てる。
dout側はInterface Definitionを"fifo_write_rtl"のmasterにして各ポートを割り当てる。
fifo2ap_fifo
ap_fifo2fifoもemptyを反転するRTLを用意してIPを作成する。
module fifo2ap_fifo( RD_DATA_i, EMPTY_i, RD_EN_i, RD_DATA_o, EMPTY_N_o, RD_EN_o ); parameter WIDTH = 32; //fifo input [WIDTH-1:0] RD_DATA_i; input EMPTY_i; output RD_EN_i; //ap_fifo output [WIDTH-1:0] RD_DATA_o; output EMPTY_N_o; input RD_EN_o; assign RD_DATA_o = RD_DATA_i; assign EMPTY_N_o = ~EMPTY_i; assign RD_EN_i = RD_EN_o; endmodule
こちらもI/F定義をやっていく。
din側はInterface Definitionを"fifo_read_rtl"のmasterにして各ポートを割り当てる。
dout側はInterface Definitionを"acc_fifo_read_rtl"のslaveにして各ポートを割り当てる。
後はVivadoのプロジェクト上から各IPをインスタンスすれば簡単に配線できる。