”
Vivado HLS でFIFO を作ってみた1(指示子を入れない場合)”の続き。
前回は、入出力数に制限のあるFIFO を作ってみたが、DATAFLOW 指示子やPIPELINE 指示子を入れてないので、input のfor 文とooutput のfor 文がシーケンシャルに実行されてしまったし、output は出力するのに 2 クロックかかってしまった。今回は、DATAFLOW 指示子とPIPELINE 指示子を入れて、どう変わるのか?を検証してみよう。
指示子を入れた fifo_test.cpp を示す。
#include <stdio.h>
#include <string.h>
#include <ap_int.h>
#include <hls_stream.h>
#include "fifo_test.h"
int fifo_test(hls::stream<ap_uint<32> >& ins, hls::stream<ap_uint<32> >& outs){
#pragma HLS DATAFLOW
ap_uint<32> buf[HORIZONTAL_PIXEL_WIDTH];
ap_uint<32> ind, outd;
int i, j;
input : for(i=0; i<HORIZONTAL_PIXEL_WIDTH; i++){
#pragma HLS PIPELINE II=1
ins >> buf[i];
}
output : for(j=0; j<HORIZONTAL_PIXEL_WIDTH; j++){
#pragma HLS PIPELINE II=1
while(i <= j) ;
outs << buf[j];
}
return 0;
}
input にはPIPELINE 指示子はいらないかもしれないが、一応入れておいた。
C コードの合成の結果を示す。今回の結果を左側に、前回の結果を右側に示す。

Latency は 643 クロックになっていて、input と output が並列に実行されていることがわかる。
Loop がN/A になっていて、FF も LUT も増えている。
Analysis にしてみた。

fifo_test_Loop_input_proc と fifo_test_Loop_output_proc があった。
そのうちのfifo_test_Loop_input_proc をクリックした。

戻って、 fifo_test_Loop_output_proc をクリックした。

Resource 表示にした。

fifo_test_Loop_input_proc_U0 と fifo_test_Loop_output_proc_U0 があった。
そのうちのfifo_test_Loop_input_proc_U0 をクリックした。

戻って、fifo_test_Loop_output_proc_U0 をクリックした。

C/RTL協調シミュレーションを行った。

C/RTL協調シミュレーション波形を示す。

fifo_test() 呼び出し 1 回分を示す。

ins_V_empty_n, ins_V_V_read, outs_V_V_full_n, outs_V_V_write も呼び出しの間は1 を保持しているので、1 クロックで input と output の処理を同時に行うことができている。
次に、入力と出力が何クロック遅延しているかを見てみよう。

図から入力データと出力データは 2 クロック遅れているようだ。
これで、Vivado HLS でも、FIFO が作れることが分かった。
- 2016年09月29日 04:37 |
- Vivado HLS
-
| トラックバック:0
-
| コメント:0