Vivado開發套件設計筆記(2)——加法器設計——變量(下)

接上一篇博文Vivado開發套件設計筆記(2)——加法器設計——變量(上)

上一篇博文爲讀者介紹了 HLS 中自定義的 加法器IP核 的製作,然後在 Vivado 中把 IP核 加入到工程中與 ZYNQ Processing System 相連,然後導出硬件信息供給 SDK 用,至於 SDK 怎麼用這個自定義的 加法器IP核 ?筆者在這一篇博文繼續給讀者講解。

4 SDK設計

Vivado 軟件中運行 SDK 後會出現下面的界面(讀者會發現這款 SDK 是用 Eclipse 開發的)。上面兩個框是我們的硬件信息,下面的框框內的 add_0 就是 加法器IP核 導出的硬件信息了。

在這裏插入圖片描述

(1)創建工程

在菜單欄點擊 File —— New —— Application Project ,彈出創建工程界面,輸入項目名爲 add (英文的無空格就可以),如下圖所示,然後點擊 Next

在這裏插入圖片描述
然後選擇工程模板,選擇 Hello World 工程模板,如下圖。

在這裏插入圖片描述
工程創建成功後如下圖所示。
在這裏插入圖片描述

(2)程序設計

點開導航欄左側的 Project Explorer 會發現裏面有很多的文件,其中最最重要的就三個:第一個是 add/src/Helloworld.c ,這個 c文件 裏面有ZYNQ的CPU程序入口 main函數 ;第二個是 add_bsp/ps7_cortexa9_0/include/xparameters.h ,這個頭文件裏面有我們所用到的 加法器IP核 映射到FPGA的DDR中的內存地址和相關驅動參數(這些是 自動生成 的);第三個是add_bsp/ps7_cortexa9_0/include/xadd.h ,其命名方式是與讀者設計的 IP核命名 相關,在其前面加上一個 ‘x’ 而已,比如我們的加法器是 add ,因此它的命名方式就是 xadd.h ,這裏面存放着我們調用自定義 加法器IP核 的庫函數(或者叫做 驅動)。

有了以上三個文件,就可以開始 搞事情 了。

第一步,點開 helloworld.c ,輸入以下代碼。

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xadd.h"

int main()
{
    init_platform();
    print("Hello World\n\r");

    XAdd MyAdd;

    int status;
    status = XAdd_Initialize(&MyAdd, XPAR_ADD_0_DEVICE_ID);
    if(status == XST_SUCCESS)
    	print("IP Initialize successfully !\n\r");

    int ps_res;
    int ps_a = 15;
    int ps_b = 5;
    int pl_res, pl_a, pl_b;

    XAdd_Set_a(&MyAdd, ps_a);
    XAdd_Set_b(&MyAdd, ps_b);
    XAdd_Start(&MyAdd);
    while(!XAdd_IsDone(&MyAdd));
    pl_a = XAdd_Get_a(&MyAdd);
    pl_b = XAdd_Get_b(&MyAdd);
    pl_res = XAdd_Get_return(&MyAdd);
    ps_res = ps_a + ps_b;

    printf("\n\rARM(PS) : %d + %d = %d \n\r", ps_a, ps_b, ps_res);
    printf("\n\rFPGA(PL) : %d + %d = %d", pl_a, pl_b, pl_res);

    cleanup_platform();
    return 0;
}

首先需要先定義 XAdd 類型的結構體 MyAdd ,再調用 XAdd_Initialize() 初始化 IP核 ,如果返回值爲 XST_SUCCESS 即表示初始化成功。然後定義PS端(ZYNQ,ARM)和PL(FPGA)端的變量,之後利用庫函數 XAdd_Set_a()XAdd_Set_b() 把變量送到PL端,接着調用 XAdd_Start() 啓動PL端的 IP核 開始計算,然後利用 while(!XAdd_IsDone(&MyAdd)); 阻塞方式等待 IP核 運算完畢,最後用 XAdd_Get_return() 取得 IP核 的返回值。最終用ARM和FPGA做計算,對比結果,驗證是否有誤。

上述的 XAdd 結構體類型,以及對 IP核 的調用的庫函數(驅動)全部來自於頭文件 xadd.h 中。其中 XAdd_Initialize() 的第二個參數是 IP核ID ,這個 ID 號到 xparameters.h 頭文件中找。所有用到的東西都在下面的截圖中。注意紅色方框。之後有用到我會再補充介紹其他函數,本篇博文節省篇幅先把用到的都介紹了,其他的放到之後的博文介紹。

在這裏插入圖片描述

在這裏插入圖片描述

(3)燒錄程序

程序寫好之後就可以燒錄到板子上了。

第一步先把程序燒錄到 ZYNQ 上,如下圖所示操作。
在這裏插入圖片描述
用串口連接PC和開發板,(這裏假設讀者都已經安裝好串口驅動之類的,如果不知道怎麼做的,提供開發板的產商應該會給相應的資料,照做即可),打開串口調試助手,看運行結果,如下圖所示。可以看到這裏程序只運行到初始化這一步,沒有之後我們所預想的有打印數據出來,這主要是因爲硬件信息未燒錄到FPGA中,因此在運行 while(!XAdd_IsDone(&MyAdd)); 會阻塞住不正常運行,到下一步。
在這裏插入圖片描述
第二步,把程序同時燒錄到 ZYNQFPGA 上,操作如下圖所示。

在這裏插入圖片描述

在這裏插入圖片描述
如果出現下面圖示的警告,點 OK ,等待串口助手顯示我們預想的結果就可以了。

在這裏插入圖片描述
如果讀者都按照以上操作做完的話,會在串口助手上看到這樣的結果,跟我們的預期一樣,大功告成。

在這裏插入圖片描述
這裏補充兩點:

第一點是爲什麼要先燒錄到ARM再燒錄到FPGA,因爲一個新的工程如果沒有進行燒錄到ARM的操作的話,之後燒錄到FPGA的操作界面會缺少一個生成的System Debugger,有興趣的讀者可以試一下。

第二點是串口正常連接時的設備顯示和串口調試助手的配置,如下圖所示。

在這裏插入圖片描述
在這裏插入圖片描述
正常安裝完USB驅動之後,用USB線把開發板上的UART口和JTAG口分別連到PC上,就可以正常使用了。

至此,所有的操作完成。

5 總結

這篇博文筆者詳細的介紹了從HLS上IP核的製作,到Vivado上頂層電路的連接,最後到SDK上應用程序的開發,完成了用ARM核控制FPGA完成特定功能的任務。

我們把流程重新理一遍。

  • HLS製作IP核
    • C仿真(C Simulation)
    • C綜合(C Synthesis)
    • C/RTL 聯合仿真(C/RTL Cosimulation)
    • 導出RTL(Export RTL)
  • Vivado構建完整電路
    • 把自定義IP核添加到IP Catalog(Add Repository)
    • 創建Block Design並添加自定義IP核以及ZYNQ處理系統,然後配置ZYNQ(Create Block Design)
    • 在Block Design中自動連接ZYNQ和自定義IP核並導出必要端口(Open Block Design)
    • 封裝HDL並生成硬件輸出(Create HDL Wrapper & Generate Output Products)
    • 運行項目(Run Implementation)
    • 生成bitstream並導出硬件(Generate Bitstream & Export Hardware)
  • SDK開發應用程序
    • 包含自定義IP覈對應的驅動頭文件(例如 xadd.h)
    • 聲明自定義IP覈對應的結構體並初始化(例如 XAdd MyAdd)
    • 利用庫函數把數據輸入到IP核,然後等待IP核運算完畢,再取輸出數據
    • 把程序燒錄到ARM上
    • 把程序同時燒錄到ARM和FPGA上
    • 利用串口調試助手檢驗設計

以上便是全部操作流程,讀者之後在自行設計的時候,都要走上面這一串流程,唯一可以跳過的只有C/RTL Cosimulation,因爲對一些比較大型的IP核,這個過程特別慢而且非必要,除此之外每一個步驟都不能缺少。

雖然筆者只用了最簡單的加法器作爲例子給讀者講解這一套開發技巧,但是加法是所有運算的基礎,只要加法調通了,之後再做其他的操作都簡單很多了,這就像程序員在學習每一門編程語言的“Hello World”一樣。希望沒有相關開發經驗的讀者能完整地把這一流程走一遍,之後自己便能舉一反三,慢慢摸出自己的一條硬件開發之路。

讀到這裏,讀者們可能會問:如果變量不是int型的而是float型的話話怎麼辦?如果要用來計算的數據是一個數組的話怎麼辦?這就是筆者爲什麼要在標題中加上“變量”這個字眼,是因爲我們設計的IP核用的輸入輸出都是變量而不包含指針,涉及指針的操作會有一些不一樣,筆者將在下一篇博文給讀者介紹。

6 參考文章

[1]: Xilinx Zynq-7000 嵌入式系統設計與實現(何賓著)
[2]: Vivado開發套件設計筆記(1)——入門簡介
[3]: Vivado開發套件設計筆記(2)——加法器設計——變量(上)
[4]: Xilinx官方文檔《ug871-vivado-high-level-synthesis-tutorial》
[5]: Xilinx官方文檔《xapp1170-zynq-hls》


原創性聲明:本文屬於作者原創性文章,小弟碼字辛苦,轉載還請註明出處。謝謝~

如果有哪些地方表述的不夠得體和清晰,有存在的任何問題,亦或者程序存在任何考慮不周和漏洞,歡迎評論和指正,謝謝各路大佬。

需要代碼和有需要相關技術支持的可諮詢QQ:297461921

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章