MicroBlaze如何與Zynq SoC和平共存
賽靈思 Zynq-7000 All Programmable SoC已具有很強(qiáng)的板載處理能力。但是Zynq應(yīng)用處理單元(APU)中強(qiáng)大的雙Cortex-A9處理器和相關(guān)外設(shè)的存在并不妨礙您在同一封裝中添加一個或多個MicroBlaze?處理器,只要能讓應(yīng)用受益就好。
為什么要給處理功能已經(jīng)很強(qiáng)大的解決方案添加MicroBlaze呢?首先就是可靠性的問題。單線程會大幅提高可靠性。您可以針對計算密集型任務(wù)為每個Cortex-A9都布置一個線程,而且能根據(jù)需要為其它線程實(shí)例化任何數(shù)量的MicroBlaze處理器。其次,您可將任何雜務(wù)交給MicroBlaze去完成,讓處理功能強(qiáng)大的Cortex-A9去執(zhí)行最需要它的工作,充分發(fā)揮其用武之地,從而節(jié)省數(shù)個關(guān)鍵的工作周期。
下面這個例子能反映以上兩種情況。設(shè)想一下,一個任務(wù)需要長期高強(qiáng)度計算,同時還要監(jiān)控用戶輸入。這里,MicroBlaze可管理用戶輸入(頻率較低、計算強(qiáng)度不高),并寫入APU存儲器空間,這樣APU閑置時(也就是完成了處理任務(wù)時)就能看看接下來需要處理什么信息。
一旦您決定在基于Zynq的設(shè)計中添加一個MicroBlaze處理器,馬上就會發(fā)現(xiàn)一些問題。首要問題就是APU如何與MicroBlaze通信,哪些處理器系統(tǒng)(PS)資源可供MicroBlaze使用。包括ZC702和Zedboard等在內(nèi)的許多開發(fā)板將許多外設(shè)直接映射到與處理系統(tǒng)相連的引腳??删幊踢壿?PL)中,這些引腳不能直接訪問MicroBlaze。處理系統(tǒng)還包含多種不同定時器和中斷資源。有什么辦法能從MicroBlaze領(lǐng)域訪問這些資源嗎?
PS與PL之間的接口
處理器系統(tǒng)和可編程邏輯緊密結(jié)合,這意味著Cortex-A9、窺探控制單元(SCU)、PS外設(shè)、時鐘管理及其它功能與可編程邏輯之間存在多個緊密的集成連接。事實(shí)上,PS和PL之間共有6種不同類型的互聯(lián),您可將這些互聯(lián)類型彼此結(jié)合使用。此外,許多路徑是對稱的,也就是說PC能啟動到PL的連接,而PL也能啟動到PS的連接。
圖1:PL中PS和MicroBlaze的邊界是一片雷區(qū)嗎?二者能否共享資源?
賽靈思公司目前提供的應(yīng)用指南、用戶指南和白皮書等大量資料均介紹了作為設(shè)計“核心”的Zynq-7000 APU如何利用可編程邏輯來訪問存儲器、基于PL的外設(shè)和硬芯片外設(shè)(如PCIe模塊、BRAM、DSP48和千兆位級收發(fā)器等)。要分析MicroBlaze如何成為其自身領(lǐng)域的主導(dǎo),邏輯上的第一步就是看看6個接口變量,首先從通用、高性能和加速器一致性端口這三類AXI接口入手。
PS有兩個連接到PL的主AXI通道和兩個由PL啟動的從通道(圖2)。這里的“主”是指AXI通道為發(fā)起方,能啟動數(shù)據(jù)交換,而“從”在只能用于響應(yīng)到達(dá)的數(shù)據(jù)。主AXI通道通常用來與PL中的外設(shè)通信。從AXI通道負(fù)責(zé)響應(yīng)PL的請求,其中可能包括MicroBlaze處理器所執(zhí)行的事務(wù)處理。這些AXI通道連接到PS的中央互聯(lián),可路由到許多資源。
此外,還有4個高性能(64位寬)AXI通道連接點(diǎn)。從PS角度來說,所有這4個通道均為從通道,連接至PS中的存儲器接口子系統(tǒng)(圖3)。這4個通道的目的就是讓PS中的主設(shè)備啟動DDR存儲器事務(wù)處理。
這種存儲器互聯(lián)和DDR存儲器控制器是所有資源到DDR存儲器的門戶。雖然Cortex-A9處理器的優(yōu)先級通常高于從AXI連接,但4個AXI連接中每個都有一個“現(xiàn)在為我服務(wù)”信號,能讓發(fā)出該請求的通道獲得優(yōu)先級。未斷言該信號時,架構(gòu)、采用循環(huán)機(jī)制確定哪個請求方有權(quán)訪問特定類型存儲器。
加速器一致性端口(ACP)是另一種PL的32位AXI PS從連接。ACP的獨(dú)特之處在于它直接連接到SCU中。SCU的任務(wù)就是確保L1、L2和DDR存儲器之間的一致性。采用ACP,您能訪問PS中的每個Cortex- A9處理器的高速緩存存儲器,而不必?fù)?dān)心與主存儲器中的數(shù)據(jù)同步問題(硬件會自動處理好這個問題)。該功能不僅可大幅降低設(shè)計負(fù)擔(dān),而且還能顯著加速處理器與PL之間的數(shù)據(jù)傳輸。
圖2:到處理系統(tǒng)中央互聯(lián)的簡化連接。
圖3:到DDR存儲器控制器和片上存儲器(OCM)的簡化連接。
除了AXI鏈接之外,可擴(kuò)展多路輸入輸出(EMIO)信號也可用于路由許多PS的硬外設(shè)直至PL,以便訪問封裝引腳。只有54個封裝引腳直接連接到PS,不過PS的硬外設(shè)可使用的引腳數(shù)量大大超過54個。EMIO是PS硬外設(shè)和PL之間的通道。這些I/O信號可直接路由到PL可用的封裝引腳,而您也可利用這些引腳與PL中兼容的外設(shè)進(jìn)行通信。
PS和PL之間另外的各種雜項(xiàng)信號可以分為5個基本類:時鐘與復(fù)位、中斷信號、事件信號、空閑AXI與DDR存儲器信號,以及DMA信號。
* 時鐘與復(fù)位:PS為PL提供4個獨(dú)立的可編程頻率。通常這些時鐘之一用于AXI連接。每個時鐘域都有自己的域復(fù)位信號,可重設(shè)與該域關(guān)聯(lián)的任何器件。
* 中斷信號:PS中的通用中斷控制器(GIC)負(fù)責(zé)收集所有可用源的中斷,包括PS外設(shè)的所有中斷源和可編程邏輯的16個“外設(shè)”類型中斷。此外,還有4個連接到CPU(IRQ0、 IRQ1、FIQ0和FIQ1)的直接中斷。來自PS外設(shè)的共28個中斷可提供給PL。
* 事件信號:這些“帶外”異步信號說明PS的特殊情況。PS提供一系列信號用于表明哪個CPU進(jìn)入待機(jī)模式,哪個CPU執(zhí)行了SEV(“發(fā)送事件”)指令。PS可用事件信號從WFE(“等待事件”)狀態(tài)中喚醒。
* 空閑AXI與DDR存儲器信號:PS的空閑AXI信號用來指示PL中沒有未處理的AXI事務(wù)處理。該信號由PL驅(qū)動,是用來啟動PS總線時鐘關(guān)斷功能的條件之一,確保所有PL總線器件均處于閑置狀態(tài)。DDR緊急/仲裁信號用來向PS DDR存儲器控制器的4個AXI端口DDR仲裁表示關(guān)鍵的存儲器處于緊張狀況。
* DMA信號:PS的直接存儲器訪問(DMA)模塊通過一系列“請求和確認(rèn)”信號與PL從設(shè)備通信。
圖4:硬件設(shè)計實(shí)例方框圖。
訪問DDR存儲器
我們下面來分析一個設(shè)計實(shí)例,該實(shí)例涵蓋了典型MicroBlaze用戶可能涉及的幾個常見的需求,比如如何訪問DDR存儲器;如何使用PS IOP中的外設(shè);如何在MicroBlaze和PS之間傳輸數(shù)據(jù)塊;如何在MicroBlaze和PS之間實(shí)現(xiàn)事件同步等。圖4給出了解決每種問題的方法(分別標(biāo)識為1、2、3、4)。
訪問DDR存儲器最簡單方法就是通過4個高性能(HP)AXI接口的一個或多個連接(方框圖右上方)。4個64位寬端口可供可編程邏輯訪問。您首先必須啟用一個端口,然后連接AXI到端口。MicroBlaze采用AXI4-Lite接口,而HP端口則應(yīng)用作全AXI4連接。所幸的是,賽靈思設(shè)計工具可自動彌補(bǔ),無需任何手動修改就確保實(shí)現(xiàn)成功連接。方框圖中①顯示了該連接。這類連接的優(yōu)勢在于創(chuàng)建起來非常簡單,而DDR存儲器對設(shè)計來說就是常規(guī)存儲器。而不足之處在于,AXI-Lite不支持突發(fā)模式,而且只有32位寬,因此會喪失不少性能。
還可通過其它方法將基于PL的外設(shè)連接到DDR存儲器,比如采用DMA控制器,同樣也可采用HP端口。雖然這種連接機(jī)制更復(fù)雜,但能提高大數(shù)據(jù)塊的傳輸性能。
在PS中啟用UART和三重定時器/計數(shù)器(TTC)。M_AXI_GP0連接的BRAM控制器位于PL中,但從概念上說是PS設(shè)計的組成部分(實(shí)際上也是PS設(shè)計的一部分)。
MicroBlaze作為設(shè)計的另一部分采用BRAM提供64KB的整合代碼和數(shù)據(jù)空間,供MicroBlaze專用。顯然,我們能連接這些端口到PS的HP端口以訪問DDR存儲器,不過這樣做會讓實(shí)現(xiàn)工作變得更復(fù)雜。
有3個連接到MicroBlaze的標(biāo)準(zhǔn)外設(shè):一個是負(fù)責(zé)接收TTC的PWM波形輸入并將其解釋為中斷源和接收的UART字符中斷的中斷控制器;一個是負(fù)責(zé)驅(qū)動ZC702開發(fā)板上8個LED的GPIO,第三個是用于連接到PS所連接的同一BRAM的B側(cè)的BRAM控制器。此外還有兩個連接:一個是到S_AXI_GP0的連接,用于實(shí)現(xiàn)PS內(nèi)部外設(shè)的尋址;另一個到高性能端口的連接,可讓MicroBlaze訪問DDR存儲器部分。
外設(shè)、數(shù)據(jù)塊和同步
到PS S_AXI_GP0端口的連接是訪問可編程系統(tǒng)IOP模塊的關(guān)鍵(圖中的②)。S代表這是一個從端口,也就是接受PL中的組件啟動的事務(wù)處理。在MicroBlaze和S_AXI_GP0端口之間建立連接時,IOP模塊可從0xE000_0000擴(kuò)展到0xE02F_FFFF,這意味著MicroBlaze地址空間中的其它外設(shè)都不能重疊于這段地址,而這段地址將供處理器共享。
與此同時,許多機(jī)制均支持MicroBlaze和PS之間的數(shù)據(jù)塊傳輸。往返DMA和DDR以及DMA和片上存儲器(OCM)就是兩個可能性。另一種就是在設(shè)計實(shí)例中實(shí)現(xiàn)的機(jī)制,其使用雙端口BRAM(圖中的③)。PS為BRAM控制器一側(cè)主設(shè)備,而MicroBlaze則為其另一側(cè)主設(shè)備。軟件負(fù)責(zé)管理分區(qū)和共享BRAM存儲器空間的使用,因?yàn)閮蓚?cè)都有權(quán)對存儲器的全部內(nèi)容進(jìn)行全面讀取和寫入。
最終問題涉及如何在MicroBlaze和PS之間同步事件。PS包括大量定時器,您能對PL中任意數(shù)量的定時器實(shí)例化。設(shè)計實(shí)例中采用了一個TTC外設(shè)中的一個通道來生成100毫秒的脈沖信號(圖中的④)。這里的關(guān)鍵是要認(rèn)識到TTC生成的波形能從PS以外訪問,但TTC中斷只能在PS以內(nèi)可用。您可用波形本身作為MicroBlaze中斷,從而規(guī)避這個問題。此外,您也可采用硬件定時器(AXI定時器或用戶編碼的定時器)為PS和MicroBlaze提供中斷。
圖5:獨(dú)立軟件域和重疊項(xiàng)。
軟件支持
與任何嵌入式設(shè)計一樣,您要考慮的不光是硬件實(shí)現(xiàn)問題,還要考慮軟件支持。對本例而言,要考慮兩個處理器的重疊區(qū)域(如圖5所示)。
就硬件而言,要把系統(tǒng)視為兩個相互交叉的嵌入式設(shè)計:PS和MicroBlaze。我們的參考設(shè)計可讓PS為其自身和MicroBlaze生成時鐘信號并提供中斷。MicroBlaze可使用這些信號,但不能影響或?qū)ζ湫薷?。PS和PL共用PS的IOP模塊、DDR存儲器與控制器以及常見的雙端口BRAM。
從地址映射角度看,IOP地址固定在硬件中,不能修改。MicroBlaze和Cortex-A9必須對外設(shè)使用相同的地址。技術(shù)參考手冊在這方面做了詳細(xì)說明,非常具有參考價值。技術(shù)參考手冊分兩部分對解決設(shè)計中的外設(shè)問題進(jìn)行了闡述。這部分中的所有寄存器都列出了地址和簡介,管理兩個處理器之間的資源則是用戶要開展的一項(xiàng)任務(wù),要避免數(shù)據(jù)沖突,避免資源不足等。
圖6:Cortex-A9應(yīng)用和MicroBlaze應(yīng)用流程圖。
采用DDR存儲器及其控制器比較簡單,因?yàn)镈DR存儲器控制器能管理沖突問題,而且提供適當(dāng)?shù)膯l(fā)避免任何請求方無法獲得數(shù)據(jù)。由于這不在用戶控制下,時延可能會有些難以預(yù)見。
常見的BRAM采用相同的較低地址位,不過針對該模塊的每個處理器存儲器空間的位置可用XilinxPlatform Studio的地址標(biāo)簽來選擇。跟以前一樣,數(shù)據(jù)沖突、同步和存儲器分配也是讀者要完成的工作。
我們的軟件設(shè)計實(shí)例更主要的目的是演示連接Cortex-A9和MicroBlaze的過程,而不是要做任何實(shí)際的工作。一些方法將演示這方面的可能性。
圖6左側(cè)所示的Zynq-7000應(yīng)用是一款簡單的設(shè)計,其采用賽靈思單機(jī)版板支持包。它運(yùn)行的程序很大程度上讓處理器保持空閑狀態(tài),只是周期性地通過串行端口發(fā)出T字符表明自己仍在工作。此外,它會計算T的次數(shù)并將計數(shù)統(tǒng)計保存在BRAM中,與MicroBlaze共享。
MicroBlaze應(yīng)用也運(yùn)行單機(jī)版板支持套件。這樣就能支持中斷,每次串行端口上出現(xiàn)字符,MicroBlaze就把字符緩存起來,并發(fā)送對應(yīng)的Hex-ASCII到PS IOP模塊的串行端口。此外,它會構(gòu)建接收字符串,每收到一個字符都保存在DDR存儲器中。收到回車后,將計算校驗(yàn)和,并在字符串后直接添加到DDR存儲器。BRAM預(yù)先設(shè)定的位置處設(shè)置標(biāo)記,當(dāng)Cortex代碼“看到”標(biāo)記時就從DDR存儲器讀取字符串,并驗(yàn)證校驗(yàn)和。如果校驗(yàn)和準(zhǔn)確,MicroBlaze發(fā)出“+”,否則發(fā)出“X”。
簡而言之,設(shè)計實(shí)例證明MicroBlaze和Zynq7000 PS完全能和平共處。AXI連接點(diǎn)數(shù)量很多,使MicroBlaze(或PL中的任何組件)能方便地訪問IOP模塊中的外設(shè)、OCM和DDR??删幊踢壿嬆芊奖愕卦L問IOP模塊的中斷,而PL中能生成一系列中斷并發(fā)送給PS。軟件協(xié)調(diào)和定義良好的行為是避免爭搶情況和尋址沖突的關(guān)鍵。