FC2カウンター FPGAの部屋 Vivado HLS 2014.4 の高位合成テスト2(foo1のHDLコード)
FC2ブログ

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

FPGAの部屋

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

Vivado HLS 2014.4 の高位合成テスト2(foo1のHDLコード)

Vivado HLS 2014.4 の高位合成テスト1(Vivado HLSで高位合成)”の続き。

前回は、”Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2014.1) 2014 年 4 月 2 日”の6ページのコード例を foo1 としてVivado HLS で高位合成を行った。
今回は高位合成の結果出力されたHDLを見てみよう。

まずは、”Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2014.1) 2014 年 4 月 2 日”の6ページのコード例をもう一度引用する。

int foo(char x, char a, char b, char c) {
    char y;
    y = x*a+b+c;
    return y;
}


これをVivado HLS 2014.4 で高位合成した結果のVerilog HDL ファイル foo.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="foo,hls_ip_2014_4,{HLS_INPUT_TYPE=c,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=6.380000,HLS_SYN_LAT=0,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=1,HLS_SYN_FF=0,HLS_SYN_LUT=8}" *)

module foo (
        ap_start,
        ap_done,
        ap_idle,
        ap_ready,
        x,
        a,
        b,
        c,
        ap_return
);

parameter    ap_const_logic_1 = 1'b1;
parameter    ap_true = 1'b1;
parameter    ap_const_logic_0 = 1'b0;

input   ap_start;
output   ap_done;
output   ap_idle;
output   ap_ready;
input  [7:0] x;
input  [7:0] a;
input  [7:0] b;
input  [7:0] c;
output  [31:0] ap_return;

wire  signed [7:0] tmp_fu_43_p0;
wire  signed [7:0] tmp_fu_43_p1;
(* use_dsp48 = "no" *) wire   [7:0] tmp1_fu_49_p2;
wire  signed [7:0] tmp_fu_43_p2;
wire  signed [7:0] y_fu_55_p2;



assign ap_done = ap_start;
assign ap_idle = ap_const_logic_1;
assign ap_ready = ap_start;
assign ap_return = $signed(y_fu_55_p2);
assign tmp1_fu_49_p2 = (b + c);
assign tmp_fu_43_p0 = a;
assign tmp_fu_43_p1 = x;
assign tmp_fu_43_p2 = ($signed(tmp_fu_43_p0) * $signed(tmp_fu_43_p1));
assign y_fu_55_p2 = ($signed(tmp1_fu_49_p2) + $signed(tmp_fu_43_p2));


endmodule //foo


上のVerilog HDL コードを見てもわかるとおりに、ap_done と ap_ready には、ap_start が入っているし、ap_return にも組み合わせ回路で演算結果を返しているだけだ。レイテンシは 0 で、インターバルは 1 の回路になっている。

VHDL コードの foo.vhd も下に示す。

-- ==============================================================
-- 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.
-- 
-- ===========================================================

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity foo is
port (
    ap_start : IN STD_LOGIC;
    ap_done : OUT STD_LOGIC;
    ap_idle : OUT STD_LOGIC;
    ap_ready : OUT STD_LOGIC;
    x : IN STD_LOGIC_VECTOR (7 downto 0);
    a : IN STD_LOGIC_VECTOR (7 downto 0);
    b : IN STD_LOGIC_VECTOR (7 downto 0);
    c : IN STD_LOGIC_VECTOR (7 downto 0);
    ap_return : OUT STD_LOGIC_VECTOR (31 downto 0) );
end;


architecture behav of foo is 
    attribute CORE_GENERATION_INFO : STRING;
    attribute CORE_GENERATION_INFO of behav : architecture is
    "foo,hls_ip_2014_4,{HLS_INPUT_TYPE=c,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=6.380000,HLS_SYN_LAT=0,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=1,HLS_SYN_FF=0,HLS_SYN_LUT=8}";
    constant ap_const_logic_1 : STD_LOGIC := '1';
    constant ap_true : BOOLEAN := true;
    constant ap_const_logic_0 : STD_LOGIC := '0';

    signal tmp_fu_43_p0 : STD_LOGIC_VECTOR (7 downto 0);
    signal tmp_fu_43_p1 : STD_LOGIC_VECTOR (7 downto 0);
    signal tmp1_fu_49_p2 : STD_LOGIC_VECTOR (7 downto 0);
    attribute use_dsp48 : string;
    attribute use_dsp48 of tmp1_fu_49_p2 : signal is "no";
    signal tmp_fu_43_p2 : STD_LOGIC_VECTOR (7 downto 0);
    signal y_fu_55_p2 : STD_LOGIC_VECTOR (7 downto 0);


begin



    ap_done <= ap_start;
    ap_idle <= ap_const_logic_1;
    ap_ready <= ap_start;
        ap_return <= std_logic_vector(resize(signed(y_fu_55_p2),32));

    tmp1_fu_49_p2 <= std_logic_vector(unsigned(b) + unsigned(c));
    tmp_fu_43_p0 <= a;
    tmp_fu_43_p1 <= x;
    tmp_fu_43_p2 <= std_logic_vector(resize(unsigned(std_logic_vector(signed(tmp_fu_43_p0) * signed(tmp_fu_43_p1))), 8));
    y_fu_55_p2 <= std_logic_vector(unsigned(tmp1_fu_49_p2) + unsigned(tmp_fu_43_p2));
end behav;


VHDLもVerilog HDL コードと同じだ。
  1. 2015年01月08日 05:08 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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