PYNQ上手筆記 | ②PL端和PS端的獨立開發
在上一篇中提到,Pynq是為了降低開發人員的門檻,但是作為一個學習嵌入式開發的學生,當然要一步一個腳印打好基礎,所以選擇從Zynq入手學習,等跑起來Linux系統再運用Python開發也不遲,知其然也知其所以然,開發效率更高,所以接下來的幾篇都是關於Zynq的,如果想直接玩Pynq可直接跳過,毫無影響。
1.Zynq的架構
在開始實驗之前對Zynq晶片有一個基本的認識,如果想深入瞭解關於Zynq的理論部分,推薦參考The Zynq Book,有英文版和中文版,在此對於Zynq的理論淺嘗輒止,不做深究,重點放在實驗應用上。
Zynq中包含兩大功能塊:PS部分和PL部分。
-
PS部分
-
PL部分指Programmable Logic,基於Xilinx 7系列架構的可程式設計邏輯單元,通過PL部分可以為ARM定製很多外設,這也是Zynq的一大優點。
Zynq中雖然包含PS端和PL端,但是整個設計是以ARM處理器為中心的,PS端的ARM核心可以獨立於PL端執行,值得注意的是,雖然PL端也可以獨立於PS端執行,但是PL的配置是由PS端完成的,所以不能採用傳統的固化FLASH的方式固化PL端程式。
PS端和PL端通訊是通過AXI介面
2.獲取Pynq-Z2開發板資料
實驗所需Pynq-Z2開發板的全部資料都可以在TUL官網下載到:
- TUL PYNQ-Z2產品公告(PDF)
- PYNQ-Z2使用者手冊(PDF)
- 原理圖(PDF)
- Board files
Board file包含了Pynq-Z2開發板上PS端所有的配置,用法在PS獨立實驗中提及。 - XDC 約束檔案
3.Zynq中PL端的獨立執行
3.1.實驗目標
配置PL端使板載4個LED閃爍
3.2.實驗步驟
實驗具體步驟參考 ALINX_ZYNQ開發平臺基礎教程V1.02 第四章:PL的“Hello World”LED實驗,需要注意的有以下幾點:
3.2.1.引腳約束
首先新建一個引腳約束檔案後,將之前所下載的Pynq-Z2開發板的引腳約束檔案中的內容拷貝過來,將led和時鐘相關內容取消註釋,注意埠名稱要對應:
3.2.2.下載位元流
PL端的配置需要PS端配置,所以在這裡我們只能使用JTAG方式下載測試程式,並且需要將Pynq-Z2開發板的啟動方式切換為JTAG方式:將右上角的BOOT選擇端子連線最右邊兩個引腳,選中JTAG方式。
3.3.實驗現象
3.3.實驗總結
Zynq中PL端的開發和FPGA晶片(Artix-7)的開發流程完全一樣,但是隻能在獨立使用P端的時候,只能使用JTAG方式下載。
3.4.實驗擴充套件
- 驅動板載的兩顆RGBled
- ip核的使用
4.Zynq中PS端獨立執行
4.1.實驗目標
獨立執行PS端,通過USB線連線的UART0串列埠()輸出“Hello, world! ”
4.2.實驗流程
實驗具體步驟參考 ALINX_ZYNQ開發平臺基礎教程V1.02 第六章:體驗ARM,裸機輸出“Hello World”實驗 ,需要注意的有以下幾點:
4.2.1.使用Boardfile新建Vivado工程
在第2節中獲取Pynq-Z2開發板的Board file檔案,這個檔案包含了Pynq-Z2開發板上PS端的所有配置,所以我們接下來新增使用這個檔案來代替 ALINX_ZYNQ開發平臺基礎教程V1.02 中手動配置PS端的過程:
4.2.1.1.新增board file檔案
之前下載的boardfile資料夾中包含pynq-z2資料夾,將其複製[vivado安裝目錄]/2018.1/data/boards/board_parts/zynq目錄下,如圖:
4.2.1.2.新建基於Pynq-Z2開發板的工程
所有步驟都和之前新建工程一樣,只是在選擇Default Part頁面不一樣,如下:
之後會出現開發板相關資訊,再次檢查是否正確,然後Finish
4.2.2.建立Block Design,新增IP,vivado自動匯出埠
建立完Block Design之後,向其中新增zynqIP核,如下圖所示,要注意,這個zynqIP核只是一個獨立的IP核,並沒有進行任何設定和點選,因為工程是基於pynq-z2開發板建立的,已經包含ps端配置資訊,所以直接點選Run Block Automation
,Vivado就會自動將這個zynqIP和的DDR和FIXED_IO介面與PS端的介面進行對應連線,連線後如圖所示,然後儲存:
自動連線完成之後雙擊ZynqIP核即可看到所有配置已經自動完成了,我們使用的UART0也已配置完成,這裡只是檢視,不作任何修改:
然後選擇Tools -> Validate Design或者按下F6驗證設計:
這是因為之前自動匯出埠時只配置了DDR和FIXED_IO,設計裡沒有使用AXI 介面GP0相關IP核,所以沒有自動配置時鐘,手動連線:
再次驗證,無錯誤!
4.3.實驗結果
本實驗是串列埠輸出"Hello World!\n\r",所以檢視方式有三種:
4.3.1.SDK Terminal
SDK中自帶串列埠終端,非常方便,點選按鈕新增串列埠
執行程式後即可看到結果:
4.3.2.外部串列埠終端
此處使用Xshell進行檢視:
4.4.實驗總結
Zynq中PS端的使用包含兩部分:
- 硬體設計
- 軟體設計
在設計硬體的時候都是基於IP核進行設計的,ARM處理器核心和Zynq7 Processing IP核相對應,在設計完成之後通過Vivado進行埠之間的自動連線,設計完成後到處SDK所需要的硬體檔案,轉入軟體設計;
軟體設計時和普通ARM核心處理器的開發相同,採用C語言開發,並無多大差異,詳細細節可以參考Xilinx文件和例程。
4.5.實驗擴充套件——printf的測試
printf在嵌入式開發中是一個很常用的函式,通過如下程式碼進行測試:
int main()
{
char str[20];
init_platform();
//print("Hello World\n\r");
/* Test Function print */
printf("%d\r\n",123);
printf("%f\r\n",1.23);
printf("%x\r\n",0xFF);
sprintf(str,"%s\r\n","hello");
printf(str);
cleanup_platform();
while(1);
}
測試結果如下: