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

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

FPGAの部屋

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

Vivado HLS 2014.4 の高位合成テスト6(ラプラシアンフィルタ1)

今回はラプラシアンフィルタをVivado HLS 2014.4 で高位合成してみる。

Vivado HLS で laplacian_filter プロジェクトを作製した。例によって、FPGAはZYBO に使用されている xc7z010clg400-1 とした。

laplacian_filter.cpp を作製した。laplacian_filter.cpp を示す。

// ラプラシアンフィルタ
// x0y0 x1y0 x2y0 -1 -1 -1
// x0y1 x1y1 x2y1 -1  8 -1
// x0y2 x1y2 x2y2 -1 -1 -1
int laplacian_filter(int x0y0, int x1y0, int x2y0, int x0y1, int x1y1, int x2y1, int x0y2, int x1y2, int x2y2)
{
    int y;

    y = -x0y0 -x1y0 -x2y0 -x0y1 +8*x1y1 -x2y1 -x0y2 -x1y2 -x2y2;
    if (y<0)
        y = 0;
    else if (y>255)
        y = 255;
    return(y);
}


これをVivado HLS で高位合成を行った。
高位合成後のレポートを下に示す。
Vivado_HLS_Study_33_150112.png
Vivado_HLS_Study_34_150112.png
Vivado_HLS_Study_35_150112.png
Vivado_HLS_Study_36_150112.png

latency = 2クロック、interval = 3クロックだった。
乗算は8を掛けるので、DSP48Eは使用せずにシフトでやるようだ。
高位合成結果の 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=7.581000,HLS_SYN_LAT=2,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=67,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 = 3'b1;
parameter    ap_ST_st2_fsm_1 = 3'b10;
parameter    ap_ST_st3_fsm_2 = 3'b100;
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_2 = 32'b10;
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   [2:0] ap_CS_fsm = 3'b1;
reg    ap_sig_cseq_ST_st1_fsm_0;
reg    ap_sig_bdd_19;
wire   [31:0] sum3_neg_fu_125_p2;
reg   [31:0] sum3_neg_reg_223;
wire   [31:0] tmp_3_fu_142_p2;
reg   [31:0] tmp_3_reg_228;
reg    ap_sig_cseq_ST_st2_fsm_1;
reg    ap_sig_bdd_48;
reg    ap_sig_cseq_ST_st3_fsm_2;
reg    ap_sig_bdd_64;
wire   [31:0] tmp2_fu_113_p2;
wire   [31:0] tmp1_fu_107_p2;
wire   [31:0] tmp_fu_101_p2;
wire   [31:0] sum2_fu_119_p2;
wire   [31:0] tmp_1_fu_131_p2;
wire   [31:0] tmp_2_fu_136_p2;
wire   [31:0] y_fu_148_p2;
wire   [23:0] tmp_5_fu_161_p4;
wire   [0:0] tmp_6_fu_177_p3;
wire   [8:0] tmp_s_fu_185_p4;
wire  signed [9:0] tmp_7_cast_fu_195_p1;
wire  signed [9:0] tmp_8_fu_199_p2;
wire   [0:0] tmp_4_fu_153_p3;
wire   [0:0] icmp_fu_171_p2;
wire   [0:0] tmp_9_fu_209_p2;
wire  signed [31:0] tmp_8_cast_fu_205_p1;
reg   [2: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
        sum3_neg_reg_223 <= sum3_neg_fu_125_p2;
    end
end

/// assign process. ///
always @(posedge ap_clk)
begin
    if ((ap_const_logic_1 == ap_sig_cseq_ST_st2_fsm_1)) begin
        tmp_3_reg_228 <= tmp_3_fu_142_p2;
    end
end

/// ap_done assign process. ///
always @ (ap_sig_cseq_ST_st3_fsm_2)
begin
    if ((ap_const_logic_1 == ap_sig_cseq_ST_st3_fsm_2)) 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_st3_fsm_2)
begin
    if ((ap_const_logic_1 == ap_sig_cseq_ST_st3_fsm_2)) 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_19)
begin
    if (ap_sig_bdd_19) 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_48)
begin
    if (ap_sig_bdd_48) 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

/// ap_sig_cseq_ST_st3_fsm_2 assign process. ///
always @ (ap_sig_bdd_64)
begin
    if (ap_sig_bdd_64) begin
        ap_sig_cseq_ST_st3_fsm_2 = ap_const_logic_1;
    end else begin
        ap_sig_cseq_ST_st3_fsm_2 = 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_st3_fsm_2;
        end
        ap_ST_st3_fsm_2 : 
        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_209_p2)? tmp_8_cast_fu_205_p1: y_fu_148_p2);

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

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

/// ap_sig_bdd_64 assign process. ///
always @ (ap_CS_fsm)
begin
    ap_sig_bdd_64 = (ap_const_lv1_1 == ap_CS_fsm[ap_const_lv32_2]);
end
assign icmp_fu_171_p2 = ($signed(tmp_5_fu_161_p4) > $signed(24'b000000000000000000000000)? 1'b1: 1'b0);
assign sum2_fu_119_p2 = (tmp2_fu_113_p2 + tmp1_fu_107_p2);
assign sum3_neg_fu_125_p2 = (tmp_fu_101_p2 - sum2_fu_119_p2);
assign tmp1_fu_107_p2 = (x1y0 + x0y0);
assign tmp2_fu_113_p2 = (x2y0 + x0y1);
assign tmp_1_fu_131_p2 = (sum3_neg_reg_223 - x2y1);
assign tmp_2_fu_136_p2 = (tmp_1_fu_131_p2 - x0y2);
assign tmp_3_fu_142_p2 = (tmp_2_fu_136_p2 - x1y2);
assign tmp_4_fu_153_p3 = y_fu_148_p2[ap_const_lv32_1F];
assign tmp_5_fu_161_p4 = {{y_fu_148_p2[ap_const_lv32_1F : ap_const_lv32_8]}};
assign tmp_6_fu_177_p3 = y_fu_148_p2[ap_const_lv32_1F];
assign tmp_7_cast_fu_195_p1 = $signed(tmp_s_fu_185_p4);
assign tmp_8_cast_fu_205_p1 = tmp_8_fu_199_p2;
assign tmp_8_fu_199_p2 = ($signed(tmp_7_cast_fu_195_p1) + $signed(ap_const_lv10_FF));
assign tmp_9_fu_209_p2 = (tmp_4_fu_153_p3 | icmp_fu_171_p2);
assign tmp_fu_101_p2 = x1y1 << ap_const_lv32_3;
assign tmp_s_fu_185_p4 = {{{{tmp_6_fu_177_p3}, {ap_const_lv7_0}}}, {tmp_6_fu_177_p3}};
assign y_fu_148_p2 = (tmp_3_reg_228 - x2y2);


endmodule //laplacian_filter

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

コメント

コメントの投稿


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

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