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

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

3天內(nèi)不再提示

請問一下怎樣去使用HLS創(chuàng)建IP呢

OpenFPGA ? 來源:OpenFPGA ? 作者:碎碎思 ? 2022-09-22 09:15 ? 次閱讀

目前我們已經(jīng)單獨使用 HLS 創(chuàng)建了IP(見上一節(jié))。在本實踐中,我們將實際實現(xiàn) HLS 組件作為 FPGA 設(shè)計的一部分。首先我們將學(xué)習(xí)如何做到這一點,然后我們將創(chuàng)建硬件來解決一些實際問題。

首先使用上一節(jié)的文件創(chuàng)建一個新的 HLS 項目:

重新綜合一下

每次我們更改硬件時,我們都需要告訴 HLS 將其導(dǎo)出為硬件描述語言并生成 Vivado 需要的所有各種源數(shù)據(jù)。

選擇Solution → Export RTL → 選擇 "Vivado IP for System Generator" → 單擊確定

接下來我們需要告訴 Vivado 我們的新 IP 在哪里

回到 Vivado,打開 Block Design。單擊Window -> IP Catalog以打開 IP 目錄。單擊左側(cè) Flow Navigator 中的設(shè)置。選擇 IP,然后選擇存儲庫。按加號圖標(biāo)。從文件瀏覽器中選擇 HLS 項目目錄,然后單擊選擇。Vivado 將掃描 HLS 項目,并彈出一個框,顯示 IP 已添加到項目中。單擊確定。

回到 Block Design,單擊圖表左側(cè)的 Add IP 按鈕。IP 核將被稱為之前創(chuàng)建IP時輸入的顯示名稱,或者 Toplevel 。雙擊 IP 進行添加。

要允許 IP 內(nèi)核訪問 DDR 存儲器,需要在 Zynq 處理系統(tǒng)上啟用 AXI 從接口。雙擊 Zynq IP ,選擇“PS-PL Configuration”,展開“HP Slave AXI Interface”,勾選 S AXI HP0 interface. 單擊確定,應(yīng)該會看到 Zynq 模塊上出現(xiàn)一個新端口。

現(xiàn)在可以使用連接自動化來完成連接。運行連接自動化并檢查 S_AXI_HP0. 應(yīng)該建議連接到 m_axi IP 核上的端口。

同樣在連接自動化檢查 s_axi_AXILiteS和s_axi_control. 應(yīng)該連接到M_AXI_GP0 處理系統(tǒng)上。單擊確定。

現(xiàn)在,IP將通過其從接口連接到processing_system7_0_AXI_periph,并通過其主接口連接到AXI_mem_intercon。

730ac054-3a12-11ed-9e49-dac502259ad0.png

現(xiàn)在可以保存模塊設(shè)計、生成比特流并再次導(dǎo)出硬件。覆蓋現(xiàn)有的硬件規(guī)范(XSA 文件)。

連接自動化問題

如果對使用連接自動化生成的 AXI 總線有問題(即,如果它們與上述結(jié)構(gòu)不同),請嘗試刪除所有AXI 互連模塊并再次運行它。

一般原則是, Zynq 模塊的 M_AXI 應(yīng)該可追溯至 IP 內(nèi)核上的所有 S_AXI,而 IP 內(nèi)核的 M_AXI 應(yīng)可追溯至 Zynq 模塊上的 S_AXI_HP0。

在 Vitis 中使用 IP

當(dāng) HLS 導(dǎo)出我們的 IP 時,它幫助我們自動生成了一個軟件驅(qū)動程序。但是我們需要告訴 Vitis 在哪里可以找到這個驅(qū)動程序。

在 Vitis 中,選擇 Xilinx → Repositories。在 Local Repositories 下,單擊 New 并選擇 HLS 項目的文件夾。單擊重新掃描存儲庫,然后單擊確定。

右鍵單擊design_1_wrapper 平臺并單擊“Update Hardware Specification”以更新我們已更改硬件的問題。

我們現(xiàn)在應(yīng)該能夠看到新 IP 及其驅(qū)動程序。

在 Board Support Package 設(shè)置下的platform.spr 文件中,應(yīng)該能夠看到列出的 IP,以及它使用驅(qū)動程序.

現(xiàn)在可以與IP進行交互了,如下例所示。

#include
#include"platform.h"
#include"xil_printf.h"
#include"xparameters.h"
#include"xtoplevel.h"
#include"xil_cache.h"

u32shared[1000];

intmain(){
inti;
XToplevelhls;

init_platform();
Xil_DCacheDisable();

print("
HLStest
");
for(i=0;i

對 FPGA 進行編程并啟動此代碼,應(yīng)該會看到以下內(nèi)容:

HLStest
arg2=12950
arg3=3050

如您所見,目前組件可以使用XToplevel_Start啟動,xtopleevel_IsDone會告訴你何時完成。XToplevel_Set_ram告訴HLS組件共享內(nèi)存在主內(nèi)存中的位置。允許HLS讀寫,就像RAM從0開始一樣,但實際上它將指向我們的共享內(nèi)存。不要忘記設(shè)置RAM偏移量,否則HLS組件將寫入隨機內(nèi)存位!

當(dāng)更改 HLS 時

當(dāng)更改 HLS 代碼時,請執(zhí)行以下步驟以確保的最終文件已更新。

重新運行綜合。

重新導(dǎo)出 IP 核。

在 Vivado 中,應(yīng)該已經(jīng)識別到了變化,并且會出現(xiàn)一條消息說“IP Catalog is out-of-date”。

如果沒有,請單擊 IP Status,然后單擊重新運行報告

單擊刷新 IP 目錄

在“Generate Output Products”對話框中,單擊“Generate”。

單擊生成比特流。

導(dǎo)出硬件(包括比特流)。

在 Vitis 中重新編程 FPGA 并運行軟件。

如果更改了硬件接口,可能需要重新生成系統(tǒng)并將應(yīng)用程序項目移入其中。

測量執(zhí)行時間

下面將舉例使用 ARM 處理系統(tǒng)中的計時器來測量執(zhí)行一段代碼需要多長時間,然后演示可以在硬件中更快地執(zhí)行相同的操作。我們要測量的代碼實現(xiàn)了對Collatz(柯拉茲) 猜想的測試。該猜想指出:

柯拉茲猜想

取任何 正整數(shù)n(其中n不為0)。如果 n 是偶數(shù),則除以 2 得到 n / 2。如果 n 是奇數(shù),則將其乘以 3 并加 1 得到 3 n + 1。無限重復(fù)該過程。猜想是,無論你從哪個數(shù)字開始,你最終總會達到 1。

創(chuàng)建一個 HLS 組件來測試前 1000 個整數(shù),以驗證如果執(zhí)行上述步驟,它們最終都會收斂到 1。將在共享數(shù)組中輸出每個數(shù)字達到 1 所需的步數(shù)。

下面的代碼是使用的ARM軟件:

#include
#include"platform.h"
#include"xil_printf.h"
#include"xparameters.h"
#include"xtoplevel.h"
#include"xil_cache.h"

intshared[1000];
XToplevelhls;

unsignedintcollatz(unsignedintn){
intcount=0;
while(n!=1){
if(n%2==0){
n/=2;
}else{
n=(3*n)+1;
}
count++;
}
returncount;
}

voidsoftware(){
inti;
for(i=0;i

檢查此代碼。該函數(shù)software()是前 1000 個整數(shù)的 Collatz 迭代階段的軟件實現(xiàn),將迭代計數(shù)放在全局數(shù)組shared中。該main函數(shù)設(shè)置 shared為 1 到 1001 的整數(shù),運行software(),然后將結(jié)果打印出來。然后它重置共享并運行hardware()并打印結(jié)果。

在 HLS 中實現(xiàn)一個硬件組件來計算前 1000 個整數(shù)的 Collatz 計數(shù)(就像 ARM 軟件一樣)。從以下頂級結(jié)構(gòu)開始:

#include//Requiredformemcpy()

uint32workingmem[1000];

uint32toplevel(uint32*ram,uint32*arg1,uint32*arg2,uint32*arg3,uint32*arg4){
#pragmaHLSINTERFACEm_axiport=ramoffset=slavebundle=MAXI
#pragmaHLSINTERFACEs_axiliteport=arg1bundle=AXILiteS
#pragmaHLSINTERFACEs_axiliteport=arg2bundle=AXILiteS
#pragmaHLSINTERFACEs_axiliteport=arg3bundle=AXILiteS
#pragmaHLSINTERFACEs_axiliteport=arg4bundle=AXILiteS
#pragmaHLSINTERFACEs_axiliteport=returnbundle=AXILiteS

//Readinstartingvalues
memcpy(workingmem,ram,4000);

//CalculatetheCollatzresults.
//workingmem[x]=collatz(workingmem[x]);
//...yourcodehere...

//Burstcopyworkingmemtomainmemory
memcpy(ram,workingmem,4000);
return0;
}

因為 Collatz 循環(huán)是無界的,所以 HLS 將只有問號而不是時間估計。

然后將 IP 核放入設(shè)計中并運行 IP 核以測試它是否輸出正確的答案。以上main.c應(yīng)該可以驅(qū)動 IP 內(nèi)核。

那么,硬件或軟件更快?

7373ecf0-3a12-11ed-9e49-dac502259ad0.jpg



審核編輯:劉清

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

    關(guān)注

    9

    文章

    428

    瀏覽量

    26452
  • Vivado
    +關(guān)注

    關(guān)注

    19

    文章

    803

    瀏覽量

    66151
  • HLS
    HLS
    +關(guān)注

    關(guān)注

    1

    文章

    128

    瀏覽量

    23968

原文標(biāo)題:在 Vivado 中使用 HLS 創(chuàng)建的IP

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    請問一下怎樣搭建種Arduino IDE環(huán)境

    請問一下怎樣搭建種Arduino IDE環(huán)境?有哪些步驟?
    發(fā)表于 10-25 08:40

    請問一下怎樣設(shè)計種基于stm32f103的數(shù)字示波器

    請問一下怎樣設(shè)計種基于stm32f103的數(shù)字示波器?
    發(fā)表于 11-12 06:51

    請問一下怎樣使用STM32的USART

    請問一下怎樣使用STM32的USART?有哪些操作步驟?
    發(fā)表于 11-18 07:16

    請問一下怎樣使用STM32L152芯片的基本定時器

    請問一下怎樣使用STM32L152芯片的基本定時器?有哪些使用步驟?
    發(fā)表于 11-24 06:24

    請問一下怎樣使用STM32 KEIL的printf函數(shù)

    請問一下怎樣使用STM32 KEIL的printf函數(shù)?
    發(fā)表于 11-30 07:40

    請問一下怎樣使用串口下載stm32程序

    請問一下怎樣使用串口下載stm32程序?有哪些基本步驟
    發(fā)表于 12-06 07:11

    請問一下基于stm32f1的FreeRTOS該怎樣移植

    請問一下基于stm32f1的FreeRTOS該怎樣移植?其代碼該怎樣
    發(fā)表于 12-16 08:10

    請問一下怎樣使用Buildroot編譯madplay

    請問一下怎樣使用Buildroot編譯madplay
    發(fā)表于 12-27 06:32

    請問一下怎樣安裝種TFTP服務(wù)器

    請問一下怎樣安裝種TFTP服務(wù)器?有哪些安裝步驟
    發(fā)表于 12-27 07:25

    請問一下怎樣設(shè)計個Arduino UNO擴展板

    請問一下怎樣設(shè)計個Arduino UNO擴展板
    發(fā)表于 03-01 07:48

    請問一下怎樣移植官方SDK

    請問一下怎樣移植官方SDK?有哪些移植步驟
    發(fā)表于 03-01 07:09

    請問一下在Ubuntu上怎樣編譯Linux固件

    請問一下在Ubuntu上怎樣編譯Linux固件?有哪些配置步驟?
    發(fā)表于 03-09 08:00

    使用Vitis HLS創(chuàng)建屬于自己的IP相關(guān)資料分享

    ,我們直在使用Vivado給我們提供的IP或者使用硬件描述語言制作 IP 。今天我們將講解如何使用HLS-高級綜合語言來創(chuàng)建屬于我們自己的
    發(fā)表于 09-09 16:45

    請問一下怎樣使用cubeide生成些代碼?

    請問一下怎樣使用cubeide生成些代碼?
    發(fā)表于 12-08 09:07

    使用教程分享:在Zynq AP SoC設(shè)計中高效使用HLS IP

    高層次綜合設(shè)計最常見的的使用就是為CPU創(chuàng)建個加速器,將在CPU中執(zhí)行的代碼移動到FPGA可編程邏輯提高性能。本文展示了如何在Zynq AP SoC設(shè)計中使用HLS
    發(fā)表于 02-07 18:08 ?3558次閱讀
    使用教程分享:在Zynq AP SoC設(shè)計中高效使用<b class='flag-5'>HLS</b> <b class='flag-5'>IP</b>(<b class='flag-5'>一</b>)