FC2カウンター FPGAの部屋 Vivado HLS 2014.4 の高位合成テスト11(ラプラシアンフィルタ6、PIPELINEディレクティブ)
FC2ブログ

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

FPGAの部屋

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

Vivado HLS 2014.4 の高位合成テスト11(ラプラシアンフィルタ6、PIPELINEディレクティブ)

Vivado HLS 2014.4 の高位合成テスト10(ラプラシアンフィルタ5、LATENCYディレクティブのシミュレーション)”の続き。

今回は、PIPELINEディレクティブを試してみることにした。

・solution3 を新しく作り、LATENCYディレクティブを消去して、Directive タブで、PIPLINEディレクティブを追加した。
Vivado_HLS_Study_53_150115.png

下に、directives.tcl の内容を示す。

set_directive_pipeline "laplacian_filter"


・C Synthesis アイコンをクリックして、Cからの高位合成を行った。そのレポートを下に示す。
Vivado_HLS_Study_54_150116.png
Vivado_HLS_Study_55_150116.png
Vivado_HLS_Study_56_150116.png
Vivado_HLS_Study_57_150116.png

Latency は 2 クロックなのに、Interval が 1 になっている。

Register は 227 個で、Latency = 2, Latency = 1 のときと比べて、明らかに多くなった。
Vivado_HLS_Study_61_150116.png

・Analysis 画面にした。
Vivado_HLS_Study_58_150116.png

22番めのy_1(select) はCソースで言うと、”if (y<0)”の部分のようだ。
Vivado_HLS_Study_59_150116.png

Resource タブをクリックした。
Vivado_HLS_Study_60_150116.png

すべての read が C1 に集まっている。

PIPELINEディレクティブを入れて高位合成された laplacian_filter.v を貼っておく。

// ==============================================================
// RTL generated by Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC
// Version: 2014.4
// Copyright (C) 2014 Xilinx Inc. All rights reserved.
// 
// ===========================================================

`timescale 1 ns / 1 ps 

(* CORE_GENERATION_INFO="laplacian_filter,hls_ip_2014_4,{HLS_INPUT_TYPE=cxx,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=0,HLS_INPUT_PART=xc7z010clg400-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=pipeline,HLS_SYN_CLOCK=7.581000,HLS_SYN_LAT=2,HLS_SYN_TPT=1,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=227,HLS_SYN_LUT=297}" *)

module laplacian_filter (
        ap_clk,
        ap_rst,
        ap_start,
        ap_done,
        ap_idle,
        ap_ready,
        x0y0,
        x1y0,
        x2y0,
        x0y1,
        x1y1,
        x2y1,
        x0y2,
        x1y2,
        x2y2,
        ap_return
);

parameter    ap_const_logic_1 = 1'b1;
parameter    ap_const_logic_0 = 1'b0;
parameter    ap_ST_pp0_stg0_fsm_0 = 1'b1;
parameter    ap_const_lv32_0 = 32'b00000000000000000000000000000000;
parameter    ap_const_lv1_1 = 1'b1;
parameter    ap_const_lv32_3 = 32'b11;
parameter    ap_const_lv32_1F = 32'b11111;
parameter    ap_const_lv32_8 = 32'b1000;
parameter    ap_const_lv24_0 = 24'b000000000000000000000000;
parameter    ap_const_lv7_0 = 7'b0000000;
parameter    ap_const_lv10_FF = 10'b11111111;
parameter    ap_true = 1'b1;

input   ap_clk;
input   ap_rst;
input   ap_start;
output   ap_done;
output   ap_idle;
output   ap_ready;
input  [31:0] x0y0;
input  [31:0] x1y0;
input  [31:0] x2y0;
input  [31:0] x0y1;
input  [31:0] x1y1;
input  [31:0] x2y1;
input  [31:0] x0y2;
input  [31:0] x1y2;
input  [31:0] x2y2;
output  [31:0] ap_return;

reg ap_done;
reg ap_idle;
reg ap_ready;
(* fsm_encoding = "none" *) reg   [0:0] ap_CS_fsm = 1'b1;
reg    ap_sig_cseq_ST_pp0_stg0_fsm_0;
reg    ap_sig_bdd_17;
wire    ap_reg_ppiten_pp0_it0;
reg    ap_reg_ppiten_pp0_it1 = 1'b0;
reg    ap_reg_ppiten_pp0_it2 = 1'b0;
reg   [31:0] x2y2_read_reg_225;
reg   [31:0] ap_reg_ppstg_x2y2_read_reg_225_pp0_it1;
reg   [31:0] x1y2_read_reg_230;
reg   [31:0] x0y2_read_reg_235;
reg   [31:0] x2y1_read_reg_240;
wire   [31:0] sum3_neg_fu_131_p2;
reg   [31:0] sum3_neg_reg_245;
wire   [31:0] tmp_3_fu_146_p2;
reg   [31:0] tmp_3_reg_250;
wire   [31:0] tmp2_fu_119_p2;
wire   [31:0] tmp1_fu_113_p2;
wire   [31:0] tmp_fu_107_p2;
wire   [31:0] sum2_fu_125_p2;
wire   [31:0] tmp_1_fu_137_p2;
wire   [31:0] tmp_2_fu_141_p2;
wire   [31:0] y_fu_151_p2;
wire   [23:0] tmp_5_fu_163_p4;
wire   [0:0] tmp_6_fu_179_p3;
wire   [8:0] tmp_s_fu_187_p4;
wire  signed [9:0] tmp_7_cast_fu_197_p1;
wire  signed [9:0] tmp_8_fu_201_p2;
wire   [0:0] tmp_4_fu_155_p3;
wire   [0:0] icmp_fu_173_p2;
wire   [0:0] tmp_9_fu_211_p2;
wire  signed [31:0] tmp_8_cast_fu_207_p1;
reg   [0:0] ap_NS_fsm;
reg    ap_sig_pprstidle_pp0;




/// the current state (ap_CS_fsm) of the state machine. ///
always @ (posedge ap_clk)
begin : ap_ret_ap_CS_fsm
    if (ap_rst == 1'b1) begin
        ap_CS_fsm <= ap_ST_pp0_stg0_fsm_0;
    end else begin
        ap_CS_fsm <= ap_NS_fsm;
    end
end

/// ap_reg_ppiten_pp0_it1 assign process. ///
always @ (posedge ap_clk)
begin : ap_ret_ap_reg_ppiten_pp0_it1
    if (ap_rst == 1'b1) begin
        ap_reg_ppiten_pp0_it1 <= ap_const_logic_0;
    end else begin
        if (((ap_const_logic_1 == ap_sig_cseq_ST_pp0_stg0_fsm_0) & ~((ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & (ap_start == ap_const_logic_0)))) begin
            ap_reg_ppiten_pp0_it1 <= ap_reg_ppiten_pp0_it0;
        end
    end
end

/// ap_reg_ppiten_pp0_it2 assign process. ///
always @ (posedge ap_clk)
begin : ap_ret_ap_reg_ppiten_pp0_it2
    if (ap_rst == 1'b1) begin
        ap_reg_ppiten_pp0_it2 <= ap_const_logic_0;
    end else begin
        if (~((ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & (ap_start == ap_const_logic_0))) begin
            ap_reg_ppiten_pp0_it2 <= ap_reg_ppiten_pp0_it1;
        end
    end
end

/// assign process. ///
always @(posedge ap_clk)
begin
    if (((ap_const_logic_1 == ap_sig_cseq_ST_pp0_stg0_fsm_0) & ~((ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & (ap_start == ap_const_logic_0)))) begin
        ap_reg_ppstg_x2y2_read_reg_225_pp0_it1 <= x2y2_read_reg_225;
        sum3_neg_reg_245 <= sum3_neg_fu_131_p2;
        tmp_3_reg_250 <= tmp_3_fu_146_p2;
        x0y2_read_reg_235 <= x0y2;
        x1y2_read_reg_230 <= x1y2;
        x2y1_read_reg_240 <= x2y1;
        x2y2_read_reg_225 <= x2y2;
    end
end

/// ap_done assign process. ///
always @ (ap_start or ap_reg_ppiten_pp0_it0 or ap_reg_ppiten_pp0_it2)
begin
    if (((ap_const_logic_1 == ap_reg_ppiten_pp0_it2) & ~((ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & (ap_start == ap_const_logic_0)))) begin
        ap_done = ap_const_logic_1;
    end else begin
        ap_done = ap_const_logic_0;
    end
end

/// ap_idle assign process. ///
always @ (ap_start or ap_sig_cseq_ST_pp0_stg0_fsm_0 or ap_reg_ppiten_pp0_it0 or ap_reg_ppiten_pp0_it1 or ap_reg_ppiten_pp0_it2)
begin
    if ((~(ap_const_logic_1 == ap_start) & (ap_const_logic_1 == ap_sig_cseq_ST_pp0_stg0_fsm_0) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it0) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it1) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it2))) begin
        ap_idle = ap_const_logic_1;
    end else begin
        ap_idle = ap_const_logic_0;
    end
end

/// ap_ready assign process. ///
always @ (ap_start or ap_sig_cseq_ST_pp0_stg0_fsm_0 or ap_reg_ppiten_pp0_it0)
begin
    if (((ap_const_logic_1 == ap_sig_cseq_ST_pp0_stg0_fsm_0) & (ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & ~((ap_const_logic_1 == ap_reg_ppiten_pp0_it0) & (ap_start == ap_const_logic_0)))) begin
        ap_ready = ap_const_logic_1;
    end else begin
        ap_ready = ap_const_logic_0;
    end
end

/// ap_sig_cseq_ST_pp0_stg0_fsm_0 assign process. ///
always @ (ap_sig_bdd_17)
begin
    if (ap_sig_bdd_17) begin
        ap_sig_cseq_ST_pp0_stg0_fsm_0 = ap_const_logic_1;
    end else begin
        ap_sig_cseq_ST_pp0_stg0_fsm_0 = ap_const_logic_0;
    end
end

/// ap_sig_pprstidle_pp0 assign process. ///
always @ (ap_start or ap_reg_ppiten_pp0_it0 or ap_reg_ppiten_pp0_it1)
begin
    if (((ap_const_logic_0 == ap_reg_ppiten_pp0_it0) & (ap_const_logic_0 == ap_reg_ppiten_pp0_it1) & (ap_const_logic_0 == ap_start))) begin
        ap_sig_pprstidle_pp0 = ap_const_logic_1;
    end else begin
        ap_sig_pprstidle_pp0 = ap_const_logic_0;
    end
end
/// the next state (ap_NS_fsm) of the state machine. ///
always @ (ap_start or ap_CS_fsm or ap_reg_ppiten_pp0_it0 or ap_sig_pprstidle_pp0)
begin
    case (ap_CS_fsm)
        ap_ST_pp0_stg0_fsm_0 : 
        begin
            ap_NS_fsm = ap_ST_pp0_stg0_fsm_0;
        end
        default : 
        begin
            ap_NS_fsm = 'bx;
        end
    endcase
end

assign ap_reg_ppiten_pp0_it0 = ap_start;
assign ap_return = ((tmp_9_fu_211_p2)? tmp_8_cast_fu_207_p1: y_fu_151_p2);

/// ap_sig_bdd_17 assign process. ///
always @ (ap_CS_fsm)
begin
    ap_sig_bdd_17 = (ap_CS_fsm[ap_const_lv32_0] == ap_const_lv1_1);
end
assign icmp_fu_173_p2 = ($signed(tmp_5_fu_163_p4) > $signed(24'b000000000000000000000000)? 1'b1: 1'b0);
assign sum2_fu_125_p2 = (tmp2_fu_119_p2 + tmp1_fu_113_p2);
assign sum3_neg_fu_131_p2 = (tmp_fu_107_p2 - sum2_fu_125_p2);
assign tmp1_fu_113_p2 = (x1y0 + x0y0);
assign tmp2_fu_119_p2 = (x2y0 + x0y1);
assign tmp_1_fu_137_p2 = (sum3_neg_reg_245 - x2y1_read_reg_240);
assign tmp_2_fu_141_p2 = (tmp_1_fu_137_p2 - x0y2_read_reg_235);
assign tmp_3_fu_146_p2 = (tmp_2_fu_141_p2 - x1y2_read_reg_230);
assign tmp_4_fu_155_p3 = y_fu_151_p2[ap_const_lv32_1F];
assign tmp_5_fu_163_p4 = {{y_fu_151_p2[ap_const_lv32_1F : ap_const_lv32_8]}};
assign tmp_6_fu_179_p3 = y_fu_151_p2[ap_const_lv32_1F];
assign tmp_7_cast_fu_197_p1 = $signed(tmp_s_fu_187_p4);
assign tmp_8_cast_fu_207_p1 = tmp_8_fu_201_p2;
assign tmp_8_fu_201_p2 = ($signed(tmp_7_cast_fu_197_p1) + $signed(ap_const_lv10_FF));
assign tmp_9_fu_211_p2 = (tmp_4_fu_155_p3 | icmp_fu_173_p2);
assign tmp_fu_107_p2 = x1y1 << ap_const_lv32_3;
assign tmp_s_fu_187_p4 = {{{{tmp_6_fu_179_p3}, {ap_const_lv7_0}}}, {tmp_6_fu_179_p3}};
assign y_fu_151_p2 = (tmp_3_reg_250 - ap_reg_ppstg_x2y2_read_reg_225_pp0_it1);


endmodule //laplacian_filter


  1. 2015年01月16日 05:01 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/3047-a6c96882
この記事にトラックバックする(FC2ブログユーザー)