3、創建zynq最小嵌入式系統
1、簡介
首先我們來了解一下 ZYNQ 嵌入式系統的開發流程。

如上圖所示,開發流程大體可以分為 6 步。其中 step1 至 step4 為硬件設計部分,在 Vivado 軟件中實現;step5 為軟件設計部分,在 SDK 軟件中實現; step6 為功能的驗證。復雜的程序還涉及 Debug,這個也是在SDK 軟件中實施。
在簡單了解 ZYNQ 嵌入式系統的開發流程后,接下來我們來看一下什么是 ZYNQ 嵌入式最小系統。ZYNQ 嵌入式最小系統的概念包括以下兩個方面:它是使系統正常工作的最小條件;它是其他系統建立的基礎。

如上圖 所示,以 ARM Cortex-A9 為核心、 DDR3 為內存,加上傳輸信息使用的 UART 串口就構成了 ZYNQ 嵌入式最小系統。可以看到,這個最小系統只包括了 ZYNQ 中的 PS 部分。
首先我們程序會加載到DDR內存中,然后CPU一條一條執行,那么執行的情況我們可以通過串口打印觀察。
下面我們將按照 ZYNQ 嵌入式系統開發流程,一步步的搭建上圖所示的最小系統。
2、搭建最小嵌入式系統
2.1、step1:創建 Vivado 工程
2.2、step2:使用 IP Integrator 創建 Processing System
Vivado 開發套件中提供了一個圖形化的設計開發工具——IP 集成器( IP Integrator) ,在 IP 集成器中可以非常方便的插入各種功能模塊( IP) 。它支持關鍵 IP 接口的智能自動連接、一鍵式 IP 子系統生成、實時 DRC 等功能, 能夠幫助我們快速組裝復雜系統, 加速設計流程。
接下來我們將在 IP 集成器中完成 ZYNQ 嵌入式系統的搭建。
(1)在左側導航欄( Flow Navigator)中,單擊 IP Integrator 下的 Create Block Design。然后在彈出的對話框中指定所創建的 Block Design 的名稱,在 Design name 欄中輸入“ system”。如下圖所示:


(2)點擊“OK”按鈕,此時 Vivado 界面如下圖所示。注意右側的 Diagram 窗口, 我們將在該窗口中以圖形化的方式完成設計。

(3)接下來在 Diagram 窗口中給設計添加 IP。點擊上圖中箭頭所指示的加號“ +” , 會打開 IP 目錄( IPCatalog) 。也可以通過快捷鍵 Ctrl + I,或者右鍵點擊 Diagram 工作區中的空白位置,然后選擇“ ADD IP”。
(4)打開 IP 目錄后,在搜索欄中鍵入“ zynq”,找到并雙擊“ ZYNQ7 Processing System”,將 ZYNQ7處理系統 IP 添加到設計中。


(5)添加完成后, ZYNQ7 Processing System 模塊出現在 Diagram 中,如下圖所示:

(6)雙擊所添加的 ZYNQ7 Processing System 模塊,進入 ZYNQ7 處理系統的配置界面。界面左側為頁面導航面板,右側為配置信息面板。 如下圖所示:

下面我們簡要地介紹一下頁面導航面板中各個頁面的作用:
在 Zynq Block Design 頁面,顯示了 Zynq 處理系統( PS)的各種可配置塊,其中灰色部分是固定的,綠色部分是可配置的,按工程實際需求配置。可以直接單擊各種可配置塊(以綠色突出顯示)進入相應的配置頁面進行配置,也可以選擇左側的頁導航面板進行系統配置。
PS-PL Configuration 頁面能夠配置 PS-PL 接口,包括 AXI、 HP 和 ACP 總線接口。
Peripheral IO Pins 頁面可以為不同的 I/O 外設選擇 MIO/EMIO 配置。
MIO Configuration 頁面可以為不同的 I/O 外設具體配置 MIO/EMIO。
Clock Configuration 頁面用來配置 PS 輸入時鐘、外設時鐘,以及 DDR 和 CPU 時鐘等。
DDR Configuration 頁面用于設置 DDR 控制器配置信息。
SMC Timing Calculation 頁面用于執行 SMC 時序計算。
Interrupts 頁面用于配置 PS-PL 中斷端口。
這里使用的是最小系統,我們需要做的就是修改時鐘頻率,內存類型和接口輸出。 需要注意的是,如果時鐘頻率與內存類型與我們的硬件不一致時, SDK中的程序會崩潰,運行不過來。在后續的調試中, 如果遇到程序奔潰的情況需要檢查下你的DDR型號,以及時鐘頻率。
1)配置 PS 的時鐘
PS 輸入時鐘頻率: 33.333333MHZ,根據開發板上晶振的頻率設置。
CPU PLL時鐘: 666.666666MHZ(這個時鐘對于MZ7035系列最大可以設置800MHZ)。
PL Fabric Clocks-FCLK_CLK0: 100MHZ 這個時鐘可以用于提供給PLL使用。
點擊左側的 Clock Configuration 頁面,該界面主要是配置ZYNQ PS 中的時鐘頻率。比如輸入時鐘默認是 33.33333Mhz,這與我們開發板上的 PS 端輸入時鐘頻率相同。對于 CPU 的時鐘、 DDR 的時鐘以及其它外設的時鐘, 我們直接保持默認設置即可。如下圖所示:

注意:如果搭建 ZYNQ 的嵌入式最小系統只需要使用 ZYNQ 中的 PS 端,不需要PL端時,我們就將 PS 中與 PL 端交互的接口信號移除。
同樣是在 Clock Configuration 頁面,展開 PL Fabric Clocks,取消勾選 FCLK_CLK0,如下圖所示:

點擊左側的 PS-PL Configuration 頁面,然后在右側展開 General 下的 Enable Clock Resets, 取消勾選其中的 FCLK_RESET0_N,如下圖所示:

另外在當前界面中展開 AXI Non Secure Enablement 下的 GP Master AXI Interface,取消勾選其中的 MAXI GP0 interface,如下圖所示:

2)PS DDR3內存配置
點擊左側的 DDR Configuration 頁面,在右側 DDR Controller Configuration 下的“ Memory Part”一欄選擇 DDR 的器件,MZ7035 系列 PS 端的內存為 1GB,選取內存型號(兼容型號): MT41K256M16 RE-125。需要注意的是,我們在這里選擇的型號并不是開發板上的 DDR3 型號,而是參數接近的型號,或者說兼容的型號。其他的配置選項保持默認即可。

3)、串口配置
配置 PS 的 UART。點擊 Peripheral I/O Pins 頁面,出現以下 IO 引腳配置界面。

PS 和外部設備之間的連接主要是通過復用的輸入/輸出( Multiplexed Input/Output, MIO)來實現的。PS 的54 個MIO 引腳可以用于連接不同的外設接口,如圖 中的MIO48 和MIO49,既可以配置成UART1的引腳接口,也可以配置成 I2C1 或 CAN1的引腳接口。最終所選擇的配置需要與領航者開發板的原理圖相對應。
如下圖所示,我們在 MIO48和 MIO49下點擊 UART1,方框的顏色會變成綠色, 與此同時這兩個 MIO也會變成綠色。這就表明
MIO48 和 MIO49 被配置成了 UART 接口引腳,
它們與 PS 中的串口電路 UART1相連接。
點擊左側的 MIO Configuration 頁面,在右側展開 I/O Peripherals > UART1,可以看到更具體的引腳配置信息。其中 MIO49 作為 RX 引腳、 MIO48 作為 TX 引腳, 如下圖所示:

點擊左側的 PS-PL Configuration 頁面,我們可以在這里設置 UART1 串口通信的波特率。在 General 目錄下,可以看到 UART1 的波特率默認是 115200。通過下拉按鈕可以選擇其他波特率, 一般保持默認設置。

(7)配置 ZYNQ7 Processing System 完成,點擊“ OK”。

注意:如果是只使用PS部分,在配置完后返回到Vivado 界面后,在 Diagram中可以看到 ZYNQ7 Processing System IP 模塊發生了變化, 如下圖所示。 我們將其與上圖作對比可以發現, ZYNQ7 PS 模塊少了四個接口,這正是因為我們在配置 ZYNQ7PS 的過程中移除了與 PL 相關的接口信號。 
(8)完成配置后, 可以自動連線, 讓軟件自動引出接口
我們點擊上圖中箭頭所指示的位置“Run Block Automation”,會彈出如下圖所示的對話框:

在該界面中我們可以選擇自動連接 IP 模塊的接口, 包括導出外部端口,甚至可以自動添加模塊互聯過程中所需的 IP。 在我們本次設計中只有一個 IP 模塊, 在左側確認勾選 processing_system7_0,然后點擊“ OK”。
此時 ZYNQ7 PS 模塊引出了兩組外部接口,分別是 DDR 和 FIXED_IO, 引出的接口將會被分配到 ZYNQ器件具體的引腳上。大家也可以通過點擊 ZYNQ7 PS 模塊接口處的加號“+”, 來展開這兩組接口,觀察其中都有哪些信號。 如下圖所示:

(9)在Block文件中,我們進行連線,將鼠標放在引腳處,鼠標變成鉛筆后進行拖拽,連線如下圖所示。連線的作用就是把PS的時鐘可以接入PL部分。

(10)本次實驗不需要添加其它 IP,直接按快捷鍵 Ctrl+S 保存當前設計。接下來點擊下圖所指示的按鈕,驗證當前設計。驗證完成后彈出對話框提示沒有錯誤或者關鍵警告, 點擊“ OK”, 如下圖所示:

如果驗證結果報出錯誤或者警告,大家需要重新檢查自己的設計。
(11)如果連線比較混亂,可以點擊右鍵,選擇Regenerate Layout,如下圖所示:



如果添加了ip核,要為其分配寄存器

(3)step3:生成頂層 HDL 模塊
1)在 Sources 窗口中,選中 Design Sources 下的 sysetm.bd, 這就是我們剛剛完成的 Block Design 設計。右鍵點擊 sysetm.bd,在彈出的菜單欄中選擇“ Generate Output Products”,如下圖所示:

2)在對話框中 Synthesis Options 選擇 Global

Run Setings 用于設置生成過程中要使用的處理器的線程數,進行多線程處理, 保持默認或設置為個人電腦處理器最大可使用線程數都可以,一般選擇最大可使用線程數的一般。然后點擊“Generate”來生成設計的綜合、實現和仿真文件。
在“ Generate”過程中會為設計生成所有需要的輸出結果。 比如 Vivado 工具會自動生成處理系統的 XDC約束文件,因此我們不需要手動對 ZYNQ PS 引出的接口( DDR 和 FIXED_IO) 進行管腳分配。
Generate 完成后,在彈出的對話框中點擊“ OK”。

在 Sources 窗口中, 點擊“ IP Source”標簽頁, 可以看到 Generate 過程生成的輸出結果。


3) 在“ Hierarchy”標簽頁再次右鍵點擊 system.bd,然后選擇“Create HDL Wrapper”。

在彈出的對話框中確認勾選“Let vivado manager wrapper and auto-update(自動更新)”, 然后點擊“ OK”。
創建完成后, Design Sources 結構如下圖所示:

system_wrapper.v 為創建的 Verilog 文件, “ 品” 字形圖標指示當前模塊為頂層模塊。 該模塊使用 Verilog HDL 對設計進行封裝, 主要完成了對 block design 的例化, 大家也可以雙擊打開該文件查看其中的內容。
另外我們在“Create HDL Wrapper”中勾選了“Let vivado manager wrapper and auto-update(自動更新)”, 這樣我們在修改了 Block Design 之后就不需要再重新生成頂層模塊, Vivado 工具會自動更新該文件。
2.4、step4:生成 Bitstream 文件并導出到 SDK
如果設計中使用了 PL 的資源,則需要添加引腳約束并對該設計進行綜合、實現并生成 Bitstream 文件。
在左側 Flow Navigator 導航欄中找到 PROGRAM AND DEBUG, 點擊該選項中的“Generate Bitstream”,然后在連續彈出的對話框中依次點擊“YES”、 “OK”。 此時, Vivado 工具開始對設計進行綜合、 實現、并生成 Bitstream 文件。生成 Bitstream 完成后, 在彈出的對話框中選擇“Open Implemented Design”, 如下圖所示:



如果實驗未用到 PL 部分,所以無需生成 Bitstream 文件,只需將硬件導出到 SDK 即可。
(1)導出硬件
在菜單欄選擇 File > Export > Export hardware。

在彈出的對話框中,如果沒有使用PL部分,即沒有生成 bitstream 文件,就無需勾選“ Include bitstream”,直接點擊“ OK” 按鈕。如果使用了PL部分,就勾選“ Include bitstream”,然后點擊“ OK” 按鈕。

在上圖中, 因為選擇了“Exort to <Local to Project>”, Vivado 工具會在當前工程目錄下新建一個文件夾,名為“zynq7000.sdk”, 它是我們接下來軟件開發的工作空間。
在 Export Hardware 的過程中, 工具會將硬件以一個 ZIP 壓縮文件的形式導出到該工作空間中, 文件名為“system_wrapper.hdf”。該文件包含了我們前面所搭建的硬件平臺的配置信息, 其后綴名.hdf 的含義為“Hardware Definition File”, 即硬件定義文件。
(2)硬件導出完成后,在菜單欄中選擇 File > Launch SDK,啟動 SDK 開發環境。如下圖所示:

在彈出對話框中,直接點擊“ OK”, 如下圖所示:

到這里,我們已經完成了 ZYNQ 嵌入式系統的硬件設計部分。接下來需要到 SDK 軟件中進行應用程序開發,也就是軟件設計部分。
在硬件設計的最后,我們啟動了軟件開發環境( SDK, Software Development Kit),如下圖所示:

SDK 打開后, 主頁面會顯示硬件描述文件 system.hdf 的內容。如上圖所示, system.hdf 標簽頁顯示了整個 PS 系統的地址映射信息。
大家應該還記得, 在啟動 SDK 之前,我們將硬件以一個 ZIP 壓縮文件( system_wrapper.hdf) 的形式導出到軟件的工作空間。 在 SDK 啟動時,該文件會自動解壓, 大家可以在上圖的左側看到解壓后的所有文件。 其中, 前四個文件( ps7_init_gpl.c、 ps7_init_gpl.h、 ps7_init.c 和 ps7_init.h) 包含了 Zynq SOC 處理系統的初始化代碼,以及 DDR、時鐘、 pll 和 MIO 的初始化設置信息。在初始化過程中, SDK 使用這些信息去配置相應的模塊, 使得應用程序能夠在 PS 上運行。
2.5、step5:在 SDK 中創建應用工程
(1)在菜單欄選擇 File > New > Application Project, 新建一個 SDK 應用工程。

在彈出的對話框中,輸入工程名“ hello_world”,其它選項保持默認即可,點擊“ Next”。

選擇工程模版 Hello World,然后點擊“ Finish”。

SDK 創建了一個 hello_world 應用工程和 hello_world_bsp 板級支持包( BSP) 工程。 同時工具會自動對工程進行編譯, 并生成 ELF 文件“ hello_world.elf”, 如下圖所示:
另外工程創建完成后, SDK 主界面會打開 BSP 工程目錄下的 system.mss 文件。 MSS 是英文Microprocessor Software Specification 的縮寫,即微處理器軟件說明。 該文件包含 BSP 的操作系統信息、 硬件設計中各個外設的軟件驅動等信息。

2.6、step6:板級驗證
在 SDK 軟件的下方,找到 SDK Terminal 窗口。 如果界面中沒有找到該窗口, 或者操作過程中把該窗口給關閉了,則可以通過在菜單欄中選擇 Window > Show View > Other, 在 Show View 窗口中搜索添加SDK Terminal。
如下圖所示,在 SDK Terminal 窗口中點擊右上角的加號“ +”連接串口,并在彈出的窗口中對串口進行設置。設置的參數需要與硬件設計過程中配置的 UART0 保持一致, 即波特率為 115200, 數據位為 8 位,停止位為 1 位。 如下圖所示:

下載完成后, 應用程序會將字符串“ Hello World”通過 ZYNQ PS 端的串口模塊 UART0 發送出去。在 SDK Terminal 窗口可以看到上位機接收到的字符串, 如下圖所示:


浙公網安備 33010602011771號