構(gòu)建SoC系統(tǒng),畢竟是需要實(shí)現(xiàn)PS和PL間的數(shù)據(jù)交互,而像上一講那樣PL主機(jī)與PL從機(jī)之間通過AXI4-Lite總線進(jìn)行交互有點(diǎn)殺雞用牛刀了。
如果PS與PL端進(jìn)行數(shù)據(jù)交互,可以直接設(shè)計(jì)PL端為從機(jī),PS端向PL端的reg寫入數(shù)據(jù)即可,但是對(duì)于圖像處理等大數(shù)據(jù)量的數(shù)據(jù)交互來說,PL端的BRAM畢竟容量有限,很難用BRAM作為兩者間的數(shù)據(jù)緩存器。對(duì)于這樣的應(yīng)用來說,利用DDR3作為PS端與PL端之間交互的數(shù)據(jù)緩存器是最合適不過的。
1.工程規(guī)劃
再ZedBoard板子的硬件設(shè)計(jì)方案中,DDR芯片的管腳是綁定到Zynq的DDR接口上的。
而Zynq系統(tǒng)的這個(gè)DDR總線接口有是鏈接在其內(nèi)部“Memory Interfaces”中的“DDR2/3,LPDDR2 Controller”可配置硬核上的。
因此,要想PL訪問板上的DDR3存儲(chǔ)器,必須借道Zynq中的“Memory Interfaces----DDR2/3,LPDDR2 Controller”(后文簡(jiǎn)稱“DDR3 Controller”)。根據(jù)之前的經(jīng)驗(yàn),在Zynq系統(tǒng)中,ARM Core(CPU)能夠訪問硬核“DDR3 Controller”,根據(jù)經(jīng)驗(yàn)可以確定“DDR3 Controller”一定是一個(gè)從設(shè)備,而PL要想訪問“DDR3 Controller”的話,PL一定要是一個(gè)主設(shè)備,由PL發(fā)起讀寫操作。
“DDR3 Controller”是封裝在Zynq子系統(tǒng)中的,因此,PL必須連接Zynq的從機(jī)接口。從上圖可以看出,Zynq有兩個(gè)從機(jī)接口,分別是“32b GP AXI Slave Ports”和“High Performance AXI 32b/64b Slave Ports”根據(jù)名稱可以看出,一個(gè)是高性能的,另一個(gè)應(yīng)該是普通的。之前Zynq作為主機(jī)連接AXI4-Lite從設(shè)備時(shí),走的是“32b GP AXI Master Ports”,可以輔助證明,對(duì)于本節(jié)應(yīng)用,走的接口應(yīng)該是“32b GP AXI Slave Ports”。
交互數(shù)據(jù)將會(huì)經(jīng)過Zynq子系統(tǒng)的內(nèi)部總線(用空再考證一下是什么名稱)控制器“Central Interconnect”轉(zhuǎn)發(fā)給Memory Interfaces。具體數(shù)據(jù)交互路徑如下圖所示:
根據(jù)上述分析,SoC系統(tǒng)集成方案框圖如下:
根據(jù)之前的經(jīng)驗(yàn),利用向?qū)傻腜L端AXI4-Lite Master IP 用戶用例再txn負(fù)脈沖觸發(fā)下,主機(jī)模塊的邏輯是連續(xù)4次(次數(shù)默認(rèn)為4,可通過修改參數(shù)C_M00_AXI_TRANSACTIONS_NUM的數(shù)值改變次數(shù))向遞增的地址區(qū)間寫入4組測(cè)試數(shù)據(jù),測(cè)試數(shù)據(jù)每次加1。然后主機(jī)模塊自動(dòng)讀取剛才寫入數(shù)據(jù)的地址內(nèi)的數(shù)據(jù),將讀的的數(shù)據(jù)與寫入數(shù)據(jù)進(jìn)行比較,如果正確,主機(jī)IP的ERROR信號(hào)保持低電平,如果錯(cuò)誤,ERROR給出高電平。
本文后面的行為仿真證明:再次給主機(jī)IP模塊一個(gè)txn的觸發(fā)信號(hào),重新執(zhí)行4次寫入操作+4次讀取操作+比較操作。只不過每次觸發(fā)都從原始基地址開始操作,目標(biāo)寄存器地址并不增加。
本節(jié)的測(cè)試工程本著少改動(dòng)邏輯代碼的原則,仍基本采用此邏輯。每次按鍵觸發(fā),執(zhí)行4次寫操作+4次讀操作+比對(duì)檢查操作,增加利用4個(gè)LED燈表示每個(gè)地址比對(duì)結(jié)果是否正確(如果正確LED燈亮)。但是當(dāng)再次按下按鈕,LED燈全滅,松開按鈕后再執(zhí)行一組(4次寫操作+4次讀操作+比對(duì)檢查)操作,只是新的一組操作地址會(huì)遞進(jìn)增加。
2.Zynq系統(tǒng)裁剪
創(chuàng)建工程后,添加一個(gè)Zynq IP核,然后調(diào)用官方對(duì)ZedBoard板中Zynq子系統(tǒng)的默認(rèn)配置。
得到默認(rèn)的Zynq硬核配置如下圖所示:
對(duì)應(yīng)的Zynq封裝如下圖所示:
明顯看出有很多Zynq中的硬核在本項(xiàng)目中是不需要的,修改配置,將其裁剪掉。
修改后的Zynq配置顯示如下:
Zynq的封裝圖如下所示:
輸出端的FCLK_CLK0和FCLK_RESET0_N是輸出時(shí)鐘和復(fù)位信號(hào)。這兩個(gè)信號(hào)的出處已在前一個(gè)圖中進(jìn)行標(biāo)注。
ZedBoard開發(fā)板的ARM端時(shí)鐘由IC18有源晶振提供33.33333MHz的時(shí)鐘信號(hào),綁定到Zynq芯片的F7(PS_CLK)管腳上,該管腳是Zynq子系統(tǒng)(PS)的時(shí)鐘信號(hào)。如果工程中添加了Zynq子系統(tǒng),Vivado會(huì)自動(dòng)將F7綁定到Zynq子系統(tǒng)的PS_CLK管腳上(其實(shí)也不需要綁定,這是固話的。F7本身就是專用引腳,但是從硬件結(jié)構(gòu)上也可以看出一個(gè)工程只能實(shí)例化一個(gè)Zynq子系統(tǒng))。該綁定在約束文件上看不到,而在“Synthesis Design”的“I/O Planning”頁(yè)面中可以看到。(因?yàn)檫@個(gè)管腳是專用管腳,不需要綁定)這里欠個(gè)圖,后文會(huì)有,記著啊?。?!
FCLK_CLK0是經(jīng)過一個(gè)時(shí)鐘管理模塊(類似V4中的DCM)生成的,可以修改其參數(shù)。Zynq中包含了4個(gè)時(shí)鐘生成模塊。配置界面如下:
如果取消勾選,Zynq將不輸出時(shí)鐘信號(hào)。
那對(duì)于PL端的時(shí)序邏輯模塊,需要另外尋找時(shí)鐘信號(hào),在ZedBoard開發(fā)板上,IC17有源晶振提供100MHz的GCLK時(shí)鐘信號(hào),連接到Y(jié)9上,可用PL端使用。但是這種方案PS端和PL端由獨(dú)立的時(shí)鐘分別驅(qū)動(dòng),必須考慮跨時(shí)鐘域問題。
取消FCLK_CLK0的勾選后,Zynq的封裝圖如下所示:
FCLK_CLK0管腳就沒有了,但是FCLK_RESET0_N仍然存在,因?yàn)閆ynq中的Resets模塊是不可配置的。但是Resets有四路輸出,為什么這里只有1個(gè)呢?是不是跟FCLK_CLKx有綁定呢?
【添加,事后發(fā)現(xiàn),F(xiàn)CLK_RESET0_N也是可以關(guān)閉的,操作如下】
太強(qiáng)大的軟件了,永遠(yuǎn)別覺得自己學(xué)明白了?。?!
為了驗(yàn)證上述疑問,勾選兩路FCLK_CLK0和FCLK_CLK2,觀察之后的Zynq模塊封裝如下所示:
沒有喚出其余的幾路Resets信號(hào)。如何召喚其他幾路復(fù)位信號(hào),還得研究研究。
【個(gè)人猜想】:這個(gè)FCLK_RESET0_N應(yīng)該是跟Zynq子系統(tǒng)的復(fù)位工作是同步的,有可能Zynq子系統(tǒng)收到復(fù)位信號(hào)(PS-RST,BTN7,C9,低電平復(fù)位)后,F(xiàn)CLK_RESET0_N被拉低,等待一定時(shí)間保證Zynq子系統(tǒng)復(fù)位完成后,再延時(shí)一段時(shí)間,再拉高,是的PL端的模塊完成復(fù)位進(jìn)入正常工作狀態(tài)時(shí),Zynq子系統(tǒng)一定已經(jīng)正常工作。
本項(xiàng)目中,Zynq子系統(tǒng)裁剪完畢后,封裝圖采用下圖方案。
利用FCLK_CLK0驅(qū)動(dòng)PL端的時(shí)序邏輯。而將Y9管腳引入的100MHzGCLK信號(hào)旁路。
再來看看S_AXI_GP0,即AXI4總線接口(兼容AXI4-Lite)。如下圖所示:
終于,畫箭頭的管腳我們都熟悉了。其他的以后再說。
至此,Zynq子系統(tǒng)我們裁剪完畢了。
【還有個(gè)問題】:“DDR3 Controller”硬核在Zynq子系統(tǒng)內(nèi)部的內(nèi)存映射還沒有看到。打開Address Editor頁(yè)面,也沒有配置信息。
另外,作為從機(jī)接口,讀寫地址總線均為32bits,而不像之前的驗(yàn)證方案,從機(jī)的讀寫地址去掉高位的段地址只留下低位的offset Address,這樣的地址接口,能跟PL端的AXI InterConnect匹配嗎?
3.PL端主機(jī)IP核設(shè)計(jì)編碼
根據(jù)之前的經(jīng)驗(yàn),利用向?qū)梢粋€(gè)AXI4-Lite Master IP示例代碼,構(gòu)建主從模塊直連的測(cè)試系統(tǒng),從機(jī)模塊默認(rèn)內(nèi)部寄存器數(shù)量為4個(gè),構(gòu)建本仿真系統(tǒng)時(shí),將從機(jī)模塊內(nèi)部寄存器數(shù)量設(shè)置為32個(gè),其余不用修改。
功能仿真文件(詳見附錄2),模擬連續(xù)兩次觸發(fā)txn信號(hào),設(shè)置參數(shù),每次txn觸發(fā)執(zhí)行兩次寫讀操作,對(duì)應(yīng)的仿真結(jié)果如下圖所示。
每次txn觸發(fā),起始地址均歸零,即恢復(fù)成初始地址0x4000_0000,寫入的數(shù)據(jù)也變?yōu)槌跏贾?xaa00_0000。跟工程設(shè)計(jì)的邏輯需求不一致。
因此根據(jù)需求改造代碼邏輯,底層模塊的源碼詳見附錄。編碼時(shí)一定避免Multi-Driver禁告。修改后的邏輯仿真結(jié)果如下所示。
可也看出主機(jī)模塊的功能滿足設(shè)計(jì)要求。
之后將該IP核加入到工程的IP Catalog中。
4.在Block Design中增加PL端IP核
首先在Block Design中實(shí)例化一個(gè)AzIP_AXI_Master_3的一個(gè)IP模塊,如下圖所示,此時(shí)沒有連接。
點(diǎn)擊頁(yè)面上的Run Connection Audomation按鈕,自動(dòng)創(chuàng)建連接。整形以后如下圖所示。新加的兩個(gè)模塊都是老朋友了,基本邏輯核管腳時(shí)序都基本明確了。此時(shí)再來看這個(gè)連接,基本上就沒有問題了。圖中用彩色標(biāo)注出了PL端的時(shí)鐘信號(hào)和復(fù)位信號(hào)。均由Zynq子系統(tǒng)產(chǎn)生。
同樣按F6鍵檢查連接,如果檢查無(wú)誤,表示這個(gè)系統(tǒng)的“原理圖”畫的基本沒有問題了。
5.內(nèi)存映射分析
點(diǎn)擊Address Editor標(biāo)簽,看一看,這個(gè)圖前文在zynq子系統(tǒng)配置完后曾經(jīng)出現(xiàn)過,但是當(dāng)時(shí)是沒有數(shù)據(jù)的,現(xiàn)在我們放在一起對(duì)比一下:
下面我們嘗試解讀一下,第一幅圖時(shí),軟件僅僅檢測(cè)到存在一個(gè)AXI Slave接口GP0,當(dāng)時(shí)沒有匹配的,所以沒有數(shù)據(jù),但是當(dāng)我們加上自行設(shè)計(jì)的AXI Master接口IP后,軟件將二者匹配上了,通過層級(jí)結(jié)構(gòu)發(fā)現(xiàn),Zynq上的GP0的Slave接口是匹配用戶IP的主機(jī)接口的,然后軟件自動(dòng)分配了地址。有一個(gè)Base Name,名字是GP0_DDR_LOWOCM,這個(gè)名字沒看過,不過猜也知道是跟GP0口和DDR相關(guān)的,神奇軟件怎么知道我想操作DDR呢?猜想應(yīng)該是配置Zynq時(shí),配置了DDR,所以在Zynq中的總線控制其中激活了DDR相關(guān)的段地址,即DDR_LOWCOM。
為了驗(yàn)證上述想法,在Zynq中裁剪掉DDR,具體操作如下:
得到的Zynq封裝如下:
可以看到Zynq子系統(tǒng)各種去掉了DDR Control模塊,再看Address Editor頁(yè)面。
可以看到,由于GP0模塊的存在,對(duì)于Zynq內(nèi)部總線接口來說,它配置了一個(gè)地址GP0_LOW_OCM,關(guān)鍵詞是OCM,經(jīng)過查詢,得知OCM的意思是片上存儲(chǔ)器(On-Chip Memory),說白了就是內(nèi)存映射地址。Zynq內(nèi)部任何一個(gè)可配置的外設(shè)硬核,其電路均已經(jīng)硬件實(shí)現(xiàn)了,對(duì)應(yīng)的Zynq內(nèi)部片地址也是固定的,增加外設(shè),應(yīng)該就會(huì)有新的片內(nèi)地址。
增加了外設(shè)USRT1,SD0,USB0,ENET0,QUARD SPI,注意此時(shí)沒有激活DDR Controller模塊。先來看看Zynq的封裝。
再來看Address Editor頁(yè)面
可以看到,對(duì)于Quard SPI模塊,有單獨(dú)的地址映射GP0_QSPI_LINEAR,而USRT1,SD0,USB0,ENET0等外設(shè)沒有,根據(jù)Zynq的結(jié)構(gòu)圖,大膽猜測(cè),USRT1,SD0,USB0,ENET0等外設(shè)均包含在IO Peripherals模塊內(nèi),因此它們的統(tǒng)一片內(nèi)地址映射(OCM)的基地址均為GP0_IOP,其中IOP應(yīng)該就是IO Peripherals的簡(jiǎn)寫。
開始這些數(shù)據(jù)都沒有分配地址,但是前面說了,Zynq中,由于硬件結(jié)構(gòu)都是固定的,剪裁操作是指不激活某些功能模塊,個(gè)人猜測(cè)目的可能是為了低功耗,但是對(duì)應(yīng)的功能模塊的內(nèi)存地址映射都是固定的,跟用戶設(shè)計(jì)的SoC工程無(wú)關(guān)。
所以這些Zynq內(nèi)部的映射應(yīng)該是固定的,我們?cè)趺茨軌蚩吹侥兀奎c(diǎn)擊Address Editor中的Auto Assign Address按鈕,如下圖所示,系統(tǒng)就會(huì)自動(dòng)填寫響應(yīng)內(nèi)存映射的Offset Address和Range了。這些都應(yīng)該是經(jīng)由GP0路由到這些外設(shè)硬核的映射地址。
【補(bǔ)充】LOW_OCM應(yīng)該就是低速(低性能)存儲(chǔ)器地址。有低速對(duì)應(yīng)的肯定就有高速。如下所示。
勾選上圖所示項(xiàng),應(yīng)該能夠打開HIGH_OCM
從上文看出,對(duì)于GP0_QSPI_LINEAR和GP0_IOP的命名并沒有LOW和OCM等信息。Zynq外設(shè)配置不變,僅僅是勾選上圖Allow Access to High OCM項(xiàng),地址映射數(shù)據(jù)如下。其中HIGH_OCM應(yīng)該是個(gè)獨(dú)立的內(nèi)存區(qū)域。
去除USRT1,SD0,USB0,ENET0,QUARD SPI等外設(shè),啟動(dòng)DDR Control,仍然勾選Allow Access to High OCM項(xiàng),得到的Zynq封裝如下圖:
對(duì)應(yīng)的Address Editor頁(yè)面如下:
可以看出DDR還是屬于LOW_OCM,而HIGH_OCM應(yīng)該是Zynq系統(tǒng)中的一個(gè)特殊區(qū)域,具體在哪還不確定,因?yàn)楦鶧DR無(wú)關(guān),這里暫時(shí)就不關(guān)注了。
由于PL中的IP核對(duì)Zynq管理的DDR操作是通過地址進(jìn)行的,因此我們需要對(duì)DDR的內(nèi)存映射整明白。下面再研究研究。
GP0_LOW_OCM已經(jīng)沒有了,但是其對(duì)應(yīng)的地址被包含在GP0_DDR_LOWOCM地址段的低位區(qū)間上。
回想《筆記3:PS讀寫DDR3存儲(chǔ)》中的內(nèi)存映射:
對(duì)應(yīng)的片外DDR3存儲(chǔ)芯片的地址的起始位為0x00100000,和這個(gè)有點(diǎn)意思。
當(dāng)然,Address Editor頁(yè)面中的Offset Address參數(shù)和Range參數(shù)是可以修改的,而High Address參數(shù)是根據(jù)前兩個(gè)參數(shù)計(jì)算出來的。
必須對(duì)Zynq子系統(tǒng)的內(nèi)存映射原理特別明白,才能正確修改這些參數(shù),因此我們?cè)谏钊胙芯垦芯?,看看能不能整明白?/p>
為了深度研究這個(gè)問題,在Xilinx Documentation Navigator中搜索OCM,得到如下信息。
可以看到OCM還分為指令OCM和數(shù)據(jù)OCM。但是這些文件都是比較老的,不是針對(duì)Zynq芯片的。沒有收獲。
上圖這些文件也沒用,這些講到都是在PL端用HDL編碼實(shí)現(xiàn)一個(gè)與DDR直接向量的接口控制器的使用方案,而不是設(shè)計(jì)到Zynq的地址映射方案。
換個(gè)思路,查詢Zynq的技術(shù)文檔。
在該文檔中得到一些信息,先摘錄如下:
Zynq內(nèi)部有256KB的RAM,就是前面GP0_LOW_OCM或者GP0_HIGH_OCM映射的嗎?這個(gè)有意思,一定想辦法找到。因?yàn)橹皩?shí)驗(yàn)中C語(yǔ)言程序可能就運(yùn)行在這個(gè)內(nèi)存空間中。
這是前文提到的I/O Peripherals中的內(nèi)容。
ZedBoard板子用到的芯片是XC7Z020,封裝為clg484,但是由于芯片上覆蓋了個(gè)散熱片,不知道是-?。有空問問供貨商。
難道是-1???可憐啊,CPU主頻最高為667MHz。上圖應(yīng)該是從配置文件中獲得的,硬件具體是-?其實(shí)還是從芯片絲印看最可靠。不過應(yīng)該差別不會(huì)太大,畢竟是通用開發(fā)板,不是為了最求性能的。
下面圖很重要!
250KB的RAM(OCM)在圖中箭頭處。
我的猜測(cè),前面出現(xiàn)的內(nèi)存映射Base Name,應(yīng)該指的是Central Interconnect的出口,示意圖如下:
找到了,就是在這篇文檔中,有下列信息:
從上圖看到,0x0000_0000是DDR and OCM,
0xFFFC_0000是OCM
那么Zynq內(nèi)的256KB RAM(OCM)到底怎么訪問呢????郁悶
最后的DDR內(nèi)存映射配置按照系統(tǒng)默認(rèn)的,如下:
記得主機(jī)模塊開發(fā)是,使用的默認(rèn)起始地址是0x4000_0000,這個(gè)在代碼中定義的。不過利用IP核的GUI也能看到。
從前文知道,這個(gè)地址是向PL AXI Slave Port #0,即GP0的,Size是1G。
【問題】PL 中的Master IP向0x4000_0000地址寫入數(shù)據(jù),經(jīng)過PL中的AXI Interconnect直連,將會(huì)轉(zhuǎn)發(fā)給GP0,GP0收到后,怎么在轉(zhuǎn)給DDR呢????
【個(gè)人猜測(cè)】:傳入的地址-0x4000_0000,然后進(jìn)行路由判斷嗎?假設(shè)是這樣的,跑起來看看。
至此,本實(shí)驗(yàn)的硬件設(shè)計(jì)完畢。保存后,退出Block Design頁(yè)面。
6.封裝?& Synthesis
然后記得創(chuàng)建HDL Wrapper,
之后對(duì)這個(gè)工程進(jìn)行Run Synthesis。
結(jié)果沒有error和critical warning。
7.行為仿真
原想對(duì)這個(gè)包含Zynq的頂層模塊進(jìn)行行為仿真,但是看了一眼端口定義。
跟DDR相關(guān)的接口時(shí)序我根本沒法設(shè)定,故此放棄了。
直接下板測(cè)試吧。
8.管腳綁定
綜合完成后,進(jìn)入Synthesized Design頁(yè)面,先看看Schematic
然后重點(diǎn)看I/O Planning
根據(jù)原理圖,PS_CLK(F7)和PS_POR_B(B5)是在Bank500上,驅(qū)動(dòng)電壓是3.3V,而PS_RST(C9)是在Bank501上,驅(qū)動(dòng)電壓是1.8V。但是這幾項(xiàng)是Fixed,改不了,就這樣吧。
只能綁定用戶管腳,最后的配置圖如下:
之后會(huì)創(chuàng)建約束文件。
之后,執(zhí)行Run Implementation和Generate Bitstream。
9.是否還需要啟用SDK
直接下板嘗試。
沒有反應(yīng)啊。郁悶!Why????
時(shí)序邏輯沒反應(yīng),先檢查時(shí)鐘信號(hào)和復(fù)位信號(hào),在本實(shí)驗(yàn)系統(tǒng)中,PL端的時(shí)鐘信號(hào)和復(fù)位信號(hào)均是從Zynq子系統(tǒng)中輸出的,因此對(duì)工程做如下改變,將時(shí)鐘信號(hào)和復(fù)位信號(hào)引到板上的LED燈處,用于顯示和測(cè)量。
該工程Synthesis & Implementation后,仍然通過Hardware Manager下載后,現(xiàn)象為FCLK_CLK0驅(qū)動(dòng)的LED燈常亮,使用示波器檢測(cè)輸出為持續(xù)高電平,F(xiàn)CLK_RESET0_N驅(qū)動(dòng)的LED燈不亮。根據(jù)現(xiàn)象猜測(cè),Zynq子系統(tǒng)中的時(shí)鐘單元沒有正常工作。
原因分析(個(gè)人觀點(diǎn)):因?yàn)閆ynq其實(shí)是一個(gè)ARM系統(tǒng),其內(nèi)部的硬核要想按照配置正常工作,應(yīng)該是在初始化階段對(duì)相應(yīng)硬核的控制寄存器進(jìn)行初始化配置,如果是使用Hardware Manager下載是無(wú)法操作這一步的。因此嘗試使用SDK進(jìn)行SoC工程配置。
10.是否還需要啟用SDK
根據(jù)之前的學(xué)習(xí),使用SDK有下列幾步,不清楚的參看之間的學(xué)習(xí)筆記。
第一步:Vivado中Export Hardware...(其中需要Include Bitstream)
第二步:Vivado中Launch SDK
第三步:SDK中創(chuàng)建板載支持庫(kù)函數(shù),Board Support Package
第四步:創(chuàng)建用戶工程,Application Project
第五步:編譯
第六步:Program FPGA
下面對(duì)其中跟本實(shí)驗(yàn)有關(guān)的進(jìn)行簡(jiǎn)單說明
(1)在第三步中,啟用SDK可以看到內(nèi)存映射信息,跟內(nèi)存相關(guān)的一個(gè)是DDR,一個(gè)是Zynq系統(tǒng)內(nèi)部的RAM,內(nèi)存地址如下,根據(jù)標(biāo)題分析,應(yīng)該是Zynq子系統(tǒng)內(nèi)部,對(duì)于CPU來說的地址設(shè)定。
個(gè)人猜測(cè):從上圖可以看出在Zynq內(nèi)部,對(duì)于兩個(gè)CPU Core,同一個(gè)硬核,操作地址是相同的,從而能夠?qū)崿F(xiàn)雙核的數(shù)據(jù)交互。比如ps7_cortexa9_0能夠直接對(duì)0x0010_0000的DDR讀寫數(shù)據(jù),同樣的ps7_cortexa9_1也可以對(duì)該地址的DDR直接讀寫數(shù)據(jù)。同時(shí)這將會(huì)帶來一個(gè)問題就是同步。另外,還有個(gè)問題就是如果是雙核運(yùn)行,每個(gè)核都將有自己獨(dú)立的代碼段和??臻g(這兩個(gè)空間是程序運(yùn)行時(shí)系統(tǒng)使用的,用戶不能強(qiáng)行進(jìn)行讀寫操作),而堆空間是用戶自行申請(qǐng)使用的內(nèi)存空間,通常用來進(jìn)行用戶數(shù)據(jù)存儲(chǔ),也就是說堆空間才是雙core可以公用的。而無(wú)論代碼段、??臻g、堆空間的物理載體都是內(nèi)存(RAM or DDR),因此c語(yǔ)言嵌入式程序?qū)ξ锢韮?nèi)存直接讀寫時(shí),要避免對(duì)代碼段和棧空間的地址進(jìn)行操作。而對(duì)代碼段和??臻g的配置應(yīng)該是在編譯過程中的link階段配置的。具體配置接口如下:
這是配置界面,與傳統(tǒng)ARM開發(fā)對(duì)應(yīng)的配置文件如下所示,相應(yīng)的詳細(xì)原理參考傳統(tǒng)ARM開發(fā)的相關(guān)知識(shí)。
(2)對(duì)Zynq子系統(tǒng)中各個(gè)硬核的初始化配置。
前面分析過,對(duì)于Zynq子系統(tǒng),在不使用CPU Core的架構(gòu)設(shè)計(jì)中,如果僅僅使用HardWare下載,Zynq子系統(tǒng)內(nèi)部的外設(shè)硬核也是不能正常工作的。前面分析認(rèn)為是沒有進(jìn)行初始化配置,在SDK軟件中,打開ps7_init.tcl文件如下圖所示,從名字可以看出,這是一個(gè)初始化的腳本配置文件,既然是tcl文件,應(yīng)該就不需要c語(yǔ)言調(diào)用,而是直接配置,下面截圖可以看出是對(duì)PLL硬核,Clock硬核、DDR硬核控制寄存器的初始化配置。
其中猜測(cè):mask_write 0XF8000008 0x0000FFFF 0x0000DF0D
應(yīng)該表示的是向0xF800_0008地址寫入數(shù)據(jù)0x0000_ffff_0000_df0f(共計(jì)32bits)
在Run時(shí),SDK軟件會(huì)在配置“Run ps7_init”項(xiàng)對(duì)應(yīng)的邏輯狀態(tài)下自動(dòng)調(diào)用該tcl文件完成初始化操作的。
(3)在第四步創(chuàng)建用戶工程(Application Project)時(shí),如果還按照之前的經(jīng)驗(yàn)選擇“Hello World”,將會(huì)顯示如下信息:
提示信息為:目前硬件項(xiàng)目設(shè)計(jì)中沒有Uart外設(shè)硬核,因此該示例不能創(chuàng)建,真丟本實(shí)驗(yàn),僅有Peripheral Tests和Empty Application兩項(xiàng)可以使用。經(jīng)過驗(yàn)證,利用這兩個(gè)模版都可以實(shí)現(xiàn)實(shí)驗(yàn)要求,這里只介紹Empty Application模版
使用Empty Application模版,創(chuàng)建的工程如下所示:
可以看出并沒有任何c語(yǔ)言文件。
在src中創(chuàng)建一個(gè)c語(yǔ)言文件main.c(文件名可以隨便起),其中自行輸入一個(gè)main函數(shù)(必須是這個(gè)函數(shù)名),保存后,SDK會(huì)自動(dòng)編譯,生成一個(gè)debug文件和binaries項(xiàng)。
可以看出,這里main函數(shù)里什么都沒有做。
【補(bǔ)充】對(duì)內(nèi)存分配的進(jìn)一步分析研究
雙擊Binaries下的elf文件,顯示如下信息:
可以看出,編譯完成之后,編譯軟件對(duì)嵌入式程序進(jìn)行的內(nèi)存劃分。而且系統(tǒng)空間大小地址都分配在ddr的低地址區(qū)間,因本實(shí)驗(yàn)測(cè)試時(shí),選用的DDR地址空間應(yīng)以高地址空間為宜。
在詳細(xì)分析elf文件中對(duì)內(nèi)存的劃分,重點(diǎn)看下圖部分。
編譯軟件分析完畢后,得到的??臻g其實(shí)地址為0010_a030,棧空間大小為0000_3800(14K Bytes)。(0010_a030+0000_3800=0010_d830)
c語(yǔ)言嵌入式軟件中,如果不是直接地址操作,本實(shí)驗(yàn)編譯后的軟件使用的數(shù)據(jù)空間為:0010_0000~0010_d830,空間大小為:54.046875K Bytes。
因此,本實(shí)驗(yàn)中對(duì)DDR的內(nèi)存讀寫測(cè)試,測(cè)試的內(nèi)存地址區(qū)間從0020_0000開始為宜。
另外前文分析時(shí)說過,板載DDR為512MB,但是在vivado生成的system.hdf文件中,定義的ps7_ddr_0的內(nèi)存空間范圍只有511MB,少了1MB,當(dāng)時(shí)不知道這1MB時(shí)怎么被貪污的。
【個(gè)人猜測(cè)】但是再看elf文件,可以看到0000_0000開始的空間,是用來進(jìn)行Debug調(diào)試的,因此被Vivado+SDK系統(tǒng)給扣下了,對(duì)用戶不可見。
創(chuàng)建完用戶邏輯后,配置Run As...項(xiàng),用于下載程序。
其中,Run Configurations頁(yè)面前面已經(jīng)見過很多次,這次重點(diǎn)說明的地方已經(jīng)框出:
其中“Reset Processor”僅僅時(shí)重新下載C語(yǔ)言嵌入式程序,download to processor
當(dāng)選中“Reset Entire System”項(xiàng),會(huì)先下載PL端的bit文件,然后再下載C語(yǔ)言嵌入式程序,download to processor。
具體說明如下所示。
選擇reset processor項(xiàng)后,run成功,SDK Log窗口顯示如下信息,可以看出,先執(zhí)行ps_init.tcl腳本,配置PS的硬核,在運(yùn)行ps7_post_config(具體工作內(nèi)容還沒整明白),然后復(fù)位ps7_cortexa9_0(是的c語(yǔ)言程序從main函數(shù)開始運(yùn)行)。
在開發(fā)板上,程序下載成功后,如果按BTN6(PROG),相當(dāng)于Program FPGA這一項(xiàng)需要重做。因此開發(fā)板不再有反應(yīng)。
在開發(fā)板上,程序下載成功后,如果按BTN9(PS-RST),相當(dāng)于zynq子系統(tǒng)復(fù)位,而非CPU(ps7_cortexa9_0)復(fù)位,此時(shí)需要重新執(zhí)行Run ps7_init這一項(xiàng)。因此開發(fā)板不再有反應(yīng)。
【結(jié)果】下載成功后,開發(fā)板反應(yīng)如設(shè)計(jì)所示。實(shí)驗(yàn)結(jié)果表明:
當(dāng)設(shè)置PL端的Master設(shè)備訪問的地址為0x4020_0000(0x4000_0000為32b GP AXI Slave Port的地址?+ 0x0020_0000為DDR內(nèi)的地址)時(shí),下板運(yùn)行結(jié)果表明內(nèi)存讀寫操作是失敗的。
當(dāng)設(shè)置PL端的Master設(shè)備訪問的地址為0x0020_0000(為Zynq子系統(tǒng)內(nèi)CPU對(duì)DDR訪問的地址段)時(shí),下板運(yùn)行結(jié)果表明內(nèi)存讀寫操作是成功的。
【結(jié)論】:
1. 只要SoC系統(tǒng)中,用到了Zynq子系統(tǒng),無(wú)論邏輯上是否激活CPU,都需要使用SDK進(jìn)行下載,原因時(shí)初始化Zynq子系統(tǒng)中硬核。
2. PL端對(duì)Zynq子系統(tǒng)中的寄存器進(jìn)行操作,不需要考慮進(jìn)行二次內(nèi)存封裝,直接使用Zynq內(nèi)設(shè)定的地址即可。即整個(gè)芯片PL+PS是采用統(tǒng)一地址映射的。
編輯:黃飛
?
評(píng)論
查看更多