FC2カウンター FPGAの部屋 Vivado HLS でFIFO を作ってみた4(hiyuhさんに教えてもらった回路2)

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Vivado HLS でFIFO を作ってみた4(hiyuhさんに教えてもらった回路2)

Vivado HLS でFIFO を作ってみた3(hiyuhさんに教えてもらった回路)”の続き。

hiyuh さんに教えてもらって、AXI4-Stream ではFIFO になることが分かったが、それでは、ap_fifo のインターフェースではどうだろうか?
Vivado HLS 2016.2 で fifo_test2 プロジェクトを作成した。
fifo_test_27_161002.png

fifo_test2.cpp を示す。

// fifo_test2.cpp
// 2016/10/01 by hiyuh, marsee
//

#include "ap_int.h"
#include "hls_stream.h"

#define TO_LITERAL(x) #x
#define PRAGMA_HLS(tok) _Pragma(TO_LITERAL(HLS tok))

static const size_t W = 32;
static const size_t L = 1 << 8;
typedef struct {
    hls::stream<ap_int<W> > ds;
} context_t;
void pp_write(
    context_t     &ctx,
    hls::stream<ap_int<W> > &is
) {
    ctx.ds.write(is.read());
    return;
}
void pp_read(
    context_t     &ctx,
    hls::stream<ap_int<W> > &os
) {
    PRAGMA_HLS(stream variable=ctx.ds depth=L)
    os.write(ctx.ds.read());
    return;
}

void fifo_top(
    hls::stream<ap_int<W> > &is,
    hls::stream<ap_int<W> > &os
) {
    PRAGMA_HLS(interface ap_ctrl_none port=return)
    PRAGMA_HLS(dataflow)
    static context_t ctx;
    pp_write(ctx, is);
    pp_read (ctx, os);
    return;
}


AXI4-Stream の指示子を削除してある。デフォルトだと ap_fifo インターフェースになる。

C コードの合成を行った。
fifo_test_28_161002.png

LUT がAXI4-Stream よりも 2 個少ない。

C テストベンチによるシミュレーションではなく、RTLシミュレーションを行うためにVivado 2016.2 のプロジェクトを作成した。fifo_test_2 プロジェクトだ。
fifo_test_29_161002.png

テストベンチに使用した Verilog HDL コードの fifo_test2_tb.v を示す。

// fifo_test2_tb.v
// 2016/10/01 by marsee
//

`default_nettype none
`timescale 100 ps / 1ps

module fifo_test2_tb;
    parameter CLK_PERIOD=100;

    reg  [31:0] is_V_V_dout;
    reg  is_V_V_empty_n;
    wire is_V_V_read;
    wire [31:0] os_V_V_din;
    reg  os_V_V_full_n;
    wire os_V_V_write;
    wire ap_clk;
    wire ap_rst;
    
    fifo_top fifo_top_i (
        .is_V_V_dout(is_V_V_dout),
        .is_V_V_empty_n(is_V_V_empty_n),
        .is_V_V_read(is_V_V_read),
        .os_V_V_din(os_V_V_din),
        .os_V_V_full_n(os_V_V_full_n),
        .os_V_V_write(os_V_V_write),
        .ap_clk(ap_clk),
        .ap_rst(ap_rst)
    );

    always @(posedge ap_clk) begin
        if (ap_rst) begin
            is_V_V_dout <= 0;
        end else begin
            is_V_V_dout <= is_V_V_dout + 1; 
        end
    end

    initial begin
        is_V_V_empty_n = 0;
        os_V_V_full_n = 0;
    
        #1100
        is_V_V_empty_n = 1;
        os_V_V_full_n = 0;
    
        #(CLK_PERIOD * 8)
        is_V_V_empty_n = 1;
        os_V_V_full_n = 1;
    
        #(CLK_PERIOD * 2)
        is_V_V_empty_n = 1;
        os_V_V_full_n = 0;
       
        #(CLK_PERIOD * 1)
        is_V_V_empty_n = 1;
        os_V_V_full_n = 1;
    end

    // ap_clk
    clk_gen #(
        .CLK_PERIOD(CLK_PERIOD),    // 10.0nsec, 100MHz
        .CLK_DUTY_CYCLE(0.5),
        .CLK_OFFSET(0),
        .START_STATE(1'b0)
    ) sys_clock_i (
        .clk_out(ap_clk)
    );
    
    // ap_rst
    reset_gen #(
        .RESET_STATE(1'b1),
        .RESET_TIME(1000)    // 100nsec
    ) RESET2i (
        .reset_out(ap_rst)
    );
    
endmodule

module clk_gen #(
    parameter         CLK_PERIOD = 100,
    parameter real    CLK_DUTY_CYCLE = 0.5,
    parameter        CLK_OFFSET = 0,
    parameter        START_STATE    = 1'b0 )
(
    output    reg        clk_out
);
    begin
        initial begin
            #CLK_OFFSET;
            forever
            begin
                clk_out = START_STATE;
                #(CLK_PERIOD-(CLK_PERIOD*CLK_DUTY_CYCLE)) clk_out = ~START_STATE;
                #(CLK_PERIOD*CLK_DUTY_CYCLE);
            end
        end
    end
endmodule

module reset_gen #(
    parameter    RESET_STATE = 1'b1,
    parameter    RESET_TIME = 100 )
(
    output    reg        reset_out
);
    begin
        initial begin
            reset_out = RESET_STATE;
            #RESET_TIME;
            reset_out = ~RESET_STATE;
        end
    end
endmodule

`default_nettype wire



RTLシミュレーション結果を示す。
fifo_test_30_161002.png

こちらもFIFO の動作に問題はないようだ。
  1. 2016年10月02日 05:27 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3589-f0b9a3ee
この記事にトラックバックする(FC2ブログユーザー)