FC2カウンター FPGAの部屋
FC2ブログ

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

FPGAの部屋

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

Vivado HLS勉強会用のラプラシアンフィルタ実習用回路の製作4(PYNQ編1)

Vivado HLS勉強会用のラプラシアンフィルタ実習用回路の製作3”の続き。

今年も筑波大学でやる予定のVivado HLS 勉強会の出し物として、 AXI4 Stream 版のラプラシアンフィルタの実習用回路を作成することにした。勉強会というかセミナでは、なかなか機材が揃わないのでカメラを用意することができない。よって、画像は、C のヘッダ・ファイルに変換した画像を使用してラプラシアンフィルタをかけてディスプレイに表示した。前回までは、ZYBO だったが、今回はPYNQ を使用することにする。同様に、IP を使用して、ディスプレイに表示する回路を構成し、論理合成、インプリメンテーション、ビットストリームの生成を行っていこう。

PYNQ はボード・ファイルが存在しないので、設定用ファイルとして、Digilent 社の”PYNQ-Z1”のページから”Zynq Presets”をダウンロードして、使用する。

さて、Vivado 2017.4 を使用して、プロジェクトを作成し、ブロック・デザインを生成しよう。

Vivado 2017.4 を立ち上げて、lapfilter_axis_pynq プロジェクトを作成した。
lapfilter_axis_zybo_16_190625.png

lapfilter_axis ブロック・デザインを作成した。
PS をAdd IP し、PYNQ のPS 設定情報をロードした。PS の設定情報のロードについては、”PYNQボードでカメラ画像をリアルタイムにFASTX コーナー検出1”を参照のこと。
IP をAdd IP して接続し、ブロック・デザインを完成させた。
lapfilter_axis_zybo_17_190625.png

Address Editor を示す。
lapfilter_axis_zybo_30_190626.png

制約ファイルのlapfilter_axis.xdc を示す。

set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_0_B_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_1_R_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_2_G_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_clk_p]
set_property PACKAGE_PIN K17 [get_ports TMDS_tx_0_B_p]
set_property PACKAGE_PIN K19 [get_ports TMDS_tx_1_R_p]
set_property PACKAGE_PIN J18 [get_ports TMDS_tx_2_G_p]
set_property PACKAGE_PIN L16 [get_ports TMDS_tx_clk_p]

set_false_path -from [get_clocks clk_fpga_0] -to [get_clocks [get_clocks -of_objects [get_pins lapfilter_axis_i/bitmap_disp_cntrler_axi_master_0/inst/dvi_disp_i/BUFR_pixel_clk_io/O]]]

set_false_path -from [get_clocks [get_clocks -of_objects [get_pins lapfilter_axis_i/bitmap_disp_cntrler_axi_master_0/inst/dvi_disp_i/BUFR_pixel_clk_io/O]]] -to [get_clocks clk_fpga_0]


clk_fpga_0 と pclk_buf 間のFalse Path 制約も入れてある。

これで、論理合成、インプリメンテーション、ビットストリーム生成を行った。Project Summary を示す。
lapfilter_axis_zybo_18_190625.png

Timing のエラーが出ている。
Open Implemented Design をクリックして、タイミングの情報を見てみると、clk_fpga_0 のラプラシアンフィルタ IP 内でタイミングのエラーが出ていた。
lapfilter_axis_zybo_19_190625.png

こうなると、Vivado HLS に戻って、ラプラシアンフィルタ IP のタイミングを改善しよう。(ほんの少しのタイミング違反なので、Vivado に頑張ってもらって、タイミングを改善する方法もあるが、時間がかかる)

現在のVivado HLS でのラプラシアンフィルタ IP の性能は、CP achieved post-implementation が 9.421 ns でタイミングを満たしているが、ギリギリだ。
lapfilter_axis_zybo_20_190625.png

現在のC コードの合成時のEstimated は 10.75 ns だった。
lapfilter_axis_zybo_21_190625.png

Vivado HLS 2017.4 の Solution メニューから Solution Settings... を選択して、Synthesis を選択し、Uncertainty を 2 ns に設定した。
lapfilter_axis_zybo_22_190625.png

これで C コードの合成を行った。結果を示す。
lapfilter_axis_zybo_23_190625.png

Estimated は 8.95 ns とだいぶ改善した。
しかし、Export RTL の結果は、CP achieved post-implementation が 9.421 ns で変化が無い。
lapfilter_axis_zybo_24_190625.png

もう一度、Vivado HLS 2017.4 の Solution メニューから Solution Settings... を選択して、Synthesis を選択し、Uncertainty を 3 ns に設定した。
lapfilter_axis_zybo_25_190625.png

C コードの合成を行った。結果を示す。
lapfilter_axis_zybo_26_190625.png

Estimated は 9.40 ns となり、Uncertainty を 2 ns にしたときよりも結果が悪くなった。
もう一度、Export RTL をやってみると、やはり、CP achieved post-implementation が 9.421 ns で変化が無い。

Uncertainty を 5 ns にすると、C コードの合成結果は更に良くなったが、Export RTL をやってみると、やはり、CP achieved post-implementation が 9.421 ns で変化が無い。
lapfilter_axis_zybo_27_190625.png

いくらUncertainty を変更しても回路に変更はないようだ。Vivado HLS では時としてこういうこともある。

ということで、回路の改善は望めないので、動作周波数を変更しよう。
DMAからAXI4 Stream に変換する、またはその逆のIP のスループットは 2 クロックで 1 転送になっている。現在は 100 MHz で駆動しているので、50 MHz で 1 クロックで 1 転送しているのと同じことになる。表示する SVGA のピクセル・クロックは 40 MHz なので、40 MHz に 1 転送できれば十分である。ということで、クロックを下げる余地があることが分かる。よってクロックを 100 MHz から 90 MHz に変更しよう。

ブロック・デザインの processing_system7_0 をダブルクリックして開き、FCLK_CLK0 を 90 MHz に設定する。
lapfilter_axis_zybo_28_190625.png

これで、もう一度、論理合成、インプリメンテーション、ビットストリーム生成を行った。Project Summary を示す。
lapfilter_axis_zybo_29_190625.png

これでタイミング制約も満足した。
  1. 2019年06月26日 04:22 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

FPGAの部屋のまとめサイトの更新(2019年6月24日)

FPGAの部屋のまとめサイトを更新しました。Donkey Car, ROS, Jetson Nano の記事を追加して、その他の記事を更新しました。
  1. 2019年06月24日 20:32 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

「AI RCカー勉強会@柏の葉「Donkey Carハンズオン」」に行ってきました

AI RCカー勉強会@柏の葉「Donkey Carハンズオン」」に行ってきました。

Donkey Car はRaspberry Pi 3+ + Pi Camera で動作するロボットカー・キットです。4 輪駆動車をベースにしていて前輪の向きを変えて曲がることができます。ジョイスティックで自分でコースを走らせて、学習データを取得します。Raspberry Pi 3+ のアプリケーションソフトで、学習データを作成して、それを Google のColab にアップロードして学習します。そのモデルをDonkey Car に入れてコースを走らせます。

最初にDonkey Car を組み立てましたが、さほど苦労せずに組み立てることができました。
DonkeyCar_1_190623.jpg

パソコンでマニュアルを見ながらやっています。後で、SSH でRaspberry Pi 3+ に入るときや、SFTP で学習データをRaspberry Pi 3+ から取り出すときや、学習済みモデルをRaspberry Pi 3+ にアップロードするときにもパソコンを使いました。
DonkeyCar_2_190623.jpg

Donkey Car を無線LAN に接続します。
DonkeyCar_3_190623.jpg

学習データを取得するアプリケーションソフトを起動して、Donkey Car を走らせます。学習データはJPG ファイルとステアのアングルとスロットルのデータが書かれたJSON ファイルの組でした。これを 5000 個程度取得しました。
DonkeyCar_4_190623.jpg
DonkeyCar_5_190623.jpg
DonkeyCar_6_190623.jpg

とにかく、私には走らせるのが難しいですね。。。練習が必要でした。ですので、学習データの質は推して知るべしです。。。

学習データをColab にアップロードして学習させます。
学習が終了したら、生成されたモデルをダウンロードしてRaspberry Pi 3+ にアップロードします。
そして、他の方ですが、学習済みモデルで走らせているところです。
DonkeyCar_7_190623.jpg

私のは、学習の時にスピードが出てなかったので、スロットルの値が低く、そのままでは走り出しませんでしたが、ズルしてスロットルに下駄をはかせて走るようにしました。でも学習データがよろしくなく、途中でコースアウトしちゃいました。
とっても面白かったです。それにツールが充実しているのがとっても良いですね。Zybot と違ってステアリング切れるし、欲しくなりました。4万円だそうです。買っちゃおうかな?でも、コースが取れないんですよね。特に今回のDonkey Car はスピード出るので、ある程度の広さの場所が必要です。

Donkey Car ではないですが、JetBot を持ってきていらっしゃる方がいらしゃいました。
DonkeyCar_8_190623.jpg
  1. 2019年06月23日 04:49 |
  2. Donkey Car
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS勉強会用のラプラシアンフィルタ実習用回路の製作3

Vivado HLS勉強会用のラプラシアンフィルタ実習用回路の製作2”の続き。

今年も筑波大学でやる予定のVivado HLS 勉強会の出し物として、 AXI4 Stream 版のラプラシアンフィルタの実習用回路を作成することにした。ということで、前回までは、Windows 10 の Vivado 2017.4 で lapfilter_axis_zybo プロジェクトを作成し、lap_filter_axis 、axis2DMA2st と DMA2axis2st IP をリポジトリに登録し、lapfilter_axis ブロック・デザインを新規作成して、IP をAdd IP して、回路を作り始めた。今回は、回路を完成させて、論理合成、インプリメンテーション、ビットストリームの生成を行った。今回は、ハードウェアをエクスポートして、SDK を起動し、アプリケーションソフトを作成して実機確認を行う。

ハードウェアをエクスポートして、SDK を起動した。
そして、lapfilter_axis.c という名前のアプリケーションソフトを作成した。
lapfilter_axis_zybo_14_190623.png

lapfilter_axis.c のソースコードを貼っておく。

/*
 * lapfilter_axis.c
 *
 *  Created on: 2019/06/21
 *      Author: marsee
 */

#include <stdio.h>
#include "xil_io.h"
#include "xparameters.h"

#include "xlap_filter_axis.h"
#include "xdma2axis.h"
#include "xaxis2dma2st.h"
#include "bmp_data.h"

#define FRAME_BUFFER_ADDRESS 0x10000000
#define DMA_DEST_ADDRESS 0x10200000

#define HORIZONTAL_PIXELS   800
#define VERTICAL_LINES      600

int bmp_write(unsigned int addr);

int main(){
    XLap_filter_axis xlf_axis_ap;
    XDma2axis xdma2axis_ap;
    XAxis2dma2st xaxis2dma_ap;
    int inbyte_in;

    XLap_filter_axis_Initialize(&xlf_axis_ap, 0);
    XDma2axis_Initialize(&xdma2axis_ap, 0);
    XAxis2dma2st_Initialize(&xaxis2dma_ap, 0);

    XDma2axis_Set_y_size(&xdma2axis_ap, (u32)VERTICAL_LINES);
    XDma2axis_Set_x_size(&xdma2axis_ap, (u32)HORIZONTAL_PIXELS);
    XDma2axis_Set_sel(&xdma2axis_ap, (u32)0);
    XDma2axis_Set_in_V(&xdma2axis_ap, (u32)FRAME_BUFFER_ADDRESS);

    XAxis2dma2st_Set_y_size(&xaxis2dma_ap, (u32)VERTICAL_LINES);
    XAxis2dma2st_Set_x_size(&xaxis2dma_ap, (u32)HORIZONTAL_PIXELS);
    XAxis2dma2st_Set_sel(&xaxis2dma_ap, (u32)0);
    XAxis2dma2st_Set_out_V(&xaxis2dma_ap, (u32)DMA_DEST_ADDRESS);

    bmp_write(FRAME_BUFFER_ADDRESS);
    bmp_write(FRAME_BUFFER_ADDRESS);

    XAxis2dma2st_Start(&xaxis2dma_ap);
    XLap_filter_axis_Start(&xlf_axis_ap);
    XDma2axis_Start(&xdma2axis_ap);

    Xil_Out32(XPAR_BITMAP_DISP_CNTRLER_AXI_MASTER_0_BASEADDR, DMA_DEST_ADDRESS);

    while(1){
        printf("\nPlease input <0> or <1> (<q> : exit) = ");
        fflush(stdout);
        inbyte_in = inbyte();
        printf("%c", inbyte_in);
        fflush(stdout);
        switch(inbyte_in) {
            case '0': //bmp image
                XDma2axis_Set_sel(&xdma2axis_ap, (u32)0);
                XAxis2dma2st_Set_sel(&xaxis2dma_ap, (u32)0);

                XAxis2dma2st_Start(&xaxis2dma_ap);
                XLap_filter_axis_Start(&xlf_axis_ap);
                XDma2axis_Start(&xdma2axis_ap);
                break;
            case '1': // Laplacian filter
                XDma2axis_Set_sel(&xdma2axis_ap, (u32)1);
                XAxis2dma2st_Set_sel(&xaxis2dma_ap, (u32)1);

                XAxis2dma2st_Start(&xaxis2dma_ap);
                XLap_filter_axis_Start(&xlf_axis_ap);
                XDma2axis_Start(&xdma2axis_ap);
                break;
            case 'q': // exit
                return(0);
        }
    }
}

int bmp_write(unsigned int addr){
    for(int y=0; y<VERTICAL_LINES; y++){
        for(int x=0; x<HORIZONTAL_PIXELS; x++){
            Xil_Out32(addr+(y*HORIZONTAL_PIXELS+x)*sizeof(int),
                ((int)bmp_file_array[y][x][2]<<16)+((int)bmp_file_array[y][x][1]<<8)+(int)bmp_file_array[y][x][0]);
        }
    }
    return(0);
}


なお、bmp_write(FRAME_BUFFER_ADDRESS); を 2 回書いているのは、そうしないと画像にゴミが入ってしまうからだ。もしかしてキャッシュの関係で実は 1 回では書けていないのかもしれない?

SDK からビットストリームをZYBO にダウンロードして、アプリケーションソフトを起動するとTeraTerm に表示が出て、ディスプレイにも画像が出た。
lapfilter_axis_zybo_15_190623.png

lapfilter_axis_zybo_16_190623.jpg

TeraTerm 上で、 1 を入力すると、回路上で、AXI4 Stream が切り替わって、ラプラシアンフィルタの画像が表示された。
lapfilter_axis_zybo_17_190623.jpg

TeraTerm 上で 0 を入力すると、元の画像に戻った。
lapfilter_axis_zybo_16_190623.jpg

これでZYBO 版は完成だが、PYNQ 版とZYBO Z7-20 版も開発する予定だ。
  1. 2019年06月23日 04:11 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS勉強会用のラプラシアンフィルタ実習用回路の製作2

Vivado HLS勉強会用のラプラシアンフィルタ実習用回路の製作1”の続き。

今年も筑波大学でやる予定のVivado HLS 勉強会の出し物として、 AXI4 Stream 版のラプラシアンフィルタの実習用回路を作成することにした。ということで、前回は、Windows 10 の Vivado 2017.4 で lapfilter_axis_zybo プロジェクトを作成し、lap_filter_axis 、axis2DMA2st と DMA2axis2st IP をリポジトリに登録し、lapfilter_axis ブロック・デザインを新規作成して、IP をAdd IP して、回路を作り始めた。今回は、回路を完成させて、論理合成、インプリメンテーション、ビットストリームの生成を行う。

まずは、ビットマップ・ディスプレイ・コントローラを追加して、完成したブロック・デザインを示す。
lapfilter_axis_zybo_5_190621.png

アドレスマップを示す。
lapfilter_axis_zybo_6_190621.png

これで、論理合成、インプリメンテーション、ビットストリームの生成を行ったところ、Critical Warning が 1 つ出ている。Open Implemented Design を開いて、タイミングを見た。

clk_fpga_0 to pclk_buf のセットアップ・タイムがエラーだった。
lapfilter_axis_zybo_8_190621.png

Source が lapfilter_axis_i/bitmap_disp_cntrler_axi_master_0/inst/bitmap_disp_eng_inst/hv_count_enable_reg/C で、Destination が lapfilter_axis_i/bitmap_disp_cntrler_axi_master_0/inst/bitmap_disp_eng_inst/hv_cnt_ena_d1_reg/D だった。
これは、bitmap_disp_eng.v のソースコードのこの部分に相当する。
lapfilter_axis_zybo_9_190621.png

これは、AXI のクロックからディスプレイのクロックに明示的に載せ替えている部分なので、問題無い。

次に pclk_buf から clk_fpga_0 のパスもエラーになっていた。
Source が lapfilter_axis_i/bitmap_disp_cntrler_axi_master_0/inst/bitmap_disp_eng_inst/vsyncx_node_reg/C で Destination が lapfilter_axis_i/bitmap_disp_cntrler_axi_master_0/inst/bitmap_disp_eng_inst/vsync_axi_b1_reg/D だ。
これは、bitmap_disp_eng.v のソースコードのこの部分に相当する。
lapfilter_axis_zybo_10_190621.png

これも、ディスプレイのクロック・ドメインの信号をAXI のクロック・ドメインの信号に明示的に載せ替えているので、問題無い。

ということで、クロック・ドメイン同士に False Path の設定をした。
制約ファイルを示す。
lapfilter_axis_zybo_11_190621.png

set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[0]}]
set_property PACKAGE_PIN J18 [get_ports {vga_blue[3]}]
set_property PACKAGE_PIN K19 [get_ports {vga_blue[2]}]
set_property PACKAGE_PIN M20 [get_ports {vga_blue[1]}]
set_property PACKAGE_PIN P20 [get_ports {vga_blue[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_blue[4]}]
set_property PACKAGE_PIN G19 [get_ports {vga_blue[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_green[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {vga_red[0]}]
set_property PACKAGE_PIN F20 [get_ports {vga_green[5]}]
set_property PACKAGE_PIN H20 [get_ports {vga_green[4]}]
set_property PACKAGE_PIN J19 [get_ports {vga_green[3]}]
set_property PACKAGE_PIN L19 [get_ports {vga_green[2]}]
set_property PACKAGE_PIN N20 [get_ports {vga_green[1]}]
set_property PACKAGE_PIN H18 [get_ports {vga_green[0]}]
set_property PACKAGE_PIN F19 [get_ports {vga_red[4]}]
set_property PACKAGE_PIN G20 [get_ports {vga_red[3]}]
set_property PACKAGE_PIN J20 [get_ports {vga_red[2]}]
set_property PACKAGE_PIN L20 [get_ports {vga_red[1]}]
set_property PACKAGE_PIN M19 [get_ports {vga_red[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports vga_hsync]
set_property IOSTANDARD LVCMOS33 [get_ports vga_vsync]
set_property PACKAGE_PIN P19 [get_ports vga_hsync]
set_property PACKAGE_PIN R19 [get_ports vga_vsync]

set_false_path -from [get_clocks clk_fpga_0] -to [get_clocks [get_clocks -of_objects [get_pins lapfilter_axis_i/bitmap_disp_cntrler_axi_master_0/inst/dvi_disp_i/BUFR_pixel_clk_io/O]]]

set_false_path -from [get_clocks [get_clocks -of_objects [get_pins lapfilter_axis_i/bitmap_disp_cntrler_axi_master_0/inst/dvi_disp_i/BUFR_pixel_clk_io/O]]] -to [get_clocks clk_fpga_0]


これで、もう一度、論理合成、インプリメンテーション、ビットストリームの生成を行ったところ、Critical Warning が出なくなって、タイミングもOK になった。
lapfilter_axis_zybo_12_190621.png
lapfilter_axis_zybo_13_190621.png
  1. 2019年06月21日 05:12 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS勉強会用のラプラシアンフィルタ実習用回路の製作1

Zybot のモーター制御回路の製作はひとまずペンディングにして、今年も筑波大学でやる予定のVivado HLS 勉強会の出し物として、 AXI4 Stream 版のラプラシアンフィルタの実習用回路を作成することにした。
下の一連のブログのシリーズはAXI4 Stream 版のラプラシアンフィルタの実習用回路の下準備だったのだ。
Vivado HLS 2019.1 を使用してBMPファイルをC のヘッダファイルに変換する
BMPファイルをC のヘッダファイルに変換したファイルを検証してみた
AXI4 Stream 出力にAXI4 Stream スイッチ付きのDMA Read IP 1
AXI4 Stream 出力にAXI4 Stream スイッチ付きのDMA Read IP 2
AXI4 Stream 入力にAXI4 Stream スイッチ付きのDMA Write IP 1
AXI4 Stream 入力にAXI4 Stream スイッチ付きのDMA Write IP 2

ただし、Vivado HLS 勉強会の資料は Vivado HLS 2017.4 で作成されているため、Vivado HLS 2017.4 で、このようにIP を再度作成した。
lapfilter_axis_zybo_1_190620.png

Windows 10 の Vivado 2017.4 で lapfilter_axis_zybo プロジェクトを作成し、lap_filter_axis 、axis2DMA2st と DMA2axis2st IP をリポジトリに登録した。
lapfilter_axis_zybo_3_190620.png

lapfilter_axis_zybo_2_190620.png

lapfilter_axis ブロック・デザインを新規作成して、IP をAdd IP して、回路を作り始めた。まだ途中だけれど下に示す。
lapfilter_axis_zybo_4_190620.png

後はビットマップ・ディスプレイ・コントローラを追加する予定だ。
そして、カメラがない状態でもBMP ファイルを変換した C のヘッダ・ファイルを使用して、ラプラシアンフィルタを通した画像をディスプレイに表示する。これは、主にベアメタル・アプリケーションで画像を表示したいからだ。
  1. 2019年06月20日 05:27 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Zybot のモーターの回転数と回転方向を取得する3(HDLシミュレーションにVivado HLS を使用する2)

Zybot のモーターの回転数と回転方向を取得する2(HDLシミュレーションにVivado HLS を使用する1)”の続き。

HDL を作成したら次はHDL シミュレーションだが、HDL シミュレーションもSA, SB のタイミングを作成する回路をVivado HLS で作ったら、とっても便利なんじゃない?ということで、作ってみた。ということで、前回は、ソースコードをブログに貼った。今回は、C コードの合成、C/RTL 協調シミュレーション、Export RTL(IP として使うことはないのだけれど)を行う。

まずは C コードの合成を行った。結果を示す。
rot_sim_2_190619.png

Estimated が 0 ns なのが変だが、Latency は 40 クロックで合っている。FF と LUT も使用されているということで大丈夫だろう?

次に、C/RTL 協調シミュレーションを行った。
rot_sim_3_190619.png

これも 40 クロックで予定通りだ。

C/RTL 協調シミュレーションの波形を見てみよう。
rot_sim_4_190619.png

sa_V と sb_V からとってもそれらしい波形が出ている。

最後に Export RTL をやってみたが、本当は、IP 化することはないので必要ない。ただし、Vivado synthesis, place and route にチェックを入れてある。
rot_sim_5_190619.png

LUT や FF が使用されているので、大丈夫だろう?
CP achieved post-implementation も 3.095 ns だった。
  1. 2019年06月19日 03:54 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0
»