衡阳派盒市场营销有限公司

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

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

3天內不再提示

通過HLS封裝一個移位流水燈的程序案例

454398 ? 來源:csdn ? 作者:leon_zeng0 ? 2020-10-14 15:17 ? 次閱讀

當我們安裝好Vivado 的時候,也同時裝好了Vivado HLS.。 這是個什么東西?我就有一種想一探究的感覺。網上一查,Vivado High-Level Synthesis。學習了一段時間的Zynq 7000, 找了一個HLS的教程,就開始了如下入門實驗,體驗高級語言綜合設計IP。Vivado HLS是Xilinx 推出的高層次綜合工具,采用C/C++語言進行FPGA設計。HLS提供了一些樣例方便大家熟悉其開發流程。另外關于HLS的使用介紹,Xilinx官方提供了2個重要開發文檔ug871 和 ug902。里面詳細介紹了包括怎么建立HLS 工程,怎么編寫Testbench,怎么進行優化等問題。在HLS軟件界面,在右側有個directive, 里面列出了程序中所有用到的變量,函數和循環結構,點右鍵可以給其配置。

對循環結構, 一般選擇 unroll( 即展開循環) , 可以自己設定展開因子 factor。 為提高程序的并行化處理, 可以給函數選擇 PIPELINE。 對應數組, 可以設置為 ARRAY_PARTITION,數組維數可以自己設定。 HLS 軟件其實很智能的, 簡單的結構, 一般軟件自己會優化好。 每一個優化方案都保存在一個 Solution 里, HLS 可以創建多個 Solution, 用于比較不用的優化效果。

如同軟件開發都是從“ Hello Wrold! ” 進入編程的大門一樣, 這一個實驗我們就通過 HLS 封裝一個移位流水燈的程序, 包括工程的創建, 仿真, 綜合, 封裝, 以及在硬件平臺上的實現,來熟悉HLS的開發流程。

本文參考了米聯的zynq 修煉秘籍 網手版。

實驗代碼和工程的下載

鏈接: http://pan.baidu.com/s/1c1BXkvm 密碼:h2i2

1:HLS工程建立

打開 Vivado HLS 開發工具, 單擊 Creat New Project 創建一個新工程, 設置好工程路
徑和工程名, 一直點擊 Next 按照默認設置,

出現如下圖所示界面,時鐘周期 Clock Period 按照默認 10ns,Uncertaintly 和 Solution
Name 均按照默認設置, 點擊紅色圓圈部分選擇芯片類型, 然后點擊 OK。下圖示是選擇好后的界面。

下面是選擇芯片型號的界面。根據你自己的硬件選擇,我的是如圖

工程建立完后的界面是這樣的。下面就是導入工程里用到的源文件。

需要在工程添加3個源文件。都可以在文件開頭介紹的下載地址下載。右鍵點擊source , Add Files 分別添加shift_led.cpp 和 shift_led.h。 右鍵點擊Test Bench , Add Files 添加Test_shift_led.cpp.

添加完成后效果如下:

shift_led.h 代碼內容:

#ifndef _SHIFT_LED_H_
#define _SHIFT_LED_H_
//
#include "ap_int.h"
//#define MAX_CNT 10000/2 //仿真時可以用這個代替下面的行介紹仿真等待時間
#define MAX_CNT 100000000/2
#define SHIFT_FLAG MAX_CNT-2

//typedef int led_t;
typedef ap_fixed led_t; // 1st: total width. 2nd: integer width
void shift_led(led_t *led_o,led_t led_i);
#endif

shift_led.cpp 代碼內容:

#include "shift_led.h"
void shift_led(led_t *led_o,led_t led_i)
{
led_t tmp_led=led_i;
int i; //for cycle variables
for(i = 0;i {
if(i==SHIFT_FLAG)
{
//tmp_led = ((tmp_led>>7)&0x01) + ((tmp_led tmp_led = ((tmp_led>>4)&0x01) + ((tmp_led *led_o = tmp_led;
}
}
}

Test_shift.led.cpp 代碼內容:

#include "shift_led.h"
#include

using namespace std;
int main()
{
led_t led_o;
led_t led_i=0xfe;
const int SHIFT_TIME =8 ;
int i;
for(i=0;i {
shift_led(&led_o,led_i);
led_i = led_o;
char string[25];
itoa((unsigned int)led_o & 0xf,string,2);
fprintf(stdout,"shift_out=%s/n",string);
}
}

2:工程綜合

工程綜合前,需要設置 Top Function。

點擊 Project-> Project Settings ,也可以點擊紅箭所指那樣的快捷鍵。

出現如下界面 ,在Syntheses 界面下選擇綜合的頂層函數名。

因為當前工程中只存在一個Solution, 我們選擇Solution ->Run C Sytheses -> Active Solutions 進行綜合,菜單旁有個快捷鍵的圖標,所以也有快捷可以直接點取:

在未經優化的情況下綜合報告如圖所示, 出現這個界面需要把上下條拉到合適位置, 并收起Latency (Clock cycles)。

3: 優化和添加約束

在原文中, led_t tmp_led=led_i; 最開始是int , 然后把他定義為4位整數。我這里一開始就是這樣,也就沒有什么優化了。

但這里做一下他的約束添加,或者也是優化的內容。

在主頁面里,點擊如下3出紅箭,如果不是這個界面。選擇文件 shift_led.cpp 文件, 選擇 synthesis, 選擇 directive。

這里把led_o 設置為輸出,右鍵點擊led_o 出現Insert Drrective.. ,選擇后如下界面:

選擇 INTERFACE mode 選擇 ap_ovld。

同樣對led_i 進行基本相同的工作,mode 選擇 ap_vld。

進行如上操作后,看看源程序出現的變化。還有Directive 的變化。


優化和約束就說這么多。

3: 仿真實現

菜單Project -> Run C Simulation 或者點擊快捷鍵(看菜單旁圖示),就開始 C 仿真:

仿真運行的情況是這樣的:

4:波形仿真(如果不熟悉ModelSim 就跳過這一節):

在這之前需要運行Vivado 的編譯仿真庫,我是開始這個試驗前就做了這個設置。

打開Vivado 后,菜單 Tools -> Compile Simulation Libraries...

出現對話框后,選擇Simulator 為 ModelSim, 選擇編譯庫的位置,看紅箭。

做好設置后, 點擊Compile 就開始生成仿真庫。

如果做好了上面的仿真庫編譯準備,就可以開始看波形仿真了。

菜單Solution -> Run C/RTL Cosimulation 運行C協同仿真。做了如圖所示選擇。

運行C 協同仿真一段時間后,就可以防線在solution 1目錄下多了一個sim 文件夾,在其verilog 文件夾下看到生成的波形文件shift_led.wlf 文件。

利用ModelSim 打開該文件。在Objects 下選擇需要顯示的波形信號, Add wave 到波形顯示里。

波形顯示就是這樣的。



這就是波形仿真。

5: HLS代碼封裝

通過前面的實驗,我們進行了HLS的工程創建,仿真,但這只是把算法實現從C 到RTL的轉換。下面我們開始把其打包成IP, 在硬件平臺上進行測試,也方便Vivado 進行調用,應用。

菜單 Solution -> Export RTL 也可以點快捷(菜單圖示)。

在彈出的對話框中,點擊Configuration 對一些參數進行輸入,修改,然后點擊OK。

Configuration 的對話框設置。

點擊2次OK 之后,就開始IP 打包封裝。

運行結束后,就在solution1 目錄下多了一個impl 文件夾,并且在0等待一段時間后在 solution1 目錄下多了一個 impl 文件夾, 并且在ip 文件夾中生成了一個壓縮包,這就是我們需要的打包好的IP。

6 測試和應用:

打開Vivado, 新建一個工程,工程名為test_shift_led。

在Project Manager 中點擊 Project Settings。

在這解壓剛才建立的IP 壓縮包到一個新建的文件夾里,這是在文件管理器里完成的。

選擇IP 設置區的 Repository Manager 頁面,然后點擊+號, 下面圖示是添加后的結果。

進行了以上設置后,開始添加我們的IP包。

點擊Project Manager 下的IP Catalog 。 在右邊的IP Catalog 里點開User Repository,然后選擇我們建立的IP, 顯示的是shifted_led_4bits。這和我們添加其他的ip 是一樣的。

可以設置下IP, 名字為shift_led_0

在這個對話框里選擇Generate

現在右鍵 Design Sources ,添加shift_led.v 文件,可以在下載鏈接出獲取。右鍵Constraints,添加led
的約束文件。特別注意這個約束文件必須和你硬件的led 引腳定義一致。

看看下圖,ip取名和程序中必須一致,就是左邊和右邊。

shift_led.v 的代碼如下(如果不想下載,也可以復制):

`timescale 1ns / 1ps
module shift_led
#(
parameter DATA_WIDTH = 4
)
(
input i_clk,
input i_rst_n,
output reg [DATA_WIDTH-1:0] led
);

reg [1:0] cnt ;
reg [DATA_WIDTH-1:0] led_i_V ;
wire ap_start ;
wire led_i_vld;
wire [DATA_WIDTH-1:0] led_o_V ;

always@(posedge i_clk or negedge i_rst_n)begin
if(i_rst_n == 1'b0)
cnt else if(cnt[1]==1'b0)
cnt end

always@(posedge i_clk or negedge i_rst_n)begin
if(i_rst_n == 1'b0)
led_i_V else if(cnt[0]==1'b1)
led_i_V else if(led_o_vld == 1'b1)
led_i_V end

always@(posedge i_clk or negedge i_rst_n)begin
if(i_rst_n == 1'b0)
led else if(led_o_vld == 1'b1)
led end

assign ap_start = cnt[1];
assign led_i_vld = cnt[1];

shift_led_0 u_shift_led_0(
.led_o_V_ap_vld (led_o_vld),// output wire led_o_vld
.led_i_V_ap_vld (led_i_vld),// input wire led_i_vld
.ap_clk (i_clk ),// input wire ap_clk
.ap_rst (~i_rst_n ),// input wire ap_rst
.ap_start (ap_start ),// input wire ap_start
.ap_done ( ),// output wire ap_done
.ap_idle ( ),// output wire ap_idle
.ap_ready ( ),// output wire ap_ready
.led_i_V (led_i_V ),// output wire [7 : 0] led_o_V
.led_o_V (led_o_V ) // input wire [7 : 0] led_i_V
);

endmodule

zynq.xdc 文件內容如下:

set_property IOSTANDARD LVCMOS33 [get_ports i_clk]
set_property IOSTANDARD LVCMOS33 [get_ports i_rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
set_property PACKAGE_PIN M14 [get_ports {led[0]}]
set_property PACKAGE_PIN M15 [get_ports {led[1]}]
set_property PACKAGE_PIN K16 [get_ports {led[2]}]
set_property PACKAGE_PIN R19 [get_ports {led[3]}]
set_property PACKAGE_PIN U18 [get_ports i_clk]
set_property PACKAGE_PIN R18 [get_ports i_rst_n]

下面就和你硬件板提供的 FPGA led 實驗程序一樣了。綜合,執行,生成流文件,下載運行。

你的led 應該流水運行了。

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

    關注

    9

    文章

    428

    瀏覽量

    26632
  • Xilinx
    +關注

    關注

    71

    文章

    2171

    瀏覽量

    122143
  • C++
    C++
    +關注

    關注

    22

    文章

    2114

    瀏覽量

    73858
  • Vivado
    +關注

    關注

    19

    文章

    815

    瀏覽量

    66890
收藏 人收藏

    評論

    相關推薦

    #中國香河英茂科工#STC32G12K128#屠龍刀三.2 流水燈例程

    流水燈
    丙丁先生
    發布于 :2025年01月19日 14:19:35

    【正點原子STM32H7R3開發套件試用體驗】流水燈

    工程,之后使用 Keil MDK IDE 編譯代碼,實現流水燈的項目流程。從配置過程中發現,系統核心具有極高的運行速率,STM32H7系列具有32位Arm Cortex?-M7內核,運行頻率高達 600 MHz,因此可以更快速地運行項目程序,為實現更高速的采樣頻率提供了可
    發表于 12-28 18:51

    低成本單片機方案——觸摸流水燈開關控制

    概述本方案旨在提供種基于低成本單片機的觸摸流水燈開關控制解決方案。該方案結合了單片機技術、電容式觸摸傳感技術和LED驅動技術,實現了通過觸摸操作控制流水燈的效果。
    的頭像 發表于 12-26 16:37 ?250次閱讀
    低成本單片機方案——觸摸<b class='flag-5'>流水燈</b>開關控制

    基于51單片機的跑馬燈/流水燈系統

    具體實現功能(1)9種LED流水燈模式通過按鍵進行切換,數碼管顯示流水燈模式。(2)通過加減按鍵可以切換每種LED流水燈的速度。仿真演示視頻
    的頭像 發表于 10-22 14:12 ?321次閱讀
    基于51單片機的跑馬燈/<b class='flag-5'>流水燈</b>系統

    優化 FPGA HLS 設計

    30 到 70 種用于綜合和布局布線的設置。可能的組合太多了。可以編寫腳本來創建不同的運行并嘗試推薦的標準指令/策略。 最后挑戰問題是計算能力不足。典型的嵌入式應用程序是在單臺計算機
    發表于 08-16 19:56

    種在HLS中插入HDL代碼的方式

    很多人都比較反感用C/C++開發(HLS)FPGA,大家第拒絕的理由就是耗費資源太多。但是HLS也有自己的優點,除了快速構建算法外,還有
    的頭像 發表于 07-16 18:01 ?828次閱讀
    <b class='flag-5'>一</b>種在<b class='flag-5'>HLS</b>中插入HDL代碼的方式

    移位寄存器右移是怎么移位

    移位寄存器是種在數字電路和計算機科學中廣泛使用的存儲設備,它可以用來存儲和傳輸數據。在移位寄存器中,數據可以通過移位操作來實現數據的傳輸和
    的頭像 發表于 07-12 10:14 ?1759次閱讀

    如何在esp32的程序體中指定變量的絕對地址,或者相對于程序首地址的固定偏移位置?

    請問下如何在esp32的程序體中指定變量的絕對地址,或者相對于程序首地址的
    發表于 06-21 08:12

    FPGA 實驗流水燈模塊

    實驗流水燈模塊 對于發展商而言,動土儀式無疑是最重要的任務。為此,流水燈實驗作為低級建模II的動土儀式再適合不過了。廢話少說,我們還是開始實驗吧。 圖1.1 實驗建模圖。 如圖
    發表于 06-10 09:38

    單片機POV LED流水燈制作

    電子發燒友網站提供《單片機POV LED流水燈制作.docx》資料免費下載
    發表于 05-28 14:34 ?3次下載

    【紫光同創盤古PGX-Nano教程】——(盤古PGX-Nano開發板/PG2L50H_MBG324第三章)鍵控流水燈實驗例程

    功能 3種流水燈模式有按鍵傳遞過來的計數控制切換,每一個LED的顯示狀態完整后進入下模式初始化。根據需求可得到如下信息: 輸入信號:時鐘,流水燈模式控制信號;出信號:8bit位寬的
    發表于 04-29 16:06

    【紫光同創盤古PGX-MINI-4K教程】——(盤古PGX-MINI-4K開發板/PGC4KD-6ILPG144第二章)LED 流水燈實驗例程

    LED 以 0.5s 間隔接替閃爍 四:實驗原理相比上一個 LED 閃爍的實現,只需要改變 LED 的狀態。將 8 LED 燈流水式的點亮; 在 C 語言中做流水燈的實驗需要用
    發表于 03-26 16:24

    什么是PLC循環移位指令 PLC循環移位的特點

    PLC循環移位指令包括循環左移指令和循環右移指令。在循環移位過程中,移出的位并不會丟失,而是會放回空出的位上,形成環形移位
    的頭像 發表于 03-07 16:57 ?2315次閱讀
    什么是PLC循環<b class='flag-5'>移位</b>指令 PLC循環<b class='flag-5'>移位</b>的特點

    51單片機流水燈制作

    ?流水燈是學習51單片機的基本項目,是我們對單片機IO口輸出認識的基本項目。當然學會了花樣流水燈也很好玩。 下面就分享種51單片機
    的頭像 發表于 02-26 10:06 ?1706次閱讀
    51單片機<b class='flag-5'>流水燈</b>制作

    如何優化HLS仿真腳本運行時間

    需求:由于自己目前 HLS 仿真腳本需要運行 1多小時,先打算通過打印時間戳的方式找出最耗時的部分,然后想辦法優化。
    的頭像 發表于 02-23 09:29 ?781次閱讀
    百家乐巴厘岛平台| 百家乐官网公式软件| 威尼斯人娱乐网网上百家乐的玩法技巧和规则 | 喜達博彩网| 八大胜百家乐娱乐城| 百家乐官网视频看不到| 威尼斯人娱乐场色| 百家乐官网全部规| 永发娱乐城| 碧桂园太阳城二手房| 百家乐官网的战术| 乡宁县| 大发888屡败屡战| 百家乐官网博弈之赢者理论| 川宜百家乐官网破解版| 九乐棋牌官网| 洛克百家乐的玩法技巧和规则| 百家乐官网网站排名| 百家乐游戏开发软件| 蓝盾百家乐官网平台| 百家乐官网视频多开器| 博彩现金网| 百家乐赌场大全| 百家乐官网娱乐网真人娱乐网| 网上百家乐游戏哪家信誉度最好| 威尼斯人娱乐的微博| 百家乐经验博彩正网| 查看百家乐官网赌博| 雅江县| 大发888注册开户| 百家乐平玩法可以吗| 娱乐场百家乐大都| 太阳城百家乐官网168| 真钱现金斗地主| 威尼斯人娱乐场 澳门| 百家乐玩揽法的论坛| 百家乐开户代理| 百家乐官网五种路单规| 稳赢的百家乐官网投注方法| 濉溪县| 罗城|