PYNQ使用介紹 === - [PYNQ概述]() - [Zynq 與 Pynq]() Pynq-z2開機 --- - [大致流程總結和注意事項]() 自定義Overlay --- - [Vivado HLS 介紹]() - [Vivado IDE 介紹]() - [Vitis 介紹]() - [使用Vivado HLS設計IP]() - [使用Vivado 做 Block Design]() - [使用PYNQ讀取Overlay]() --- ## PYNQ概述 PYNQ是一個嵌入式開發平台,在Xilinx的產品中被歸類為ZYNQ系列的擴展,並以Pynq-Z2作為平台的實體開發板。 [PYNQ-z1 和 PYNQ-z2 內建設備規格比較](https://blog.umer-farooq.com/pynq-z1-vs-pynq-z2-which-is-better-213e3dc15527) 板子分為兩個部分: - 硬體實現(PL端) -- 使用Zynq7000系列晶片作為處理器 - 軟體實現(PS端) -- 使用Ipython kernel 作為開發用伺服器 ### **Zynq 與 Pynq** - Zynq PS and PL <font size=4>**硬體(FPGA) ⮕ 操作系統(PetaLinux、driver & API) ⮕ Application** <font>  - Pynq PS and PL    ## Pynq-z2開機 [開機設定教學](https://youtu.be/RiFbRf6gaK4) ### 大致流程總結和注意事項  1. 下載此處的[image](https://bit.ly/pynqz2_v3_0_1),並使用燒錄工具([點擊下載](https://win32diskimager.b-cdn.net/win32diskimager-1.0.0-install.exe)),燒錄至隨板附的SD card,並插入上圖SD Card(On the Back Side)的位置,如果使用自己買的SD card可能要注意容量大小問題。 2. 連接上圖JTAG/UART(Micro USB)接口,和Ethernet(RJ45)至電腦,也可以將Ethernet(RJ45)改成網路路由器,由Wifi連接至電腦。 3. 電腦設定網路IP位置,控制台 -> 網路和共用中心 -> 變更介面卡設定 -> 乙太網路XXX -> ......這裡具體看官方教學。 4. 上圖 Jumper for Boot Mode Selection 位置設定為 SD card 5. 打開上圖Power Switch,這部份需要一點時間,待板子上LED燈閃爍完後變為長亮,即開機完成。 6. 打開瀏覽器網址欄輸入192.168.2.99進入jupyter notebook,預設密碼為xilinx,也可以在windows檔案管理員於上方搜索欄輸入\\pynq\xilinx,預設使用者帳號密碼一樣是xilinx。 7. 開機完成後Jupyter notebook中有一些Getting start 之類的教學文件也可以作為參考。 --- ## 自定義Overlay 前面提到的Overlay作為pynq平台裡操作硬體設計的軟體實現,最後使用者會用python操作overlay達到控制硬體設計的目的。 **先講結論,在最後要燒錄到Pynq開發板的文件中要包含至少兩個檔案,分別是.bit ,和.tcl、.hwh任選一個,官方更推薦.hwh,並且有之後會取代.tcl,因為內含的IP訊息會比tcl更多,可以丟進專案目錄底下,然後透過內建python底下的pynq套件下的Overlay來讀取.bit檔並燒錄到PL裡面,就可以開始使用定義好的Overlay**   先下載vivado HLS和Vivado IDE作為客製化單個IP和監控整個硬體設計流程的工具就好(直接下載Vivado suite就同時包含這兩個)注意不要下載Update version或lab solution,然後舊版的會是HLS edition,新版的會是ML edition,並且Unified installer預設只會支持三年的時間,所以如果要下載舊版的要下載SFD(Single File Download),有遇到一些需要帳號的地方可以正常輸入,然後會跳出一些警告訊息直接點確定就好了。 下方的圖是Vivado suite 的設計流程  ### Vivado HLS介紹 Vivado HLS主要是讓設計人員可以快速的使用C/C++/System C作為描述電路邏輯的語言來實做IP,也就是通過Xilinx定義的接口規範(透過#pragma調用),再透過C語言來描述IP的邏輯,最後輸出成想要的IP盒,IP盒最後會匯入到Vivado IDE做block design。 [可以在這邊找到Vivado HLS 定義的所有Pragma,用於之後客製化自己的IP](https://docs.amd.com/r/en-US/ug1399-vitis-hls/HLS-Pragmas) ### Vivado IDE介紹 Vivado IDE作為管控整個硬體開發流程的工具,可以在於設計完IP盒後,用於block design調整IP和PYNQ間的溝通方式和測試硬體設計是否有錯誤,最後確認無誤後輸出bitstream,也就是.bit檔。另外Vivado等同於Xilinx開發的tcl,也就是說Vivado IDE的GUI的選項分別對映著tcl的不同指令,所以可以單純的寫一個tcl file匯入,或利用command line逐行建構一個Vivado project。 下面是官方的一個教學,用tcl建構vivado project,可以當作練習tcl的指令 [Using Tcl Commands in the Vivado Design Suite Project Flow](https://www.xilinx.com/video/hardware/using-tcl-commands-in-the-vivado-design-suite-project-flow.html) ### Vitis介紹 Vitis則是用於設計軟體的部分,包括利用Vivado IDE做完Block Design之後使用C語言的方式測試硬體實作功能,或是需要第三方套件和額外的軟體功能、為petalinux新增一些功能等等,如果速度方面沒有要求的話,也可以使用Vitis HLS實現IP功能,相對Vivado HLS來說,Vitis HLS較為方便debug和快速開發。 ### 設計IP 1. 打開Vivado HLS,create new project,輸入Project名稱、位置,注意名稱和路徑最好都是英文,不然之後匯出的時候會報錯,可以有底線沒關係。 2. 一直按下一步直到solution configration的地方需要設定板子型號,點擊part selection右邊的...進入Device selection dialog,可以在parts的地方搜尋xc7z020clg400-1並選擇晶片型號,或是到boards選擇pynq-z2,但必須先[下載pynq-z2的board file](https://dpoauwgwqsy2x.cloudfront.net/Download/pynq-z2.zip),解壓縮後將pynq-z2資料夾放到Vivado安裝路徑C:\xilinx\Vivado\2019.2\data\boards\board_files,重啟Vivado HLS才會有這個選項,然後按finish。 3. 在左邊的Source 點擊右鍵new file,建立一個add.cpp文件  4. 在add.cpp 文件裡面輸入下方程式碼,注意這邊變數c作為output一定要加一個&,不然雖然在Vivado HLS裡面不會報錯,但是之後讀取會有問題。 ```c++= void add(int a, int b, int &c){ #pragma HLS INTERFACE ap_ctrl_none port=return #pragma HLS INTERFACE s_axilite port=a #pragma HLS INTERFACE s_axilite port=b #pragma HLS INTERFACE s_axilite port=c c = a + b; } ``` 5. 左邊選擇Project Settings -> synthesis -> browse top function -> 選擇add.cpp -> 點擊OK設定完成  7. 於上方工具欄找到Run符號,並點擊。 8. 出現這個樣子就是成功了  9. 這邊可以找到等一下使用Overlay的時候需要讀寫的記憶體位址,也可以等block design完之後匯入Vitis找到這些地址。  10. 可以在上方工具列找到黃色的export RTL,匯出IP盒  選擇IP Catalog(給Vivado使用),而System Generator for DSP這個選項可以給Simulink使用。按OK,等下方出現這個就算是成功匯出。  ### Block design 1. 開啟Vivado IDE,Create Project,然後輸入完project name 和location之後下一步,勾選不要匯入源文件,按下一步。  2. 到Default parts 的地方,如果剛剛有設定pynq-z2 board file 可以點擊boards -> 選擇pynq-z2,然後下一步到完成創建,否則一樣選擇xc7z020clg400-1型號。  3. 點擊左邊Create Block Design  4. 右邊Diagram的位置點擊,找到一個ZYNQ7 prosessing system的IP盒,並點兩下加入。  5. 點擊Run Block Automation並點擊OK,自動將ZYNQ IP盒需要的東西添加進Diagram。 應該只會出現兩個灰色的輸出端。  6. 點擊左邊Project Manager 的 settings  並點擊IP底下的Repository,並加入剛剛利用HLS設計的project位置,應該是xxx\add  選擇 add IP  7.一樣點擊 並加入IP  8. 點Run Connection Automation 點OK就可以了 9. 可以看到IP盒已經連接完成  10. 旁邊的source區點擊 Create HDL wrapper 點擊OK  會生成一個verilog(.v)檔然後把剛剛的橘色block design(.bd)包在下面,這個verilog檔是用來定義,.bd檔的連接狀況  11. 最後點擊左邊的Generate Bitstream,一路點OK,這裡可能會跑有點久。  12. 完成了之後可以Open Implemented Design,也可以不開  13. 在左邊sources點兩下打開design_1.bd(這邊很重要不然export有些選項會不同)  14. 到File -> Export -> Export Block Design  15. 打開Project 的所在位置資料夾,並將.tcl和.bit兩個檔案除了文件後輟名以外,要改成一樣。 - design_1.tcl 剛剛已經export出來了 這個文件主要是用於描述硬體的型號、接口,規格等等的文件。 - design_1_wrapper.bit 在xxx\project_1\project_1.runs\impl_1裡面 這個文件是block design出來的硬體實作。 - design_1.hwh 在xxx\project_1\project_1.srcs\sources_1\bd\design_1\hw_handoff裡面 這個文件與tcl相似但內容更豐富,也是描述硬體的規格之類的文件,未來有可能會取代.tcl,但目前舊版的系統是可以支持只有.bit和.tcl,所以還是建議三個文件都要有,某些版本的PYNQ系統和Vitis如果沒有.hwh file會報錯。 16. 最後把15.取得的三個文件放到Jupyter Notebook中想要的位置,接下來只剩使用python將.bit file 讀取成 Overlay 並用來測試和實現想要的軟體功能。 ### 使用PYNQ讀取Overlay 打開瀏覽器輸入192.168.2.1開啟jupyter notebook 1.讀取IP寫一些簡單的操作 ```python= from pynq import Overlay overlay = Overlay('./design_1.bit') adder = overlay.add_0 adder.write(0x10, 10) adder.write(0x18, 10) adder.read(0x20) ``` ``` 20 ``` 看一下Overlay的詳細資料 ```python=+ help(overlay) ``` ``` Help on Overlay in module pynq.overlay: <pynq.overlay.Overlay object> Default documentation for overlay ./design_1.bit. The following attributes are available on this overlay: IP Blocks ---------- add_0 : pynq.overlay.DefaultIP processing_system7_0 : pynq.overlay.DefaultIP Hierarchies ----------- None Interrupts ---------- None GPIO Outputs ------------ None Memories ------------ PSDDR : Memory ``` 地址可以透過前面講的方式在Vivado HLS和Vitis中找到,和用下面程式碼的方式找到。 ```python=+ print(hex(adder.register_map.a.address)) print(hex(adder.register_map.b.address)) print(hex(adder.register_map.c.address)) ``` ``` 0x10 0x18 0x20 ``` 也可以不用地址的方式直接和IP交互 ```python=+ adder.register_map.a = 3 adder.register_map.b = 3 adder.register_map.c ``` ``` Register(c=6) ``` 2.也可以預先寫好Overlay的driver,這樣就可以只透過調用add函數進行加法。 ```python=+ from pynq import DefaultIP class AddDriver(DefaultIP): def __init__(self, description): super().__init__(description=description) bindto=['xilinx.com:hls:add:1.0'] def add(self, a, b): self.write(0x10, a) self.write(0x18, b) return self.read(0x20) overlay = Overlay('./design_1.bit') overlay.add_0.add(3, 4) ``` ``` 7 ``` bindto變數中的內容可以在這裡找到 ```python=+ overlay.ip_dict['add_0']['type'] ``` ``` 'xilinx.com:hls:add:1.0' ``` [參考資料](https://pynq.readthedocs.io/en/v3.0.0/overlay_design_methodology/overlay_tutorial.html) --- #### 補充 可以參考[Xilinx University Program](https://www.amd.com/en/corporate/university-program/workshops.html#tabs-78d8c6d64f-item-360e7ff952-tab) 這裡有官方的HLS教學,可以在裡面找到如何使用Vivado HLS設計較複雜一點的IP。 也可以參考[Adaptive SoC & FPGA Support](https://support.xilinx.com/s/?language=en_US) 是一個官方的社群論壇
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.