本章內容是MIZ701中的第五章,本來也是要過渡一下FPGA部分的,但是由於MIZ701沒有單獨提供PL部分的晶振時鍾,時鍾必須通過PS產生,所以本章內容作為Miz701的第一章內容。本章的目的是搭建一個最小的SOC系統,並且測試串口輸出,千兆以太網回路測試。本章先讓PS部分搭建最小系統,這樣可以從PS部分獲取到時鍾,然后為后面章節中PL部分提供時鍾源。
1.0本章難度系數★★☆☆☆☆☆
1.1最小系統分析
這張圖展示了我們需要構建的最小系統。並且下面的嵌入式實驗會基於這個最小系統進行添加外設。
本實驗中將會只使用到PS部分資源包括了ARM Cotrex-A9、 DDR3內存、一個UART串口。這就是我們的最小系統。首先我們程序會加載到DDR內存中,然后CPU一條一條執行,那么執行的情況我們可以通過串口打印觀察。
1.2板子使用的硬件
紅色線框內就是本次實驗需要用到的資源,分別為CPU XC7Z010、2片512MB內存、一個Micro接口的USB 轉 UART,內存型號實際焊機MT41K256M16RE-125 M
1.3新建一個VIVADO工程
Step1:新建一個名為為Miz701的工程
Step2:
Step3:
Step4:
1.4使用IP Integrator創建硬件系統
Step1:單擊Create Block Design
Step2:輸入system
Step4:搜素單詞z選擇ZYNQ7 Processing System,然后雙擊
Step5:添加進來了ZYNQ CPU IP,然后雙擊下圖
Step6:修改時鍾輸入為50MHZ,可以看到ARM時鍾為650MHZ DDR為525MHZ(1050MHZ),並且修改FCLK_CLK0 為100MHZ
Step7:修改MIO的配置 修改IO電壓,增加ENT0 和UART1接口,下面會測試這2個接口,之后單機OK.
Step8:修改內存型號為MT41K256M16RE-125 M
Step9:單機Run Block Automation 進行自動連線,VIVADO軟件會根據信號的命名規則智能連線。
Step10:勾選如下,直接單機OK
Step11:在你點擊了OK后,你會發現DDR以及FICED_IO自勱的延伸出來,然后把時鍾FCLK_CLK0和M_AXI_GPI0_ACLK連接。方法:當把鼠標靠近的時候會自動連接。
Step12:為了讓以太網PHY RTL8211E-VL可以工作,必須讓其復位PIN腳設置為1,只要簡單添加一個常量IP並且映射到PL部分的PIN腳(復位腳在FPGA 部分(PL)),和添加CPU方法一樣
Step13:雙擊設置常量為1
Step14:右擊PIN腳選擇Make External
Step15:取個有意義的名字如下圖,只要單擊相應的模塊就可以在右手邊修改
Step16: 右擊 system.bd, 單擊Generate Output Products
Step17:支部操作會產生執行、仿真、綜合的文件,可以看出來最后的硬件設計步驟還是回到了我們前面的FPGA開發上來了。
Step18:右擊system.bd 選擇 Create HDL Wrapper 這步的作用是產生頂層的HDL文件
Step19:選擇Leave Let Vivado manager wrapper and auto-update 然后單擊OK
Step20:之后我看下源碼的層次結構,可以看到system_wrapper.v就是頂層文件,調用了CPU.
Step21:查看system_wrapper.v源碼
//Copyright 1986-2015 Xilinx, Inc. All Rights Reserved. //-------------------------------------------------------------------------------- //Tool Version: Vivado v.2015.4 (win64) Build 1412921 Wed Nov 18 09:43:45 MST 2015 //Date : Sun Aug 28 12:47:04 2016 //Host : Administrator running 64-bit Service Pack 1 (build 7601) //Command : generate_target system_wrapper.bd //Design : system_wrapper //Purpose : IP block netlist //-------------------------------------------------------------------------------- `timescale 1 ps / 1 ps module system_wrapper (DDR_addr, DDR_ba, DDR_cas_n, DDR_ck_n, DDR_ck_p, DDR_cke, DDR_cs_n, DDR_dm, DDR_dq, DDR_dqs_n, DDR_dqs_p, DDR_odt, DDR_ras_n, DDR_reset_n, DDR_we_n, FIXED_IO_ddr_vrn, FIXED_IO_ddr_vrp, FIXED_IO_mio, FIXED_IO_ps_clk, FIXED_IO_ps_porb, FIXED_IO_ps_srstb, PHY_Rst); inout [14:0]DDR_addr; inout [2:0]DDR_ba; inout DDR_cas_n; inout DDR_ck_n; inout DDR_ck_p; inout DDR_cke; inout DDR_cs_n; inout [3:0]DDR_dm; inout [31:0]DDR_dq; inout [3:0]DDR_dqs_n; inout [3:0]DDR_dqs_p; inout DDR_odt; inout DDR_ras_n; inout DDR_reset_n; inout DDR_we_n; inout FIXED_IO_ddr_vrn; inout FIXED_IO_ddr_vrp; inout [53:0]FIXED_IO_mio; inout FIXED_IO_ps_clk; inout FIXED_IO_ps_porb; inout FIXED_IO_ps_srstb; output [0:0]PHY_Rst; wire [14:0]DDR_addr; wire [2:0]DDR_ba; wire DDR_cas_n; wire DDR_ck_n; wire DDR_ck_p; wire DDR_cke; wire DDR_cs_n; wire [3:0]DDR_dm; wire [31:0]DDR_dq; wire [3:0]DDR_dqs_n; wire [3:0]DDR_dqs_p; wire DDR_odt; wire DDR_ras_n; wire DDR_reset_n; wire DDR_we_n; wire FIXED_IO_ddr_vrn; wire FIXED_IO_ddr_vrp; wire [53:0]FIXED_IO_mio; wire FIXED_IO_ps_clk; wire FIXED_IO_ps_porb; wire FIXED_IO_ps_srstb; wire [0:0]PHY_Rst; system system_i (.DDR_addr(DDR_addr), .DDR_ba(DDR_ba), .DDR_cas_n(DDR_cas_n), .DDR_ck_n(DDR_ck_n), .DDR_ck_p(DDR_ck_p), .DDR_cke(DDR_cke), .DDR_cs_n(DDR_cs_n), .DDR_dm(DDR_dm), .DDR_dq(DDR_dq), .DDR_dqs_n(DDR_dqs_n), .DDR_dqs_p(DDR_dqs_p), .DDR_odt(DDR_odt), .DDR_ras_n(DDR_ras_n), .DDR_reset_n(DDR_reset_n), .DDR_we_n(DDR_we_n), .FIXED_IO_ddr_vrn(FIXED_IO_ddr_vrn), .FIXED_IO_ddr_vrp(FIXED_IO_ddr_vrp), .FIXED_IO_mio(FIXED_IO_mio), .FIXED_IO_ps_clk(FIXED_IO_ps_clk), .FIXED_IO_ps_porb(FIXED_IO_ps_porb), .FIXED_IO_ps_srstb(FIXED_IO_ps_srstb), .PHY_Rst(PHY_Rst)); endmodule |
可以看到頂層文件的源碼調用了CPU接口,所有外設的接口也都是通過頂層文件引出來的。
Step22:單機Add Sources
Step23:選擇Add or create constraints
Step24:選擇Create File
Step25:輸入zynq_pin
Step26:如圖,單擊Finish
Step27:雙擊打開zynq_pin.xdc文件,添加PIN腳約束
Step28:雙擊打開zynq_pin.xdc文件,添加PIN腳約束
set_property PACKAGE_PIN E17 [get_ports PHY_Rst[0]] set_property IOSTANDARD LVCMOS33 [get_ports PHY_Rst[0]] |
1.6導出SOC硬件到SDK
Step1:File->Export->Export Hardware
Step2:勾選Include bitstream 直接單擊OK
Step3:File->Launch SDK加載到SDK
Step4:單擊OK
1.6 HelloWorld程序
Step1:導出完成后如下圖
1、硬件部分,這部分就是從VIVADO定制好的SOC硬件
2、這部分是硬件的地址空間分配
Step2:選擇File->New->Application Project
Step3:工程命名為HelloWorld,創建的bsp包取名為Miz702_bsp,然后單擊NEXT
Step4:系統里面有很多自帶的測試程序,本次就用自帶的Helloworld程序做測試,單擊Finish
Step5:完成后
Step6:右擊HelloWorld->Generate linker Script
Step7:可以看到所有可用內存的情況,代碼、數據、堆棧運行所在內存的情況。不做人后改動,關閉。
Step8:右擊HelloWorld->
Step9:單擊這個位置新建
Step11:設置調試信息輸出的端口可以到支持串口和JTAG方式,如果使用串口先確保串口已經接通到電腦,並且開發板已經通電。這里選擇串口,這樣可以測試我們的串口是否正常工作了。如果以后調試可以直接使用JTAG調試更加方便並且波特率設置到115200之后單擊Apply。之后單擊Debug(注意開發板必須通電,另外TF卡確保拔掉)
Step12:進入SDK調試界面
1、啟動2、暫停3、停止4、代碼5、信息控制台6、調試變量
Step13:單擊運行輸出結果
1.7 MemTest內存測試程序
Step1:新建一個名為MemTest的工程
Step2:任然采用自帶的測試函數測試
Step3:測試結果
1.8 DRAMTest內存測試程序
Step1:新建一個名為DRAMTest的工程
Step3:新建一個名為MemTest的工程
Step4:測試結果
根據提示可以在控制台中輸入相關序號按回車進行(r,i測試會有一部分錯誤,還以和程序空間有關系)
1.9 LWIP協議對千兆網口測試
Step1:新建一個名為LWIP_Test的工程
Step2:選擇LWIP Echo Server 之后單擊Finish
Step3:運行之后的串口打印信息
Step4:用網絡助手實現回傳測試
1.10使用快捷按鈕調試
使用這兩個圖標,一個是debug一個是運行模式可以方便調試。
1.11 本章小結
本章詳細講解了定制一個SOC最小系統,並且運行了自帶的HelloWorld工程、MemTest內存測試工程、DRAMTest內存測試工程、LWIP網絡協議工程對千兆網口測試。本章讓初學者可以搭建一個最小的SOC系統,並且教會讀者利用軟件自動的工程對SOC的基本外設進行測試。