1 HLS
1.1 HLS簡介
HLS(High Level Synthesis)
:一款高層次綜合工具。
- 能夠?qū)?
C/C++
或者system C
等高級語言轉(zhuǎn)化為RTL
(底層硬件描述語言)電路,降低開發(fā)時間。 - 提供了常見的庫(例如圖像處理相關的
OpenCv
庫和其
它的數(shù)學庫)。 - 可以創(chuàng)建IP并通過例化或者使用
BlockDesign
的方式應用到項目中。
轉(zhuǎn)化原理:在前端將 C 語言描述進行分析,然后進行代碼層面的優(yōu)化(code-level transformation),再在后端把這些運算工作進行并行調(diào)度(parallelise & schedule),最后生成 RTL 語言。
使用HLS開發(fā)流程:
- 第一步C/C++層面的仿真:
首先在源文件中,添加一個頂層函數(shù),這個函數(shù)就是我們想要將來映射到 RTL 電路中的函數(shù),之后需要一個 C Testbench 來對這個函數(shù)功能進行驗證,在算法層面,檢驗我們的函數(shù)是否能夠正常工作。(算法層面的仿真,能夠很快地就得出結果,有助于提高我們的開發(fā)效率。) - 第二步對C 代碼進行綜合:
綜合后會根據(jù)我們的功能函數(shù),產(chǎn)生相應的電路。在 C 綜合階段,HLS 會根據(jù)我們對功能函數(shù)中的一些約束(Directive),來生成不同的接口。 - 第三步C/RTL 的聯(lián)合仿真:
在這一階段,HLS 會根據(jù)我們的 C Testbench 來生成我們的 RTL 的 Testbench 并且根據(jù)我們所選擇的仿真工具來進行 RTL 級的仿真。仿真完成后我們可以觀察聯(lián)合仿真所產(chǎn)生的波形。 - 第四步導出IP:
前面有提到過 HLS 相當于一個 IP 生成器,它能夠?qū)⑽覀兊母呒壵Z言的代碼映射為一個 IP,我們可以根據(jù)需要將這些 IP 導出到 Vivado 的集成開發(fā)環(huán)境中,將這些算法的 IP 應用到實際的工程當中。
1.2 HLS與VHDL/Verilog
- 隨著FPGA密度隨著工藝幾何尺寸的縮小而不斷增長,設計復雜性使得繼續(xù)使用傳統(tǒng)的HDL設計流程變得越來越困難。盡管HDL語言和工具已經(jīng)發(fā)展,但是設計周期仍然長得令人討厭。為了幫助解決該問題,出現(xiàn)了高級綜合(HLS)編譯器,以使設計人員能夠進入更高的抽象級別。
- HLS能自動把 C/C++ 之類的高級語言轉(zhuǎn)化成 Verilog/VHDL 之類的底層硬件描述語言(RTL),生成定制硬件在 FPGA 上跑實現(xiàn)加速。這使得不懂硬件的軟件工程師也可以擁有玩轉(zhuǎn)硬件的能力。
- 為了提高設計數(shù)字硬件組件的效率,高層綜合(HLS)被視為提高設計抽象水平的下一步。但是,HLS工具的結果質(zhì)量(QoR)往往落后于手動寄存器傳輸級別(RTL)流程的質(zhì)量。
- HLS 經(jīng)過十數(shù)年的發(fā)展,雖然有諸如 AutoPilot、OpenCL SDK 等 FPGA HLS 商業(yè)化成功的案例出現(xiàn),但距離其完全替代人工 RTL 建模還有很長的路要走。
1.3 HLS優(yōu)點與局限
- 優(yōu)點
- 第一,使對于軟件工程,實現(xiàn)算法基于硬件(
ASIC
或者FPGA
)的計算加速。 - 第二,高層語言能促進 IP 重用的效率。
- 第三,
HLS
能幫助軟件和算法工程師參與、甚至主導芯片或FPGA
設計。 - 第四、對于IC設計開發(fā),從抽象的C層級進行功能設計。
- 第五、對于硬件驗證,從更抽象的層次進行功能性驗證,加速設計流程。
- 第一,使對于軟件工程,實現(xiàn)算法基于硬件(
- 局限
IP library
尚未全面還在不斷升級,距離其完全替代人工RTL
建模還有路要走。
2 環(huán)境配置
安裝vivado的參考鏈接:
https://blog.csdn.net/qq_43279579/article/details/116849636
對于vivado的安裝,就已經(jīng)自動完成了HLS
3 HLS實例——Led點亮
3.1 工程創(chuàng)建
- 打開Vivado HLS,點擊
Create New Project
- 輸入相關工程信息
- 選擇頂層函數(shù),此處暫時不管
- 選擇添加C仿真文件,此處可以暫時不管
- 選擇器件
輸入搜索選擇芯片,點擊ok
,點擊finish
,完成工程創(chuàng)建。
3.2 添加文件
- 源文件添加
點擊Source
,右鍵后,選擇New File
,創(chuàng)建文件
led.h
#ifndef _SHIFT_LED_H_
#define _SHIFT_LED_H_
#include "ap_int.h"
#define CNT_MAX 100000000
//#define CNT_MAX 100,100M時鐘頻率下計數(shù)一秒鐘所需要的計數(shù)次數(shù)
#define FLASH_FLAG CNT_MAX-2
// typedef int led_t;
// typedef int cnt_t;
typedef ap_int<1> led_t;
typedef ap_int<32> cnt_t;
void flash_led(led_t *led_o , led_t led_i);
#endif
led.cpp
#include "led.h"
void flash_led(led_t *led_o , led_t led_i){
#pragma HLS INTERFACE ap_vld port=led_i
#pragma HLS INTERFACE ap_ovld port=led_o
cnt_t i;
for(i=0;i<CNT_MAX;i++){
if(i==FLASH_FLAG){
*led_o = ~led_i;
}
}
}
- 仿真測試文件添加
右鍵Test Bench
,選擇New File
test_led.cpp
#include "led.h"
#include <stdio.h>
int main(){
led_t led_i=0x01;
led_t led_o;
const int SHIFT_TIME = 4;
int i;
for(i=0;i<SHIFT_TIME;i++){
flash_led(&led_o , led_i);
led_i = led_o;
printf("shift_out is %d \n",(int)(led_o&0x01));
}
}
3.3 C仿真與C綜合
- 點擊project->project settings->synthesis->browser->選擇頂層函數(shù)
- 點擊project->Run C Simulation
輸出01交替,表示C仿真結果正確
- 點擊Solution->Run C Synthesis->Active Solution
3.4 創(chuàng)建Vivado工程
- 打開Vivado,選擇Greate Project
- 點擊Next,進行項目信息填寫
- 勾選RTL Project
-
Source
和約束文件添加,暫時不管,直接Next
,之后選擇器件 - 點擊
Finish
3.5 導入HLS生成的IP核
- 生成IP核
選擇Solution
->Export RTL
在此處出現(xiàn)一個報錯信息:
解決方法如下:
參考Xilinx官網(wǎng)的補丁及使用方法進行修改
https://support.xilinx.com/s/article/76960?language=en_US
下載 Xilinx官網(wǎng)支持社區(qū)給出的補丁包,解壓到Xilinx安裝位置,如圖所示:
打開cmd,進入該目錄,執(zhí)行命令python y2k22_patch\patch.py
:
- 導入
點擊setting
選擇IP
->Repository
,并且點擊加號,選擇solution
,將會自動識別到IP,識別到后,點擊Apply
->OK
檢驗是否導入成功
生成IP,選中后雙擊
3.6 添加實驗代碼
- 選擇
Add Sources
- 文件名稱填寫
代碼內(nèi)容:
`timescale 1ns / 1ps
module flash_led(
input wire clk ,
input wire rst_n ,
output wire led_o
);
wire rst ;//同步復位
wire ap_ready ;//當前可以接收下一次數(shù)據(jù)
reg ap_start ;//IP 開始工作
reg led_i_vld ;//輸入數(shù)據(jù)有效
wire led_o_vld ;
reg led_i ;//輸入的 led 信號
wire led_o_r ;
wire ap_done ;
wire ap_idle ;
reg [1:0] delay_cnt ;
assign rst = ~rst_n ;
assign led_o = led_o_r ;
//----------------delay_cnt------------------
always @(posedge clk) begin
if (rst==1'b1) begin
delay_cnt <= 'd0;
end
else if(delay_cnt[1]==1'b0) begin
delay_cnt <= delay_cnt + 1'b1;
end
end
//----------------ap_start------------------
always @(posedge clk) begin
if (rst==1'b1) begin
ap_start <= 1'b0;
end
else if(delay_cnt[1]==1'b1)begin
ap_start <= 1'b1;
end
end
//----------------led_i_vld------------------
always @(posedge clk) begin
if (rst==1'b1) begin
led_i_vld <= 1'b0;
end
else if(delay_cnt[1]==1'b1)begin
led_i_vld <= 1'b1;
end
end
//----------------ap_i------------------
always @(posedge clk) begin
if (rst==1'b1) begin
led_i <= 1'b0;
end
else if(led_o_vld==1'b1)begin
led_i <= led_o_r ;
end
end
flash_led_0 inst_flash_led (
.led_o_V_ap_vld(led_o_vld), // output wire led_o_V_ap_vld
.led_i_V_ap_vld(led_i_vld), // input wire led_i_V_ap_vld
.ap_clk(clk), // input wire ap_clk
.ap_rst(rst), // input wire ap_rst
.ap_start(ap_start), // input wire ap_start
.ap_done(ap_done), // output wire ap_done
.ap_idle(ap_idle), // output wire ap_idle
.ap_ready(ap_ready), // output wire ap_ready
.led_o_V(led_o_r), // output wire [0 : 0] led_o_V
.led_i_V(led_i) // input wire [0 : 0] led_i_V
);
endmodule
- 約束文件編寫
創(chuàng)建約束文件
填寫相關文件信息
代碼內(nèi)容:
##############LED define##################
set_property PACKAGE_PIN P15 [get_ports {led_o}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_o}]
##############Reset define##################
set_property PACKAGE_PIN P16 [get_ports {rst_n}]
set_property IOSTANDARD LVCMOS33 [get_ports {rst_n}]
##############50M CLK define##################
create_clock -period 20.000 -name clk -waveform {0.000 10.000} [get_ports clk]
set_property PACKAGE_PIN N18 [get_ports {clk}]
set_property IOSTANDARD LVCMOS33 [get_ports {clk}]
3.7 編譯生成獲取結果
- 生成
- 進行下載
點擊Open Hardware Manager
->Open target
->Auto target
后,顯示如下
點擊Program device,下載程序,直接點擊Program
上板結果如下:
總結
通過本次實驗了解了HLS有關知識,學習了Soc芯片以及用C語言實現(xiàn)硬件對應的功能。在實驗中遇到了一些問題,在查找資料后,基本解決。文章來源:http://www.zghlxwxcb.cn/news/detail-453108.html
參考:
https://blog.csdn.net/u014798590/article/details/122312505
http://www.elecfans.com/pld/1118454.html
https://www.zhihu.com/question/320190011
https://blog.csdn.net/qq_43279579/article/details/117084706文章來源地址http://www.zghlxwxcb.cn/news/detail-453108.html
到了這里,關于【嵌入式系統(tǒng)應用開發(fā)】FPGA——HLS入門實踐之led燈閃爍的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!