過去,設計人員傾向于使用現(xiàn)場可編程門陣列 (FPGA) 在硬件設計中提升計算密集型應用的性能,例如計算機視覺、通信、工業(yè)嵌入式系統(tǒng),以及越來越多的物聯(lián)網(wǎng) (IoT)。然而,傳統(tǒng) FPGA 編程中涉及的繁瑣步驟一直讓人望而卻步,促使設計人員到目前都還在尋求替代處理解決方案。
基于 Jupyter 筆記本的 Python Productivity for Zynq (PYNQ) 開發(fā)環(huán)境的問世,解決了 FPGA 的可編程性問題。使用專為支持 PYNQ 而設計的開發(fā)板,即使 FPGA 經(jīng)驗很少的開發(fā)人員也可快速實現(xiàn)相關設計,從而充分利用 FPGA 性能來加快計算密集型應用。
本文將說明典型的 FPGA 方法,然后介紹并演示如何開始使用 Digilent 的開發(fā)板。該開發(fā)板為快速開發(fā)基于 FPGA 的系統(tǒng)提供了一種強大的開源替代方法。
為何使用 FPGA?
若需要使用計算密集型復雜算法,工程師常常依賴 FPGA 提高執(zhí)行速度,同時又不影響緊張的功率預算。實際上,F(xiàn)PGA 已成為在邊緣計算系統(tǒng)中提高人工智能算法速度的主流平臺。
更先進的 FPGA 片上系統(tǒng) (SoC) 器件專為嵌入式應用而設計,將可編程邏輯 (PL) 結構與微控制器集成在一起。例如,Xilinx 的 Zynq-7000 SoC 在集成式可編程邏輯 (PL) 結構中結合了一個 Arm? Cortex?-A9 雙核處理器系統(tǒng),以及最多 444,000 個邏輯單元(圖 1)。除了內置處理器和全套外設外,Zynq SoC 還提供最多 2,020 個數(shù)字信號處理 (DSP) 塊(或稱切片)。開發(fā)人員使用這些資源,便可將 PL 結構配置到專用的處理鏈中,以便在復雜的計算密集型算法中提高吞吐量。
圖 1:Xilinx 的 Zynq-7000 SoC 結合了 Arm Cortex-A9 雙核處理器、可編程邏輯結構,以及很多嵌入式應用中所需的全套外設和接口。(圖片來源:Xilinx)
除了可減少元器件數(shù)量外,處理器與 PL 結構的集成還允許通過片上總線而不是片外訪問來執(zhí)行運算。這種集成也進一步簡化了在上電或復位序列期間,加載 PL 結構的關鍵任務。
在使用 FPGA 構建的基于微控制器的典型系統(tǒng)中,開發(fā)人員需要管理用于加載 FPGA 編程比特流的序列和安全性。在 Zynq SoC 中,集成的處理器負責執(zhí)行常規(guī)微控制器的任務,包括管理 PL 結構和其他片上外設。因此,與傳統(tǒng)的 FPGA 比特流初始化相比,該 FPGA 加載過程更接近于常規(guī)微控制器的引導過程。
該引導過程通過由其中一個 Zynq 處理器管理的短步驟序列完成(圖 2)。上電或復位時,如果 Zynq 處理器執(zhí)行其只讀 BootROM 中的一小段代碼,以從引導設備獲取實際引導代碼,則引導過程開始。除了用于配置處理器系統(tǒng)組件的代碼外,引導代碼還包含 PL 比特流以及用戶應用。當引導代碼加載完成時,處理器使用其中包含的比特流來配置 PL。而完成組件和 PL 的配置后,該器件開始執(zhí)行引導代碼中包含的應用。
圖 2:在類似于常規(guī)微控制器的引導序列中,Xilinx 的 Zynq-7000 SoC 運行 Boot ROM 中的代碼來加載和執(zhí)行引導加載程序,該加載程序負責處理后續(xù)階段,包括使用引導代碼中封裝的比特流來配置可編程邏輯結構。(圖片來源:Xilinx)
即使有了簡化的 PL 加載處理,開發(fā)人員在過去仍需自行處理復雜的 FPGA 開發(fā)過程,才能生成所需比特流。對于希望利用 FPGA 性能的開發(fā)人員來說,傳統(tǒng)的 FGPA 開發(fā)過程仍然是他們實現(xiàn)設計的一大障礙。Xilinx 通過其 PYNQ 環(huán)境有效地消除了這一障礙。
PYNQ 環(huán)境
在 PYNQ 中,PL 比特流封裝在預先構建的庫中。這些庫稱為覆蓋層,在開發(fā)過程和執(zhí)行環(huán)境中,其角色與軟件庫類似。在引導加載過程中,與所需覆蓋層相關聯(lián)的比特流將配置 PL 結構。不過,對于通過與每個覆蓋層關聯(lián)的 Python 應用程序編程接口 (API) 來利用覆蓋層功能的開發(fā)人員而言,該過程保持透明。在開發(fā)過程中,工程師可以根據(jù)需要組合軟件庫和覆蓋層,通過其各自 API 來實現(xiàn)應用。在執(zhí)行過程中,處理器系統(tǒng)像往常一樣執(zhí)行軟件庫代碼,而 PL 結構負責實現(xiàn)覆蓋層中提供的功能。這樣做的結果是可以提升性能,從而進一步促使開發(fā)人員對日益嚴苛應用進行 FPGA 設計的興趣。
顧名思義,PYNQ 利用了與 Python 編程語言相關的更高開發(fā)生產力。Python 之所以能夠成為頂級語言之一,不僅是因為其相對簡單,還因為它具有龐大且不斷擴增的生態(tài)系統(tǒng)。開發(fā)人員可能會在 Python 開源模塊的存儲庫中,找到支持服務或專用算法所需的軟件庫。與此同時,開發(fā)人員可以使用 C 語言實現(xiàn)關鍵功能,因為 PYNQ 使用常見 C 語言實現(xiàn) Python 解釋器。該實現(xiàn)允許輕松訪問數(shù)千個現(xiàn)有 C 語言庫,并簡化開發(fā)人員提供的 C 語言庫的使用。盡管經(jīng)驗豐富的開發(fā)人員可以使用專用硬件覆蓋層和 C 語言軟件庫來擴展 PYNQ,但是 PYNQ 的真正優(yōu)勢在于,它可為任何能夠構建 Python 程序的開發(fā)人員提供高生產力開發(fā)環(huán)境。
PYNQ 本身是一個開源項目,基于另一個開源項目(Jupyter 筆記本)而構建。針對通過交互方式探索算法,以及使用 Python 或任何其他受支持的編程語言(目前超過 40 種)對復雜應用進行原型開發(fā),Jupyter 筆記本可提供極其有效的環(huán)境。Jupyter 筆記本由 Project Jupyter 基于社區(qū)共識而開發(fā),將可執(zhí)行代碼行與描述文本和圖形結合在一起。這一功能使各開發(fā)人員能夠更有效地記錄進展,而無需轉到其他開發(fā)環(huán)境。例如,開發(fā)人員可以使用筆記本,將查看數(shù)據(jù)所需的數(shù)行代碼與代碼生成的圖形結合起來(圖 3)。
圖 3:來自 Xilinx 樣例存儲庫的 Jupyter 筆記本將描述文本、可執(zhí)行代碼以及與應用相關的輸出結合起來。(圖片來源:Xilinx)
Jupyter 筆記本之所以能夠同時包含代碼、輸出和描述文本,是因為它是一種活動文檔,并在 Jupyter 筆記本服務器提供的交互式開發(fā)環(huán)境中進行維護(圖 4)。在 Jupyter 會話中,服務器使用 HTTP 協(xié)議在常規(guī) Web 瀏覽器中呈現(xiàn)筆記本文件,并對所呈現(xiàn)文檔中的靜態(tài)和動態(tài)內容應用 HTTP 和 Websocket 協(xié)議。在后端,服務器使用 ZeroMQ (?MQ) 開源消息傳遞協(xié)議與代碼執(zhí)行內核通信。
圖 4:在 Jupyter 會話中,筆記本服務器將筆記本文件的內容呈現(xiàn)到 Web 瀏覽器,同時與執(zhí)行代碼的后端內核進行交互。
-
微控制器
+關注
關注
48文章
7454瀏覽量
150856 -
FPGA
+關注
關注
1625文章
21620瀏覽量
601241 -
python
+關注
關注
55文章
4767瀏覽量
84376
原文標題:使用Python和Jupyter筆記本快速構建基于FPGA的設計并進行編程
文章出處:【微信號:FPGA-EETrend,微信公眾號:FPGA開發(fā)圈】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論