1. 程式人生 > >PYNQ上手筆記 | ②PL端和PS端的獨立開發

PYNQ上手筆記 | ②PL端和PS端的獨立開發

在上一篇中提到,Pynq是為了降低開發人員的門檻,但是作為一個學習嵌入式開發的學生,當然要一步一個腳印打好基礎,所以選擇從Zynq入手學習,等跑起來Linux系統再運用Python開發也不遲,知其然也知其所以然,開發效率更高,所以接下來的幾篇都是關於Zynq的,如果想直接玩Pynq可直接跳過,毫無影響。

1.Zynq的架構

在開始實驗之前對Zynq晶片有一個基本的認識,如果想深入瞭解關於Zynq的理論部分,推薦參考The Zynq Book,有英文版和中文版,在此對於Zynq的理論淺嘗輒止,不做深究,重點放在實驗應用上。

Zynq中包含兩大功能塊:PS部分和PL部分。

  • PS部分

    指Processing System,一個基於雙ARM Cortex A9核心的處理系統,其中集成了記憶體儲存器和外部儲存器介面,大量的外設:GPIO、UART、SD/SDIO、IIC、SPI、乙太網、CAN等等介面;

  • PL部分指Programmable Logic,基於Xilinx 7系列架構的可程式設計邏輯單元,通過PL部分可以為ARM定製很多外設,這也是Zynq的一大優點。

Zynq中雖然包含PS端和PL端,但是整個設計是以ARM處理器為中心的,PS端的ARM核心可以獨立於PL端執行,值得注意的是,雖然PL端也可以獨立於PS端執行,但是PL的配置是由PS端完成的,所以不能採用傳統的固化FLASH的方式固化PL端程式。
PS端和PL端通訊是通過AXI介面

協議連線,這個協議是AMBA的一部分,是一種高效能、高頻寬、低延遲的片內匯流排,對這個匯流排不用進行太深的研究,在後續的實驗中可以看到,Xilinx已經提供了大量的關於AXI匯流排ip核供我們呼叫。

2.獲取Pynq-Z2開發板資料

實驗所需Pynq-Z2開發板的全部資料都可以在TUL官網下載到:

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);
}

測試結果如下: