0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

HLS Stream案例分析

電子工程師 ? 來源:lq ? 2019-04-24 17:36 ? 次閱讀

思考空間

對于如圖11所示的頂層函數(shù),HLS會將其接口綜合成何種形式?

圖11形參為stream的頂層函數(shù)

對于頂層函數(shù),如果形參類型為hls::stream,HLS會將其綜合為ap_fifo類型的接口。

這里,我們看一個HLS Stream應用案例。頂層函數(shù)top由兩個底層函數(shù)read_data和handle_data構成,其中read_data主要功能是從輸入stream上獲取特定數(shù)據(jù);handle_data的主要功能則是對獲取的數(shù)據(jù)進行處理。這里主要是為了說明stream的使用方法,所以,請大家把關注點放在stream的定義、函數(shù)之間的參數(shù)傳遞以及相應的directive的設置等。實際上,read_data和handle_data是可以合并的。

圖1 頭文件

圖2 read_data源代碼

圖3 handle_data源代碼

圖4 top源代碼

從圖2和圖3的代碼中可以看到,從流中讀取數(shù)據(jù)可以用>>或read(),向流中寫入數(shù)據(jù)可以用 << 或write()。同時,在使用 << 或 >> 時,并不需要添加#include 。

首先,執(zhí)行C功能仿真,仿真結束時會出現(xiàn)如圖5所示的warning。

圖5 C Simulation時出現(xiàn)的warning

第二步,不設置任何directive,直接執(zhí)行C綜合,此時會顯示如下錯誤信息。該信息表明,在非dataflow區(qū)域使用默認的FIFO規(guī)模(這個FIFO是因為stream而生成的,默認深度為1),會導致Deadlock。根據(jù)提示我們修改這個FIFO的深度。之后,重新執(zhí)行C綜合和C/RTL Cosimulation,均可通過。

圖6 修改FIFO深度

第三步,進一步優(yōu)化,可以看到這兩個底層函數(shù)是可以應用dataflow以降低latency。具體設置如圖7所示。執(zhí)行C綜合,綜合結束時會顯示如圖8所示信息。[HLS214-111]顯示靜態(tài)變量和非靜態(tài)Stream不能在同一個DATAFLOW區(qū)域中使用,故需要對top.cpp第4行進行修改,只需添加static關鍵字,如圖9所示。再次綜合,該warning即被消除。

圖7 設置DATAFLOW

圖8 C綜合后顯示的warning

圖9 添加static關鍵字

如果只設置DATAFLOW,而不設置FIFO深度,C綜合是可以通過的,但執(zhí)行C/RTL Cosimulation時,會顯示如圖10所示錯誤信息??梢耘袛嗯cFIFO的讀寫相關。這通常是因為出現(xiàn)了FIFO寫滿或者FIFO讀空,從而造成DEADLOCK。從這個角度而言,先設置一個solution,不用進行任何directive的設置,執(zhí)行C綜合,盡可能地修復所有的warning。這個階段給出的warning及修復建議更具體、更具有針對性。

圖10 C/RTLCosimulation錯誤信息

第四步,進一步優(yōu)化,由于數(shù)組key深度只有8,可以完全打散,用register代替,具體設置如圖11所示。

圖11 Array partition

至此,我們創(chuàng)建了3個Solution:

Solution1:設置FIFO深度

Solution2:設置FIFO深度 + 設置DATAFLOW

Solution3:設置FIFO深度 + 設置DATAFLOW + ARRAY PARTITION

3個Solution綜合后的性能對比如圖12所示。

圖12 性能對比

從這個案例我們可以得出如下結論:

-流用于內部函數(shù)間的參數(shù)傳遞時,會被綜合為深度為1的FIFO

-當流數(shù)據(jù)被綜合為FIFO時,由于默認深度為1,可能會在C/RTLCosimulation時出現(xiàn)DEADLOCK

-先創(chuàng)建一個沒有任何directive的Solution執(zhí)行C綜合,盡可能地解決此時出現(xiàn)的warning或者錯誤,這也是UFDM所倡導的設計思想。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關注

    關注

    3

    文章

    4240

    瀏覽量

    62013
  • 代碼
    +關注

    關注

    30

    文章

    4674

    瀏覽量

    67819
  • HLS
    HLS
    +關注

    關注

    1

    文章

    128

    瀏覽量

    23927

原文標題:一個HLS Stream應用案例

文章出處:【微信號:Lauren_FPGA,微信公眾號:FPGA技術驛站】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Stream API原理介紹

    Stream API 是 Java 8 中最重要的新特性之一,它是處理集合和數(shù)組的一種新方式。它提供了一種簡單、靈活和可讀的方式來處理集合和數(shù)組中的元素,從而使代碼更加簡潔、高效和易于維護。 1.
    的頭像 發(fā)表于 09-30 15:31 ?620次閱讀

    新手求助,HLS實現(xiàn)opencv算法加速的IP在vivado的使用

    是video in to AXI4-Stream,接到DMA,而HLS生成的算法IP是AXI4-Stream in and out。我想把AXI-Stream信號輸出接到
    發(fā)表于 01-16 09:22

    Redis Stream應用案例

    的IoT設備會形成巨大的數(shù)據(jù)洪流,采集完成后在云端進行分析,產生巨大的用戶價值。這些數(shù)據(jù)雖然內容各個不同,但是都有一個共同的特點,都是一種時序數(shù)據(jù)??吹竭@里,你可能會突然發(fā)現(xiàn),Redis Stream
    發(fā)表于 06-26 17:15

    可以在EDK中使用Axi4Stream接口/總線嗎?

    你好,我正在EDK中使用axi4stream。有人可以幫助我如何使用通過Vivado高級綜合(HLS)生成的ap_fifo / axi4stream接口可以在EDK中使用嗎?我正在使用Export
    發(fā)表于 02-28 13:47

    Vivado HLS直通AXI Stream IP-Core如何分配

    嗨,我已經創(chuàng)建了一個帶有IP-Core的硬件設計。但它不能正常工作。對于我提到的調試問題,我創(chuàng)建了一個IP-Core,然后通過AXI Stream。所以我可以檢查我的IP-Core是否不起作用
    發(fā)表于 04-14 09:25

    【正點原子FPGA連載】第六章OV5640攝像頭灰度顯示實驗-領航者ZYNQ之HLS 開發(fā)指南

    對一些常用的硬件結構或功能使用C/C++進行建模,并且能夠綜合成RTL。在Vivado HLS中提供的C庫有下面幾種類型:1、任意精度數(shù)據(jù)類型庫2、HLS Stream庫3、HLS數(shù)學
    發(fā)表于 10-13 16:58

    【正點原子FPGA連載】第十一章基于OV5640的自適應二值化實驗-領航者ZYNQ之HLS 開發(fā)指南

    rows,6 int cols7 ){89 #pragma HLS INTERFACE axis port=INPUT_STREAM10 #pragma HLS INTERFACE axis
    發(fā)表于 10-14 16:04

    Vivado HLS實現(xiàn)OpenCV圖像處理的設計流程與分析

    ,需要將輸入和輸出HLS可綜合的視頻設計接口,修改為Video stream接口,也就是采用HLS提供的video接口可綜合函數(shù),實現(xiàn)AXI4 video stream到VivadoH
    發(fā)表于 07-08 08:30

    HLS系列–High Level Synthesis(HLS)的端口綜合2

    在上一章HLS的端口綜合里有提及,HLS綜合后的端口分為2中類型:BlockLevel和Port Level Interface。其中Port level是我們需要重點關注的,它又可以細分為4中類型
    發(fā)表于 02-08 03:27 ?543次閱讀
    <b class='flag-5'>HLS</b>系列–High Level Synthesis(<b class='flag-5'>HLS</b>)的端口綜合2

    HLS系列–High Level Synthesis(HLS)的端口綜合3

    在上一章HLS提到了axi lite端口的綜合方式,以及directive的一些語法規(guī)則。這一章里面,介紹一下axi-stream和full axi端口的綜合實現(xiàn)問題。 1. AXI-Stream
    發(fā)表于 02-08 03:31 ?509次閱讀
    <b class='flag-5'>HLS</b>系列–High Level Synthesis(<b class='flag-5'>HLS</b>)的端口綜合3

    HLS系列–High Level Synthesis(HLS)的端口綜合4

    在上一章HLS提到了axi lite端口的綜合方式,以及directive的一些語法規(guī)則。這一章里面,介紹一下axi-stream和full axi端口的綜合實現(xiàn)問題。 AXI FULL端口的實現(xiàn)
    發(fā)表于 02-08 03:35 ?938次閱讀
    <b class='flag-5'>HLS</b>系列–High Level Synthesis(<b class='flag-5'>HLS</b>)的端口綜合4

    HLS系列–High Level Synthesis(HLS)的端口綜合5

    在之前的3章里,著重講解了HLS對AXI端口(包括axi-lite,axi-stream和full axi端口)的綜合實現(xiàn)問題,下面讓我們來介紹一下其它的端口類型是如何實現(xiàn)的。 在開始之前,先來
    發(fā)表于 02-08 03:39 ?534次閱讀
    <b class='flag-5'>HLS</b>系列–High Level Synthesis(<b class='flag-5'>HLS</b>)的端口綜合5

    Vivado HLS(Zynq TRD)源碼分析

    源碼是官方的2014.4 TRD工程里的,整個工程是基于zc702板子的,但手里只有塊小zybo >_ 里面的硬件設計很有參考價值,最近想用FPGA加速surf算法,先在這分析下TRD工程里
    發(fā)表于 02-08 10:12 ?532次閱讀

    Vitis HLS相關問答詳解

    需要手工在 C++ 代碼里明確指定可并行執(zhí)行的任務(用 task,添加頭文件 hls_task.h),同時可并行執(zhí)行的 task 接口(對應 C++ 函數(shù)的形參)必須是 streamstream_of_blocks。
    的頭像 發(fā)表于 08-11 11:23 ?601次閱讀

    Java的Stream的常用知識

    什么是Stream 生產線 Stream就像處理生產流水線一樣去工作,傳送帶就是Stream的管道,每個工廠關注直接的生產,將上游產品加工成下游需要的產品。為什么Stream比傳統(tǒng)的處
    的頭像 發(fā)表于 10-11 15:45 ?380次閱讀
    Java的<b class='flag-5'>Stream</b>的常用知識