大俠好,歡迎來到FPGA技術(shù)江湖,江湖偌大,相見即是緣分。大俠可以關(guān)注FPGA技術(shù)江湖,在“闖蕩江湖”、"行俠仗義"欄里獲取其他感興趣的資源,或者一起煮酒言歡。
今天給大俠帶來Xilinx ZYNQ 動(dòng)手實(shí)操演練,話不多說,上貨。當(dāng)我們一提到?Xilinx ZYNQ,大家腦海大多數(shù)就會(huì)浮現(xiàn)一個(gè)描述的詞匯,高端,其實(shí)這個(gè)詞很貼切的形容了Zynq系列產(chǎn)品,Xilinx (賽靈思公司)推出的行業(yè)第一個(gè)可擴(kuò)展處理平臺(tái)Zynq系列,旨在為視頻監(jiān)視、汽車駕駛員輔助以及工廠自動(dòng)化等高端嵌入式應(yīng)用提供所需的處理與計(jì)算性能水平。
名稱的由來
Zynq這個(gè)詞很容易讓人聯(lián)想到zinc,也就是電池、日光屏、合金制品和藥品中最常見的化學(xué)元素鋅。鋅與其他金屬的合金可實(shí)現(xiàn)增強(qiáng)型功能,根據(jù)合金的不同對(duì)象表現(xiàn)為不同的色彩。鋅最常見的用途就是電鍍。那么這個(gè)名稱與電鍍之間有什么聯(lián)系?
在2010年4月硅谷舉行的嵌入式系統(tǒng)大會(huì)上,賽靈思發(fā)布了可擴(kuò)展處理平臺(tái)的架構(gòu)詳情,這款基于無處不在的ARM處理器的SoC可滿足復(fù)雜嵌入式系統(tǒng)的高性能、低功耗和多核處理能力要求。賽靈思可擴(kuò)展處理平臺(tái)芯片硬件的核心本質(zhì)就是將通用基礎(chǔ)雙ARMCortex-A9MPCore處理器系統(tǒng)作為“主系統(tǒng)”,結(jié)合低功耗28nm工藝技術(shù),以實(shí)現(xiàn)高度的靈活性、強(qiáng)大的配置功能和高性能。由于該新型器件的可編程邏輯部分基于賽靈思28nm7系列FPGA,因此該系列產(chǎn)品的名稱中添加了“7000”,以保持與7系列FPGA的一致性,同時(shí)也方便日后本系列新產(chǎn)品的命名。
除了芯片外,賽靈思Zynq-7000系列還構(gòu)成了最終平臺(tái)產(chǎn)品的基礎(chǔ)。賽靈思聯(lián)盟計(jì)劃生態(tài)系統(tǒng)和ARM互聯(lián)社區(qū)的成員提供的軟件開發(fā)與硬件設(shè)計(jì)實(shí)現(xiàn)工具、廣泛采用的操作系統(tǒng)、調(diào)試器、IP及其他元素的工具就好像“電鍍”在一起一樣,從而使可擴(kuò)展處理平臺(tái)成為了可能。
Zynq-7000為何不是FPGA?
Zynq-7000可擴(kuò)展處理平臺(tái)是采用賽靈思新一代FPGA(Artix-7與Kintex-7FPGA)所采用的同一28nm可編程技術(shù)的最新產(chǎn)品系列。可編程邏輯可由用戶配置,并通過“互連”模塊連接在一起,這樣可以提供用戶自定義的任意邏輯功能,從而擴(kuò)展處理系統(tǒng)的性能及功能。不過,與采用嵌入式處理器的FPGA不同,Zynq-7000產(chǎn)品系列的處理系統(tǒng)不僅能在開機(jī)時(shí)啟動(dòng),而且還可根據(jù)需要配置可編程邏輯。采用這種方法,軟件編程模式與全功能的標(biāo)準(zhǔn)ARM處理SoC毫無二致。
“可擴(kuò)展”意味著什么?
在軟件工程領(lǐng)域,可擴(kuò)展性(有時(shí)會(huì)同前向兼容性相混淆)是指實(shí)現(xiàn)方案考慮到未來發(fā)展需求的系統(tǒng)設(shè)計(jì)原理。這是一種能夠擴(kuò)展系統(tǒng)的系統(tǒng)性舉措,也是實(shí)現(xiàn)擴(kuò)展所需的工作。擴(kuò)展可體現(xiàn)為增加新功能,也可體現(xiàn)為現(xiàn)有功能的修改。其核心主題就是在盡可能減少現(xiàn)有系統(tǒng)功能變動(dòng)的基礎(chǔ)上實(shí)現(xiàn)變革。
在系統(tǒng)架構(gòu)中,可擴(kuò)展性意味著系統(tǒng)設(shè)計(jì)時(shí)包含了通過新功能擴(kuò)展/改進(jìn)自身的機(jī)制和元素(hook),而且無需對(duì)系統(tǒng)基礎(chǔ)架構(gòu)進(jìn)行較大的修改。良好的架構(gòu)反映了實(shí)現(xiàn)上述目的的設(shè)計(jì)原理,也為今后可能的構(gòu)建工作制定了發(fā)展藍(lán)圖。請(qǐng)注意,這通常是指最終交付的產(chǎn)品中包含了尚不會(huì)(實(shí)際上可能永遠(yuǎn)不會(huì))用到的功能和機(jī)制,但這種功能并不是可有可無的,而是可維護(hù)性的必要元素,有助于避免產(chǎn)品過早被淘汰。
ZYNQ=processor
Zynq-7000嵌入式處理平臺(tái)系列的每款產(chǎn)品均采用帶有NEON及雙精度浮點(diǎn)引擎的雙核ARMCortex-A9MPCore處理系統(tǒng),該系統(tǒng)通過硬連線完成了包括L1,L2緩存、存儲(chǔ)器控制器以及常用外設(shè)在內(nèi)的全面集成。該處理系統(tǒng)不僅能在開機(jī)時(shí)啟動(dòng)并運(yùn)行各種獨(dú)立于可編程邏輯的操作系統(tǒng)(OS),而且還可根據(jù)需要配置可編程邏輯。利用這種方法,軟件編程模式與全功能的標(biāo)準(zhǔn)ARM處理SoC毫無二致。
應(yīng)用開發(fā)人員利用可編程邏輯強(qiáng)大的并行處理能力,不僅可以解決多種不同信號(hào)處理應(yīng)用中的大量數(shù)據(jù)處理問題,而且還能通過實(shí)施更多外設(shè)來擴(kuò)展處理系統(tǒng)的特性。系統(tǒng)和可編程邏輯之間的高帶寬AMBA?-AXI互聯(lián)能以極低的功耗支持千兆位級(jí)數(shù)據(jù)傳輸,從而解決了控制、數(shù)據(jù)、I/O和存儲(chǔ)器之間的常見性能瓶頸問題。
編程環(huán)境
Zynq-7000系列提供了一個(gè)開放式設(shè)計(jì)環(huán)境,便于可編程邏輯中雙核Cortex-A9MPCore和定制加速器的并行開發(fā),從而加速了產(chǎn)品上市進(jìn)程。軟件開發(fā)人員可以充分利用基于Eclipse的XilinxPlatformStudio軟件開發(fā)套件(SDK)、ARM的DS-5和ARMRealViewDesignSuite(RVDS),或ARM互聯(lián)社區(qū)和賽靈思聯(lián)盟計(jì)劃生態(tài)系統(tǒng)的領(lǐng)先廠商(諸如Lauterbach、WindRiver、PetaLogix、MathWorks、MentorGraphics、Micrium和MontaVista等)提供的編譯器、調(diào)試器和應(yīng)用。
此外,利用賽靈思屢獲殊榮的ISE?設(shè)計(jì)套件的優(yōu)勢(shì),Zynq-7000系列的可編程結(jié)構(gòu)經(jīng)定制可以最大化系統(tǒng)級(jí)性能,滿足特定應(yīng)用的各種需求。該套件提供了包括開發(fā)工具、AMB4AXI4即插即用IP核和總線功能模型(BFM)等在內(nèi)的完整硬件開發(fā)環(huán)境,有助于加速設(shè)計(jì)和驗(yàn)證工作。賽靈思通過收購高級(jí)綜合技術(shù)領(lǐng)先公司AutoESL進(jìn)一步提升了在工具方面的進(jìn)程,提供C,C++以及系統(tǒng)C綜合優(yōu)化Zynq-7000器件架構(gòu)。未來的版本也將促進(jìn)Zynq-7000產(chǎn)品系列中處理器和可編程邏輯之間關(guān)鍵算法的無縫銜接。
隨著時(shí)間的推移,ARM互聯(lián)社區(qū)和賽靈思聯(lián)盟計(jì)劃生態(tài)系統(tǒng)的第三方廠商將進(jìn)一步擴(kuò)展上述解決方案,這是賽靈思目標(biāo)設(shè)計(jì)平臺(tái)的一部分,可提供包括IP核、參考設(shè)計(jì)、開發(fā)套件及其他資源等在內(nèi)的高效統(tǒng)一的開發(fā)環(huán)境,從而滿足特定應(yīng)用和設(shè)計(jì)領(lǐng)域要求。
可編程邏輯架構(gòu)
Zynq-7000系列的可編程邏輯完全基于賽靈思最新7系列FPGA架構(gòu)來設(shè)計(jì),可確保28nm系列器件的IP核、工具和性能100%兼容。最小型的Zynq-7000、Zynq-7010和Zynq-7020均基于專門針對(duì)低成本和低功耗優(yōu)化的Artix-7系列;較大型的Zynq-7030和Zynq-7040器件基于包括4至12個(gè)10.3Gbps收發(fā)器通道,可支持高速片外連接的中端Kintex-7系列。所有四款產(chǎn)品均采用基于2個(gè)12位1MspsADC(模數(shù)轉(zhuǎn)換器)模塊的新型模擬混合信號(hào)模塊。
Zynq的一些概念
ZYNQ,總的來說,就是兩大功能塊,PS 部分和 PL部分, 直面意思理解就是ARM的SOC部分,和FPGA部分。
PS:?處理系統(tǒng) (Processing System) , ?就是與FPGA無關(guān)的ARM的SOC的部分。
PL:?可編程邏輯 (Progarmmable Logic), 就是FPGA部分。之所以叫PL,而不是叫FPGA,原因主要是考慮到讓做軟件的大俠們不要望而生畏。對(duì)于邏輯而言,在這里就不多說了,單純做軟件的也不要去考慮了。
下一個(gè)層級(jí), APU部分:
APU:?應(yīng)用處理器單元(Application Processor Unit), 位于PS里面的中心位置。APU這三個(gè)字,AMD公司曾經(jīng)用過,特指全稱是“Accelerated Processing Units”,加速處理器,它是融聚了CPU與GPU功能的產(chǎn)品,電腦上兩個(gè)最重要的處理器融合,相互補(bǔ)足,發(fā)揮最大性能。XILINX 的APU與AMD的APU在縮寫上就是截然不同的兩個(gè)詞, 不要混淆了。
APU 這個(gè)詞,在Xilinx內(nèi)部的術(shù)語中,也是存在撞車的。在Xilinx 的 PowerPC體系中,?有一個(gè)輔助處理單元“Auxiliary Processing Unit” 的概念,指的是在PowerPC硬核外掛的浮點(diǎn)協(xié)處理器之類的單元。
在這個(gè)位置上的處理器, 還有各種其他的叫法, 有MCU (微控制器處理單元Microcontroller Unit),MPU (微處理器單元Microprocessor Unit),等等。? MCU這個(gè)叫法,暗示了處理器功能不強(qiáng),只能搞搞輸入輸出控制啊,寫個(gè)小狀態(tài)機(jī)啊, 一般都是8位機(jī)。? MPU呢,就更先進(jìn)了一些,成prcessor了,這意味著處理器通常是32位的, 能干點(diǎn)計(jì)算的事。但是有一個(gè)micro詞根在里面,說明干的是小活,通常沒有正式的和全尺寸的操作系統(tǒng), 通常沒有內(nèi)存管理單元MMU。? ARM 的Cortex-M系列是干這類活的。
APU,帶了Application這個(gè)詞, 意味著在上面可以跑應(yīng)用程序, 暗示著這個(gè)系統(tǒng)是需要全尺寸的操作系統(tǒng)的,和現(xiàn)在炙手可熱的應(yīng)用商店app store 遙相呼應(yīng)。
APU里面具體包含的內(nèi)容嘛,就是雙ARM-CortexA9核,加上高速緩沖,DMA,定時(shí)器,中斷控制,浮點(diǎn)和NEON協(xié)處理,硬件加速器一致性控制器ACP神馬的。也就是處理器核心部分。
套用時(shí)下越來越流行的詞匯,“嵌入式計(jì)算”, "embedded computing", 可以這么說,用MCU,MPU搭出來的東東,通常叫嵌入式系統(tǒng)。而APU搭出來的東東, 就夠格叫嵌入式計(jì)算系統(tǒng)了。
TTC, 這個(gè)詞,當(dāng)年猜了半天也拿不準(zhǔn),看了文檔,發(fā)現(xiàn),是Triple Time Counter的意思。就是這個(gè)計(jì)數(shù)器里面有3個(gè)獨(dú)立通道,可以獨(dú)立計(jì)數(shù)。掛在APB上,為系統(tǒng)或外設(shè)提供定時(shí)或計(jì)數(shù)服務(wù)的。
WDT, ?看門狗定時(shí)器,有兩個(gè),分別監(jiān)視ARM-Cortex A9用的。如果軟件跑飛,無法清定時(shí)器,一段時(shí)間后,看門狗就復(fù)位。
SWDT,系統(tǒng)級(jí)看門狗定時(shí)器, 這個(gè)看門狗的時(shí)鐘和復(fù)位信號(hào),都可以來自于芯片外部, 這樣,即使系統(tǒng)有嚴(yán)重故障,比如時(shí)鐘頻率本身都有問題了,仍然可以通過與系統(tǒng)無關(guān)的外部信號(hào)計(jì)數(shù),計(jì)數(shù)滿就復(fù)位。
SCU, Snoop Control Unit, ?用來保持雙核之間的數(shù)據(jù)Cache的一致性。也就是是說,第一個(gè)A9處理器寫存儲(chǔ)時(shí),只是寫在了緩存里,沒有進(jìn)主存,如果第二個(gè)A9讀操作,涉及到第一個(gè)寫臟了的數(shù)據(jù)段, SCU要保證第二個(gè)A9的緩存里是最新的數(shù)據(jù)。? 如果第二個(gè)A9寫同樣數(shù)據(jù)段的數(shù)據(jù),需要在第一個(gè)中體現(xiàn)出寫的內(nèi)容。
SCU的存在,才使得兩個(gè)核成互相聯(lián)系的“雙核”,才能成為MPsoc。在原先Xilinx的雙PowerPC的芯片中, 是不存在的。不少學(xué)校的老師拿Xilinx的雙powerpc練手和教學(xué),從頭搭一個(gè)Snoop協(xié)議在裸的雙PowerPC中,倒也不錯(cuò)。
開發(fā)環(huán)境
Zynq的開發(fā)環(huán)境,可以在ISE或者Vivado,不過ISE在14.7之后就停止了更新,建議安裝VIVADO,畢竟Vivado號(hào)稱是把各種開發(fā)工具集成并且支持圖形化建模的功能強(qiáng)大的開發(fā)軟件。
Vivado的安裝教程公眾號(hào)前篇推送過,各位大俠如有需要可以翻一下,這里放個(gè)超鏈接,Xilinx Vivado 2017.2安裝教程,說了這么多,下面介紹一下開發(fā)硬件環(huán)境Zynq 7000 XC7Z100,Zynq 7000系列中頂配型號(hào),Zynq + Kintex7最強(qiáng)組合,提供豐富的芯片內(nèi)部資源。
首先打開安裝的Vivado 2017.2,打開界面如下:
實(shí)操演示
下面做一個(gè)從uart打印hello world的實(shí)驗(yàn),只用PS,不用PL部分,程序從SD卡啟動(dòng),跑在PS的內(nèi)部RAM。
zynq 7000的PS雖然也是CPU,但是開發(fā)方法不像普通的CPU只需要一個(gè)SDK就可以了,它還需要vivado硬件設(shè)計(jì)軟件。
ZYNQ 7000的PS開發(fā)需要兩個(gè)工具,一個(gè)是vivado,?另一個(gè)是SDK。
1. 打開vivado軟件-->Create New Project,工程名和目錄:
2. next->選RTL Project->Add Sources,Add existing IP和Add constraints界面直接點(diǎn)next。
3. New Parts界面。
4. 添加IP,在Flow Navigator的IP Integrator 下點(diǎn)擊Create Block Design。
下一步,Create Block Design如下,點(diǎn)OK。
下一步,在Diagram界面點(diǎn)擊Add IP。
下一步,雙擊ZYNQ7 Processing System,添加CPU。
5. 設(shè)置CPU。在Diagram界面點(diǎn)擊Run Block Automation,不做修改,點(diǎn)Finish就可以。在Diagram界面雙擊。
進(jìn)入設(shè)置界面,我們把所有的接口去掉,只留下FIXED_IO。
<1> PS-PL Configuration->General->Enable Clock Resets->去掉FCLK_RESET0_N
<2> PS-PL Configuration->GP Master AXI Interface->去掉 M AXI GP0 interface
<3> Clock Configuration->PL Fabric Clocks->去掉FCLK_CLK0
<4> DDR Congiguration->去掉Enable DDR
MIO Configuration->Bank1 IO Voltage選LVCMOS 1.8V
MIO Configuration->IO Peripherals->選上SD 0, SD 0的引腳配置:
6. 點(diǎn)擊OK返回Diagram界面, 把DDR接口刪掉,配置之后的界面。
7. 生成設(shè)計(jì)文件
右擊system項(xiàng)->Generate Output Products->直接點(diǎn)Generate, 之后會(huì)提示文件生成成功。
下一步,右擊system項(xiàng)->Create HDL Wrapper。
下一步,選下面一項(xiàng),點(diǎn)OK。
注意:如果重新修改了CPU配置,上面兩個(gè)步驟一定要重新實(shí)行。
8. 導(dǎo)出硬件設(shè)計(jì)文件到SDK
導(dǎo)出前要確保Block Design是打開的,即Diagram界面要打開File->Export->Export Hardware->直接點(diǎn)OK,這樣會(huì)把硬件文件system_wrapper.hdf導(dǎo)到helloword.sdk文件夾下,SDK工程也在該目錄下。
9. 啟動(dòng)SDK
File->Launch SDK->直接點(diǎn)OK。
下一步,SDK啟動(dòng)后就自動(dòng)添加了硬件相關(guān)的工程。
system.hdf是system_wrapper.hdf文件的copy;
ps7_init.tcl是PS初始化的TCL腳本,PS不能執(zhí)行TCL腳本,所以將該腳本轉(zhuǎn)換為了C文件--ps7_init.c和ps7_init.h.;? ?前面用vivado的硬件設(shè)計(jì)就是為了生成這兩個(gè)文件,ps7_init.c主要初始化CPU的時(shí)鐘,引腳復(fù)用,ddr和外設(shè)等。后面的helloword工程只需要這兩個(gè)文件,其他的文件都不需要。
10.添加helloword工程
在SDK中->File->New->New Application Project->設(shè)置如下,點(diǎn)next->選hello world。
11. 修改源碼
多了兩個(gè)工程,一個(gè)是app,另一個(gè)是bsp. ,發(fā)現(xiàn)SD V2.3驅(qū)動(dòng)有問題,將其退為2.2。
在helloword_bsp工程下打開system.mss文件,點(diǎn)擊左下角的source,修改sd驅(qū)動(dòng)版本為2.2。
修改之后重新生成BSP源碼,點(diǎn)system.mss左下角的overview->Re-generate BSP Sources。??將ps7_init.c和ps7_init.h copy到helloword/src目錄下,也可以創(chuàng)建連接,這里就直接copy了。? ?修改helloword/src/platform.c
--init_platform函數(shù),將ps7_init()函數(shù)的comment去掉,?? ? ? ? ??--包含頭文件#include "ps7_init.h"
12. 編譯代碼->project->Clean->OK
13. 生成boot.bin啟動(dòng)文件
右擊helloword工程->Create boot Image->Create Image。
注意:helloword.elf 前面的bootloader一定要出現(xiàn),表示該文件是bootloader,啟動(dòng)后運(yùn)行的第一個(gè)文件,可點(diǎn)edit來修改。
14.? 將生成的BOOT.bin文件copy到SD卡(已用HP USB Disk Storage Format Tool格式化成啟動(dòng)盤),啟動(dòng),從串口可看到打印信息。
關(guān)于Zynq 的實(shí)操到這里就結(jié)束了,各位大俠如果想要更加深入的去研究,建議各位去Xilinx的官網(wǎng)下載更多的資料,自己實(shí)操動(dòng)手訓(xùn)練,后續(xù)有時(shí)間再給各位大俠更新一些相關(guān)的內(nèi)容,各位大俠如果有好的想法或者好的文章學(xué)習(xí)資料等,可以投稿,具體聯(lián)系方式可以加底端群主微信,共同學(xué)習(xí),共同進(jìn)步,有緣再見。