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

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

FPGAの部屋

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

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

Vivado HLS 2014.4 の高位合成テスト8(ラプラシアンフィルタ3、論理合成)”の続き。

今回は、LATENCYディレクティブを設定して、現在のLatency = 2 から、Latency = 1 への性能の改善を目指す。

LATENCYディレクティブを設定するために、solutionを追加して、solution2 とした。これでLATENCYディレクティブを設定した場合と、設定しなかった場合 (solution1) の場合がすぐに見比べられる。

・Project メニューから New Solution... を選択した。
Vivado_HLS_Study_42_150114.png

・Solution Name に solution2 と入っていた。デフォルトで Finish ボタンをクリックした。
Vivado_HLS_Study_43_150114.png

・左のウインドウに solution2 ができた。

・右のウインドウにDirective タブをクリックして、laplacian_filter を右クリックすると、Insert Directive... が出るので選択する。
Vivado_HLS_Study_44_150114.png

・Directive をクリックして、LATENCYを選択した。

・Options の min に 1 を max に 1 を入力した。
Vivado_HLS_Study_45_150114.png

・solution2 -> constrains -> directive.tcl を開くと、ディレクティブが記述されていた。

set_directive_latency -min 1 -max 1 "laplacian_filter"

Vivado_HLS_Study_46_150114.png

・この状態で C Synthesis ボタンをクリックして、Vivado HLSの高位合成を行った。
Vivado_HLS_Study_47_150114.png
Vivado_HLS_Study_48_150114.png
Vivado_HLS_Study_49_150114.png
Vivado_HLS_Study_50_150114.png

Timing の Target が 10.00 ns なのに、Estimated だけど 12.46 ns になってしまった。
Latency = 1, Interval = 2 になった。

Latency = 2 の時と、Latency = 1 の時の使用リソースの違いを下に示す。
Vivado_HLS_Study_51_150114.png

Register の値が違っている。これはLatencyが1つ少ないので、Latency = 1 の方が少なくなっていると思う。

Latency = 1 の時の 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=others,HLS_SYN_CLOCK=12.461000,HLS_SYN_LAT=1,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=34,HLS_SYN_LUT=298}" *)

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_st1_fsm_0 = 2'b1;
parameter    ap_ST_st2_fsm_1 = 2'b10;
parameter    ap_const_lv32_0 = 32'b00000000000000000000000000000000;
parameter    ap_const_lv1_1 = 1'b1;
parameter    ap_const_lv32_1 = 32'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   [1:0] ap_CS_fsm = 2'b1;
reg    ap_sig_cseq_ST_st1_fsm_0;
reg    ap_sig_bdd_18;
wire   [31:0] tmp_1_fu_137_p2;
reg   [31:0] tmp_1_reg_230;
reg    ap_sig_cseq_ST_st2_fsm_1;
reg    ap_sig_bdd_52;
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] sum3_neg_fu_131_p2;
wire   [31:0] tmp_2_fu_143_p2;
wire   [31:0] tmp_3_fu_148_p2;
wire   [31:0] y_fu_154_p2;
wire   [23:0] tmp_5_fu_168_p4;
wire   [0:0] tmp_6_fu_184_p3;
wire   [8:0] tmp_s_fu_192_p4;
wire  signed [9:0] tmp_7_cast_fu_202_p1;
wire  signed [9:0] tmp_8_fu_206_p2;
wire   [0:0] tmp_4_fu_160_p3;
wire   [0:0] icmp_fu_178_p2;
wire   [0:0] tmp_9_fu_216_p2;
wire  signed [31:0] tmp_8_cast_fu_212_p1;
reg   [1:0] ap_NS_fsm;




/// 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_st1_fsm_0;
    end else begin
        ap_CS_fsm <= ap_NS_fsm;
    end
end

/// assign process. ///
always @(posedge ap_clk)
begin
    if (((ap_const_logic_1 == ap_sig_cseq_ST_st1_fsm_0) & ~(ap_start == ap_const_logic_0))) begin
        tmp_1_reg_230 <= tmp_1_fu_137_p2;
    end
end

/// ap_done assign process. ///
always @ (ap_sig_cseq_ST_st2_fsm_1)
begin
    if ((ap_const_logic_1 == ap_sig_cseq_ST_st2_fsm_1)) 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_st1_fsm_0)
begin
    if ((~(ap_const_logic_1 == ap_start) & (ap_const_logic_1 == ap_sig_cseq_ST_st1_fsm_0))) begin
        ap_idle = ap_const_logic_1;
    end else begin
        ap_idle = ap_const_logic_0;
    end
end

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

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

/// ap_sig_cseq_ST_st2_fsm_1 assign process. ///
always @ (ap_sig_bdd_52)
begin
    if (ap_sig_bdd_52) begin
        ap_sig_cseq_ST_st2_fsm_1 = ap_const_logic_1;
    end else begin
        ap_sig_cseq_ST_st2_fsm_1 = ap_const_logic_0;
    end
end
/// the next state (ap_NS_fsm) of the state machine. ///
always @ (ap_start or ap_CS_fsm)
begin
    case (ap_CS_fsm)
        ap_ST_st1_fsm_0 : 
        begin
            if (~(ap_start == ap_const_logic_0)) begin
                ap_NS_fsm = ap_ST_st2_fsm_1;
            end else begin
                ap_NS_fsm = ap_ST_st1_fsm_0;
            end
        end
        ap_ST_st2_fsm_1 : 
        begin
            ap_NS_fsm = ap_ST_st1_fsm_0;
        end
        default : 
        begin
            ap_NS_fsm = 'bx;
        end
    endcase
end

assign ap_return = ((tmp_9_fu_216_p2)? tmp_8_cast_fu_212_p1: y_fu_154_p2);

/// ap_sig_bdd_18 assign process. ///
always @ (ap_CS_fsm)
begin
    ap_sig_bdd_18 = (ap_CS_fsm[ap_const_lv32_0] == ap_const_lv1_1);
end

/// ap_sig_bdd_52 assign process. ///
always @ (ap_CS_fsm)
begin
    ap_sig_bdd_52 = (ap_const_lv1_1 == ap_CS_fsm[ap_const_lv32_1]);
end
assign icmp_fu_178_p2 = ($signed(tmp_5_fu_168_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_fu_131_p2 - x2y1);
assign tmp_2_fu_143_p2 = (tmp_1_reg_230 - x0y2);
assign tmp_3_fu_148_p2 = (tmp_2_fu_143_p2 - x1y2);
assign tmp_4_fu_160_p3 = y_fu_154_p2[ap_const_lv32_1F];
assign tmp_5_fu_168_p4 = {{y_fu_154_p2[ap_const_lv32_1F : ap_const_lv32_8]}};
assign tmp_6_fu_184_p3 = y_fu_154_p2[ap_const_lv32_1F];
assign tmp_7_cast_fu_202_p1 = $signed(tmp_s_fu_192_p4);
assign tmp_8_cast_fu_212_p1 = tmp_8_fu_206_p2;
assign tmp_8_fu_206_p2 = ($signed(tmp_7_cast_fu_202_p1) + $signed(ap_const_lv10_FF));
assign tmp_9_fu_216_p2 = (tmp_4_fu_160_p3 | icmp_fu_178_p2);
assign tmp_fu_107_p2 = x1y1 << ap_const_lv32_3;
assign tmp_s_fu_192_p4 = {{{{tmp_6_fu_184_p3}, {ap_const_lv7_0}}}, {tmp_6_fu_184_p3}};
assign y_fu_154_p2 = (tmp_3_fu_148_p2 - x2y2);


endmodule //laplacian_filter

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

コメント

コメントの投稿


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

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