FC2カウンター FPGAの部屋 Vivado HLSでラプラシアン・フィルタ式のみをaxi lite slaveモジュールにする3
FC2ブログ

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

FPGAの部屋

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

Vivado HLSでラプラシアン・フィルタ式のみをaxi lite slaveモジュールにする3

Vivado HLSでラプラシアン・フィルタ式のみをaxi lite slaveモジュールにする2”の続き。

記事が前後してしまったが、Vivado HLSで生成されたVerilog HDLコードをシミュレーションしてみようと思う。
生成されたVerilogはC言語のテストベンチでCo-Simulation してみたがタイミングチャートにして表示する方法がわからなかった。そこで、ISEのプロジェクトを作って、ISimでシミュレーションしてみた。

ISEでプロジェクトを作り、テストベンチを作った。
HLS_lap_filter_21_131006.png

ISimでのシミュレーション結果、レイテンシは 2クロック、インターバルは 1クロックなのが確認できた。
HLS_lap_filter_22_131006.png

作製したテストベンチ lap_fil_tb.v を下に示す。

`timescale 1ns / 1ps

module lap_fil_tb;

    // Inputs
    reg ap_clk = 1'b0;
    reg ap_rst;
    reg ap_start;
    reg x0y0_ap_vld;
    reg x1y0_ap_vld;
    reg x2y0_ap_vld;
    reg x0y1_ap_vld;
    reg x1y1_ap_vld;
    reg x2y1_ap_vld;
    reg x0y2_ap_vld;
    reg x1y2_ap_vld;
    reg x2y2_ap_vld;
    reg [31:0] x0y0;
    reg [31:0] x1y0;
    reg [31:0] x2y0;
    reg [31:0] x0y1;
    reg [31:0] x1y1;
    reg [31:0] x2y1;
    reg [31:0] x0y2;
    reg [31:0] x1y2;
    reg [31:0] x2y2;

    // Outputs
    wire ap_done;
    wire ap_idle;
    wire ap_ready;
    wire x0y0_ap_ack;
    wire [31:0] ap_return;

    parameter        CLK_PERIOD = 10;
    parameter real    CLK_DUTY_CYCLE = 0.5;
    parameter        CLK_OFFSET = 0;
    parameter        START_STATE    = 1'b0;

    initial begin
        #CLK_OFFSET;
        forever begin
            ap_clk = START_STATE;
            #(CLK_PERIOD-(CLK_PERIOD*CLK_DUTY_CYCLE)) ap_clk = ~START_STATE;
            #(CLK_PERIOD*CLK_DUTY_CYCLE);
        end
    end

    // Instantiate the Unit Under Test (UUT)
    laplacian_filter uut (
        .ap_clk(ap_clk), 
        .ap_rst(ap_rst), 
        .ap_start(ap_start), 
        .ap_done(ap_done), 
        .ap_idle(ap_idle), 
        .ap_ready(ap_ready), 
        .x0y0_ap_vld(x0y0_ap_vld), 
        .x1y0_ap_vld(x1y0_ap_vld), 
        .x2y0_ap_vld(x2y0_ap_vld), 
        .x0y1_ap_vld(x0y1_ap_vld), 
        .x1y1_ap_vld(x1y1_ap_vld), 
        .x2y1_ap_vld(x2y1_ap_vld), 
        .x0y2_ap_vld(x0y2_ap_vld), 
        .x1y2_ap_vld(x1y2_ap_vld), 
        .x2y2_ap_vld(x2y2_ap_vld), 
        .x0y0(x0y0), 
        .x0y0_ap_ack(x0y0_ap_ack), 
        .x1y0(x1y0), 
        .x2y0(x2y0), 
        .x0y1(x0y1), 
        .x1y1(x1y1), 
        .x2y1(x2y1), 
        .x0y2(x0y2), 
        .x1y2(x1y2), 
        .x2y2(x2y2), 
        .ap_return(ap_return)
    );

    initial begin
        // Initialize Inputs
        ap_rst = 1;
        ap_start = 0;
        x0y0_ap_vld = 0;
        x1y0_ap_vld = 0;
        x2y0_ap_vld = 0;
        x0y1_ap_vld = 0;
        x1y1_ap_vld = 0;
        x2y1_ap_vld = 0;
        x0y2_ap_vld = 0;
        x1y2_ap_vld = 0;
        x2y2_ap_vld = 0;
        x0y0 = 0;
        x1y0 = 0;
        x2y0 = 0;
        x0y1 = 0;
        x1y1 = 0;
        x2y1 = 0;
        x0y2 = 0;
        x1y2 = 0;
        x2y2 = 0;

        // Wait 100 ns for global reset to finish
        #10;
        
        // Add stimulus here
        @(posedge ap_clk); #1;
        ap_rst = 0;

        @(posedge ap_clk); #1;
        ap_start = 1;
        
        @(posedge ap_clk); #1;
        @(posedge ap_clk); #1;
        @(posedge ap_clk); #1;
        x0y0 = 1;
        x1y0 = 1;
        x2y0 = 1;
        x0y1 = 1;
        x1y1 = 2;
        x2y1 = 1;
        x0y2 = 1;
        x1y2 = 1;
        x2y2 = 1;
        x0y0_ap_vld = 1;
        x1y0_ap_vld = 1;
        x2y0_ap_vld = 1;
        x0y1_ap_vld = 1;
        x1y1_ap_vld = 1;
        x2y1_ap_vld = 1;
        x0y2_ap_vld = 1;
        x1y2_ap_vld = 1;
        x2y2_ap_vld = 1;

        @(posedge ap_clk); #1;
        x0y0 = 0;
        x1y0 = 1;
        x2y0 = 1;
        x0y1 = 1;
        x1y1 = 2;
        x2y1 = 1;
        x0y2 = 1;
        x1y2 = 1;
        x2y2 = 0;

        @(posedge ap_clk); #1;
        x0y0 = 0;
        x1y0 = 1;
        x2y0 = 0;
        x0y1 = 1;
        x1y1 = 2;
        x2y1 = 1;
        x0y2 = 0;
        x1y2 = 1;
        x2y2 = 0;

        @(posedge ap_clk); #1;
        @(posedge ap_clk); #1;
        @(posedge ap_clk); #1;
        @(posedge ap_clk); #1;
        @(posedge ap_clk); #1;
        @(posedge ap_clk); #1;
        @(posedge ap_clk); #1;
        $stop;
    end
      
endmodule


下に、Vivado HLSで生成された laplacian_filter.v のポートマップのみを示す。このVerilog HDLコードを生成したCソースコードは、”Vivado HLSでラプラシアン・フィルタ式のみをaxi lite slaveモジュールにする2”に貼ってある。

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

`timescale 1 ns / 1 ps 

(* CORE_GENERATION_INFO="laplacian_filter,hls_ip_2013_2,{HLS_INPUT_TYPE=c,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=0,HLS_INPUT_PART=xc7z020clg484-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=pipeline,HLS_SYN_CLOCK=7.320000,HLS_SYN_LAT=2,HLS_SYN_TPT=1,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=491,HLS_SYN_LUT=578}" *)

module laplacian_filter (
        ap_clk,
        ap_rst,
        ap_start,
        ap_done,
        ap_idle,
        ap_ready,
        x0y0_ap_vld,
        x1y0_ap_vld,
        x2y0_ap_vld,
        x0y1_ap_vld,
        x1y1_ap_vld,
        x2y1_ap_vld,
        x0y2_ap_vld,
        x1y2_ap_vld,
        x2y2_ap_vld,
        x0y0,
        x0y0_ap_ack,
        x1y0,
        x2y0,
        x0y1,
        x1y1,
        x2y1,
        x0y2,
        x1y2,
        x2y2,
        ap_return
);

  1. 2013年10月05日 19:35 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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