系列文章目錄
一、HLS介紹
1、什么是HLS
HLS就是高綜合(High level Synthesis)的縮寫,通過HLS,我們可以將C或者c++語言編譯為FPGA能夠讀懂和運(yùn)行的RTL級別的語言。
這個(gè)術(shù)語是行為和電子系統(tǒng)的結(jié)合:是一門技術(shù),也是一門科學(xué),它把設(shè)計(jì)意圖抽象化,抽象視圖可以自動地將人類設(shè)計(jì)者的努力付諸現(xiàn)實(shí)。最終生成的設(shè)計(jì)應(yīng)遵循一系列要求,包括芯片面積、時(shí)鐘頻率、功耗和時(shí)間性能的要求等等。
通過HLS將電路設(shè)計(jì)規(guī)范的算法級或行為級描述在一定的約束條件下轉(zhuǎn)化為電路結(jié)構(gòu)描述的方法和過程。高層次綜合又稱為行為級綜合、算法級綜合等。它使設(shè)計(jì)者能夠在更高層次進(jìn)行電子設(shè)計(jì),更快速有效地在較高層次設(shè)計(jì)驗(yàn)證和仿真,而較低層次的工作由工具來自動完成,從而讓數(shù)字電路系統(tǒng)設(shè)計(jì)工程師可以有更多的精力和更充分的條件去進(jìn)行設(shè)計(jì)空間的搜索,尋求最佳的設(shè)計(jì)方案。
HLS 的過程通?;景A(yù)處理、編譯、轉(zhuǎn)換、調(diào)度、分配、控制器、綜合、RTL 、生成、和反編譯等幾個(gè)部分。編譯、轉(zhuǎn)換部分決定了軟件的兼容性和易用性,調(diào)度(schedule)和分配(binding)主要決定了產(chǎn)生的 RTL 的性能、資源大小等。
2、與VHDL/Verilog有什么關(guān)系?
verilog 適合于RTL 級別的硬件描述,但是RTL 級別的硬件描述其實(shí)還是過于底層,因此這也帶來了很多繁重的編碼和設(shè)計(jì)工作,類似于匯編程序一樣,Verilog可以精準(zhǔn)的控制電路實(shí)現(xiàn),但實(shí)現(xiàn)起來需要較長的周期,而HLS雖然可快速迭代,但其從軟件到硬件翻譯無論是面積還是資源均難以控制。
VHDL/Verilog兩者結(jié)構(gòu)基本相似,并行語句的種類也類似;
VHDL語言需要進(jìn)行大量說明,程序通常比較長;
Verilog HDL通常不進(jìn)行說明,或只進(jìn)行非常簡短的說明,程序比較簡短。
3、關(guān)鍵技術(shù)局限性
關(guān)鍵技術(shù)
輸入語言采用了類 C語言而非前兩代的 HDL 語言,如 C、C++、SystemC 以及 SpecC、HandelC 等,這能夠使得系統(tǒng)模型得到復(fù)用,進(jìn)行進(jìn)一步的軟硬件實(shí)現(xiàn)。
實(shí)現(xiàn)了對時(shí)序(timing)比較精確的評估和調(diào)度。
實(shí)現(xiàn)了對驗(yàn)證環(huán)境的重復(fù)使用,通過 TLM 建模技術(shù)可以將系統(tǒng)驗(yàn)證環(huán)境復(fù)用于 RTL 級驗(yàn)證,降低了驗(yàn)證的復(fù)雜度。
局限性
沒有早期的性能估計(jì)以及任何違反設(shè)計(jì)和平臺限制的行為
沒有利用所有可能的數(shù)據(jù)通信方式
沒有功能概述,也沒有對用戶代碼進(jìn)行優(yōu)化轉(zhuǎn)換
支持代碼報(bào)告得太晚了
在某些情況下,工具的高效實(shí)施是不可能的,例如當(dāng)必須將太多的加速器映射到硬件部分時(shí)。 HLS工具無法預(yù)先檢測到這種情況,也無法在用戶堅(jiān)持的情況下盡量減輕其影響。
二、Vivado HLS - LED閃爍仿真
1、項(xiàng)目配置
1.點(diǎn)擊Vivado HLS 中的Create New Project
2.接下來選擇定成函數(shù),我們在這里暫不不添加,直接點(diǎn)擊 Next
3.接下來是添加 C 仿真文件,我們同樣先不添加,點(diǎn)擊 Next
4.接下來進(jìn)行器件的選擇,在首先我們點(diǎn)擊圖中所示位置選擇元器件
5.在導(dǎo)航欄中,文件列表所示
6.添加源文件
2、C仿真
1.編寫代碼
Helloworld.h
//helloworld.h
#ifndef _HELLOWORLD_H_
#define _HELLOWORLD_H_
#include "ap_int.h"
typedef ap_int<1> led_t;
void flash_led(led_t *led_o);
#endif
Helloworld.cpp
//Helloworld.cpp
#include "HelloWorld.h"
void flash_led(led_t *led_o){
#pragma HLS INTERFACE ap_ovld port=led_o
int i;
for(i=0;i<10000;i++){
if(i==9999){
*led_o = ~(*led_o);
}
}
}
tb_Helloworld.cpp
#include "HelloWorld.h"
#include <stdio.h>
int main(){
led_t led_o;
const int SHIFT_TIME = 4;
int i;
for(i=0;i<SHIFT_TIME;i++){
flash_led(&led_o);
printf("result : %d \n",(int)(led_o&0x01));
}
}
2、仿真
彈出這個(gè)界面,什么都不用選。
運(yùn)行仿真后,出現(xiàn)下面這個(gè)界面就說明仿真成功了:
3、綜合
進(jìn)行綜合之前,先選擇Top Function。
點(diǎn)擊Project -> Project Setting -> Synthesis ,點(diǎn)擊Helloworld.cpp,并點(diǎn)擊Browse選擇函數(shù)flash_led。
結(jié)束后,會有一個(gè)總結(jié)文件如下:
在這個(gè)文件的最后,有關(guān)于端口的表格:
文件:
3、聯(lián)合仿真
在Helloworld.cpp界面,右邊的Drective界面,右鍵led_o,進(jìn)入如下界面:
按上圖來配置,并點(diǎn)擊OK。
然后點(diǎn)擊聯(lián)合仿真:
文章來源:http://www.zghlxwxcb.cn/news/detail-681183.html
三、總結(jié)
通過HLS工具進(jìn)行LED閃爍仿真可以幫助我們驗(yàn)證設(shè)計(jì)的正確性和功能性。在仿真過程中,我們可以觀察LED的閃爍模式是否與我們預(yù)期的一致,并進(jìn)行必要的調(diào)試和修正。仿真還可以幫助我們評估性能指標(biāo),如時(shí)序約束和資源利用率。文章來源地址http://www.zghlxwxcb.cn/news/detail-681183.html
到了這里,關(guān)于FPGA——HLS入門-LED閃爍仿真的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!