一、HLS簡(jiǎn)介
HLS(High-Level Synthesis)高層綜合,就是將 C/C++的功能用 RTL 來實(shí)現(xiàn),將 FPGA 的組件在一個(gè)軟件環(huán)境中來開發(fā),這個(gè)模塊的功能驗(yàn)證在軟件環(huán)境中來實(shí)現(xiàn),無縫的將硬件仿真環(huán)境集合在一起,使用軟件為中心的工具、報(bào)告以及優(yōu)化設(shè)計(jì),很容易的在 FPGA 傳統(tǒng)的設(shè)計(jì)工具中生成 IP。
傳統(tǒng)的 FPGA 開發(fā),首先寫 HDL 代碼,然后做行為仿真,最后做綜合、時(shí)序分析等,最后生成可執(zhí)行文件下載到 FPGA 使用,開發(fā)周期比較漫長(zhǎng)。
使用 HLS,用高級(jí)語言開發(fā)可以提高效率。
因?yàn)樵谲浖姓{(diào)試比硬件快很多,在軟件中可以很容易的實(shí)現(xiàn)指定的功能,而且做 RTL仿真比軟件需要的時(shí)間多上千倍。
- HLS與VHDL/Verilog
VHDL/Verilog對(duì)于一些算法比較簡(jiǎn)單,開發(fā)周期不長(zhǎng)的來說是比較適用的,然而,一個(gè)開發(fā)過程,往往算法會(huì)比較復(fù)雜,并且可能會(huì)經(jīng)歷較長(zhǎng)時(shí)間的仿真和調(diào)試,面對(duì)這樣的問題,提出了HLS。通過高級(jí)語言編程,來實(shí)現(xiàn)功能模塊,這樣就會(huì)大大提供開發(fā)效率。 - HLS的關(guān)鍵技術(shù)
通過高級(jí)語言實(shí)現(xiàn)功能,并轉(zhuǎn)換為RTL電路。實(shí)際上HLS相對(duì)于一個(gè)IP生成器。 - 技術(shù)局限性
在性能和執(zhí)行時(shí)間上,HLS 設(shè)計(jì)的平均水平明顯較差,但在延遲和最大頻率方面,與 RTL 差異不那么明顯,且 HLS 方法還會(huì)浪費(fèi)基本資源,平均而言,HLS 使用的基本 FPGA 資源比 RTL 多 41%,在以千位為單位的 BRAM 使用情況的論文中,RTL 更勝一籌。
二、Vivado安裝
可參考以下網(wǎng)址,包含了Vivado下載及安裝破解
https://www.bilibili.com/read/cv15414254/
三、HLS實(shí)現(xiàn)流水燈開發(fā)實(shí)例
3.1 創(chuàng)建HLS工程
選擇頂層函數(shù),此處暫不管
選擇添加C仿真文件,此處暫不管
選擇相應(yīng)器件
3.2 代碼編寫
添加文件
①源文件添加
點(diǎn)擊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í)鐘頻率下計(jì)數(shù)一秒鐘所需要的計(jì)數(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;
}
}
}
②仿真測(cè)試文件添加
右鍵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 綜合仿真
點(diǎn)擊project->Run C Simulation(輸出01交替,表示C仿真結(jié)果正確)
點(diǎn)擊Solution->Run C Synthesis->Active Solution
3.4 創(chuàng)建Vivado工程
按照下列圖片實(shí)例進(jìn)行即可:
選擇IP->Repository,并且點(diǎn)擊加號(hào),選擇solution,將會(huì)自動(dòng)識(shí)別到IP,識(shí)別到后,點(diǎn)擊Apply->OK
生成IP:
雙擊flash_led_1,默認(rèn)選擇
創(chuàng)建源文件,具體代碼如下:
`timescale 1ns / 1ps
module flash_led(
input wire clk ,
input wire rst_n ,
output wire led_o
);
wire rst ;//同步復(fù)位
wire ap_ready ;//當(dāng)前可以接收下一次數(shù)據(jù)
reg ap_start ;//IP 開始工作
reg led_i_vld ;//輸入數(shù)據(jù)有效
wire led_o_vld ;
reg led_i ;//輸入的 led 信號(hào)
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
具體代碼如下:
##############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}]
運(yùn)行結(jié)果如下:
四、總結(jié)
本次實(shí)驗(yàn)了解了什么是HLS,讓我明白了在硬件邏輯難以實(shí)現(xiàn)的情況下,我們也可以通過利用C這樣的高級(jí)語言程序編寫邏輯,交由編輯器進(jìn)行轉(zhuǎn)換,雖然會(huì)耗費(fèi)更多的資源,但可以為開發(fā)者節(jié)省下寶貴的時(shí)間文章來源:http://www.zghlxwxcb.cn/news/detail-752622.html
五、參考資料
https://blog.csdn.net/qq_43279579/article/details/117084706
https://www.bilibili.com/read/cv15414254/
https://blog.csdn.net/QWERTYzxw/article/details/117279573文章來源地址http://www.zghlxwxcb.cn/news/detail-752622.html
到了這里,關(guān)于FPGA開發(fā)之Vivado安裝及HLS環(huán)境配置,并實(shí)現(xiàn)流水燈實(shí)例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!