FC2カウンター FPGAの部屋 Vivado HLSの高位合成結果をHDLとして利用する1(準備編)

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

FPGAの部屋

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

Vivado HLSの高位合成結果をHDLとして利用する1(準備編)

Vivado HLS はAXI4バスのプロトコルを C や C++ から、とっても便利に使用することができる。コードをろくに書かなくてもAXI4バスの機能を使うことができるのをこのブログでも書いてきた。それじゃ、CやC++ で書いて高位合成したHDLを普通のHDLとして使うことができるかを検証していきたいと思う。

まだ、”AXI4-Stream版ラプラシアンフィルタIPのカメラ表示システム”を作っている途中ではあるが、一時中断して、こっちをやってみようと思っている。高位合成で簡単に大部分のHDLを作って楽をしたいと思っている。

”Vivado Design Suite ユーザーガイド 高位合成 UG902 (v2014.3) 2014 年 10 月 1 日”を参考にさせて頂く。

まずは、インターフェース合成時プロトコルとして、129ページの”図 1‐49 : デー タ型と インターフェイス合成のサポート”を引用させて頂く。
C2HDL_1_150519.png
D : 各型のデフォルトのインターフェースモード
I : 入力引数(Readのみ)
O : 出力引数(Write のみ)
I/O : 入出力引数(Read Write 両方)

このようにいろいろなプロトコルがサポートされている。例えば、ap_vld はvalid つまり有効信号が付いたプロトコルである。Return の通常値はap_ctrl_hs なので、通常は、ap_start, ap_idle, ap_ready, ap_done 信号が付加される。

今回の目的は、C++ で書いてHDLとして使うことを目的としている。HDLでデータのやりとりをするハンドシェーク信号を ap_??? を使って実装するようにしていけば、通常のHDLとして使えるのではないかと思っている。つまり、IPそのものをVivado HLSで生成するのでも良いのだが、IPの一部品としてのHDLコードをVivado HLSで作っていけるのではないか?ということでブログで結果を書いていきたいと思っている。

まずは、簡単な例を作って、Vivado HLSで高位合成してみよう。いろいろなプロトコルのディレクティブを付加すると、どのようにインターフェースが変わるかを見ていこう。

下に例を示す。入力した8ビットのデータ ( cntin ) を +1 して、8ビットのデータとして出力 ( cntout ) する一番簡単な C ソースコードを下に示す。

//
// handshake_test.cpp
// 2015/05/17
// by marsee
//

#include <stdio.h>
#include <string.h>
#include <ap_int.h>

void handshake_test(ap_int<8> cntin, ap_int<8> *cntout){
    *cntout = cntin+1;
}


ZYBOのZYNQを指定してVivado HLS 2014.4 でプロジェクトを作製した。もういろいろとテストしてあるが気にしないでください。
C2HDL_2_150519.png

下に高位合成をした結果を示す。
C2HDL_3_150519.png

10 ns 周期のクロックに対して、Estimated は 1.72 ns 、Latency は 0 クロック、Interval は 1 クロックで、つまりは組み合わせ回路になっているということだ。

Analysis 画面を示す。
C2HDL_6_150519.png

生成されたHDLファイルを下に示す。ap_clk が無く、組み合わせ回路になっていることが分かる。 ( handshake_test.v )
入力の cntin は ap_none で、出力の cntout は ap_vld だった。これはデフォルト値だ。

// ==============================================================
// 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="handshake_test,hls_ip_2014_4,{HLS_INPUT_TYPE=cxx,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=1,HLS_INPUT_PART=xc7z010clg400-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK=1.720000,HLS_SYN_LAT=0,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=0,HLS_SYN_LUT=8}" *)

module handshake_test (
        ap_start,
        ap_done,
        ap_idle,
        ap_ready,
        cntin_V,
        cntout_V,
        cntout_V_ap_vld
);

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

input   ap_start;
output   ap_done;
output   ap_idle;
output   ap_ready;
input  [7:0] cntin_V;
output  [7:0] cntout_V;
output   cntout_V_ap_vld;

reg cntout_V_ap_vld;




/// cntout_V_ap_vld assign process. ///
always @ (ap_start)
begin
    if (~(ap_start == ap_const_logic_0)) begin
        cntout_V_ap_vld = ap_const_logic_1;
    end else begin
        cntout_V_ap_vld = ap_const_logic_0;
    end
end
assign ap_done = ap_start;
assign ap_idle = ap_const_logic_1;
assign ap_ready = ap_start;
assign cntout_V = (cntin_V + ap_const_lv8_1);


endmodule //handshake_test


クロック信号が無いのは、クロック周期の制約を満たせているからだ。ここで、クロック周期を今の、Estimated よりも小さい 1.5 ns にしてみよう。

高位合成結果を下に示す。
C2HDL_4_150519.png

10 ns 周期のクロックに対して、Estimated は 0.85 ns 、Latency は 1 クロック、Interval は 2 クロックで、FF が入った順序回路になっていることが分かる。
生成されたVerilog ソースコードも handshake_test.v と handshake_test_add_8ns_8ns_8_2.v の2つ生成されている。
Analysis 画面を示す。
C2HDL_5_150519.png

+ 演算に2クロックかけているようだ。

handshake_test.v を見ると ap_clk ポートが追加されていた。長いので、ポート宣言部分のみ貼っておく。

module handshake_test (
        ap_clk,
        ap_rst,
        ap_start,
        ap_done,
        ap_idle,
        ap_ready,
        cntin_V,
        cntout_V,
        cntout_V_ap_vld
);

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

コメント

コメントの投稿


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

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