Local Bus總線又稱為CPU總線,根據(jù)高低位地址線序的差異,又可分為Motorola CPU總線和Intel CPU總線。 古老的CS51單片機(jī)就是Intel CPU總線的典型代表,而我們常用的Power PC就是Motorola CPU總線架構(gòu),它是從60X總線衍變過來的(60X總線支持64、32、16、8四種可選位寬模式)。 本文以一款Power PC CPU通過Local Bus讀寫FPGA內(nèi)部寄存器或RAM以及中斷響應(yīng)為例,為大家介紹開發(fā)過程中的注意事項。
記得在HINOC1.0的時候,F(xiàn)PGA樣機(jī)上采用Intel XScale PXA270(ARM CPU)芯片與FPGA芯片互連,采用的接口時序就是Local Bus總線的時序,該時序與CPU與外掛異步SRAM接口時序一樣,這樣HINOC芯片就可以看做是ARM CPU的一個外設(shè),可以分配可配置的寄存器或RAM等訪問空間。 具體時序圖如下圖所示,總線包括地址、片選、讀/寫信號,下圖是簡單的讀時序。 注意,所謂異步,就是CPU接口總線與FPGA相應(yīng)接口是不同步的,也就是CPU送給FPGA的信號中不包括時鐘信號,F(xiàn)PGA需要通過自己內(nèi)部的時鐘信號去采CPU接口的地址、數(shù)據(jù)等信號,同步后才能使用。 如下圖中的CPU讀FPGA時序,CPU給出度地址和讀控制信號后,等待tAA時間后才能從數(shù)據(jù)總線上取到正確的有效的數(shù)據(jù),這個tAA時間長短是可以通過設(shè)置PXA270中的寄存器來進(jìn)行調(diào)整的。
印象比較深刻的是,上面時序圖在FPGA側(cè)觀察時,就能感受到CPU的效率是如何之慢了,CPU完成一次讀寫FPGA內(nèi)部寄存器的操作,對應(yīng)的FPGA常常已經(jīng)過了幾十個時鐘周期,所以效率較低,好在一些改進(jìn)的SoC總線如AXI等還有Burst等類似于DMA之類的連續(xù)讀寫操作模式。
在搭建仿真環(huán)境時,上圖中的CPU行為就可以簡化為簡單的讀、寫兩個task(如下圖)。 在FPGA側(cè)的電路設(shè)計代碼,則把CPU送過來的信號采用打兩拍等方式同步后進(jìn)行地址譯碼等再交給后續(xù)的模塊使用。
目前,這種總線使用的已經(jīng)比較少了。 但在很多專用領(lǐng)域,如航空航天等領(lǐng)域,一些國產(chǎn)的CPU等仍然使用類似的總線時序。 簡單、可靠,穩(wěn)定。
調(diào)試環(huán)境介紹
硬件開發(fā)板:AX7103; CPU開發(fā)板:p2020; 驅(qū)動操作系統(tǒng):Vxworks。
vxworks操作系統(tǒng)下CPU和FPGA的硬件連接關(guān)系如下圖1所示,采用Local Bus總線接口。
圖1 CPU和FPGA的硬件連接
硬件側(cè)沒有開發(fā)板與p2020 Local Bus的50pins直接相對接,而驅(qū)動側(cè)需要開發(fā)、測試Local Bus驅(qū)動,因此需要創(chuàng)造調(diào)試環(huán)境,利用AX7103開發(fā)板的68個引腳,將Local Bus總線相關(guān)的關(guān)鍵引腳(37pins=16pins_addr+16pins_data+3pins_csn+1pin_oen+1pin_ wen)以及中斷信號定義到EX_IO1和EX_IO2上,再根據(jù)p2020原理圖與接插件J5、J4相匹配,調(diào)試環(huán)境如下圖2所示(略丑,只做原型功能驗證)。 圖示J5為p2020接插件(Local Bus總線相關(guān)信號); J4為p2020接插件(硬線中斷、GND信號); EX_IO1為Local Bus總線地址、片選和讀寫使能管腳; EX_IO2為數(shù)據(jù)、中斷管腳。
注意:兩塊開發(fā)板的電平標(biāo)準(zhǔn)要一致,否則不能通過杜邦線直連,另外建議兩塊開發(fā)板杜邦線共地相連。
圖2 硬件板和CPU板實際調(diào)試環(huán)境
概述
前面介紹過FPGA與CPU進(jìn)行數(shù)據(jù)交互時使用的接口是PCIe接口等接口,在TSN或TTE系統(tǒng)里,PCIe接口常常用在端節(jié)點(diǎn)上,Local Bus接口常用于交換機(jī)內(nèi)CPU與FPGA進(jìn)行數(shù)據(jù)交互的接口。 本文只講述Local Bus調(diào)試歷程。 對于硬件側(cè)來說,Local Bus相比于PCI、PCIe開發(fā)簡單些,只需要完成CPU內(nèi)存地址與硬件寄存器、RAM地址的映射,讀/寫使能信號和片選信號的時序,此次Local Bus開發(fā)是硬件側(cè)建立一個Local Bus測試工程配合Local Bus驅(qū)動調(diào)試寄存器讀寫功能以及中斷功能。
2.1.數(shù)據(jù)讀寫操作
關(guān)于寄存器讀寫功能。 Local Bus的簡介網(wǎng)上有參考價值的就是這個鏈接:https://wenku.baidu.com/view/aeca83593b3567ec102d8a80.html?from=search, 因為局部總線簡單,也沒有什么可介紹的,理論部分就見鏈接,我這里就附上關(guān)鍵信號的讀寫時序圖,如下圖3,圖4所示。 同樣的Local Bus接口在不同的CPU處理器地址和數(shù)據(jù)位寬不一致,信號也會有一些不一致,比如:BM3803處理器中地址數(shù)據(jù)線未復(fù)用,數(shù)據(jù)位寬32bit(雙字操作); p2020處理器中數(shù)據(jù)線LAD復(fù)用(通過LALE信號鎖存高11bit的地址,如果只用16bit的地址時可以不接LALE),數(shù)據(jù)位寬16bit(雙字節(jié)操作)。
2.2.中斷功能
中斷的話采用傳統(tǒng)的硬線中斷,p2020原理圖可知,除了irq3已經(jīng)被占用,另外6個硬線中斷(irq0/1/2/4/5/6)可供外設(shè)使用,且均在J4接插件位置處。 由p2020的Datasheet可以知道p2020內(nèi)部中斷有64類,外部中斷有12類,而我們調(diào)試使用的是外部中斷中的irq1。
調(diào)試歷程
3.1.數(shù)據(jù)讀寫操作
調(diào)試伊始,通過p2020的原理圖可以看出CS0和CS1分別給了內(nèi)部的nand_flash以及nor_flash使用,另外輸出3位的片選信號(CS2,CS3和CS4),說明最多可以掛8片局部總線外設(shè),,這些外設(shè)(含*_flash)共用數(shù)據(jù)線、地址線以及讀寫使能。 第一步就得先知道驅(qū)動使用了哪個片選信號,驅(qū)動也是摸索,驅(qū)動代碼寫著只使用了CS4,屏蔽了原來例程中的CS2,通過硬件側(cè)抓cpu_csn[2:0]發(fā)現(xiàn),cpu_csn[0]也會存在低片選狀態(tài),后經(jīng)驅(qū)動修改,先保留使用CS2,這樣驅(qū)動每次讀寫操作時都能觸發(fā)“cpu_csn[2:0]==3’b110”。 CPU板將對地址區(qū)間0xf1000_0000~0xf1000_ffff(128KB)進(jìn)行讀寫操作時會拉低CS2,映射到硬件側(cè)就是對寄存器/RAM的讀寫了。
測試寫功能,在CPU啟動后,驅(qū)動會給內(nèi)存地址0xf100_0118處寫16‘h5555,如下圖5所示,先給出寫地址,然后拉低片選信號,幾乎同時拉低了寫使能信號,這樣數(shù)據(jù)就從CPU寫入到FPGA了。
圖5 板級寫操作
與寫操作的簡單相比,問題都出在了讀操作,我們也同樣地將AX7103和p2020的讀使能線接好(地址、數(shù)據(jù)和片選信號先接好了),發(fā)現(xiàn)此時CPU不能啟動了,但是將此信號接到未使用的EX_IO上時CPU可以正常啟動,說明讀使能信號干擾了CPU的啟動,可是,cpu_oen和cpu_wen屬性是一樣的,input到FPGA內(nèi)部, 不存在輸出到CPU導(dǎo)致不能啟動,,,查看p2020的datasheet發(fā)現(xiàn)p2020上的LGPL2信號有兩重定義:
1、Local Bus的讀使能cpu_oen;
2、配合LBCTL、LALE信號配置e500核pll時鐘占空比。
懷疑是系統(tǒng)啟動后短時間內(nèi)FPGA側(cè)的cpu_oen電平影響到CPU側(cè)的LGPL2,為此,我們將讀使能改為inout信號,在CPU啟動后的10s內(nèi)為高阻態(tài),起著隔離作用,而10s后p2020的bootrom也加載差不多可以bootup了,然而實際測試下來的結(jié)果是CPU依舊不能正常啟動。
我們把所有的杜邦線完全拔掉,只保留讀使能線的連接,發(fā)現(xiàn)CPU可以正常啟動,此時說明FPGA側(cè)的讀使能電平并沒有影響到CPU側(cè)的啟動,為了具體定位到哪一個信號,我們再次基礎(chǔ)上,把線一點(diǎn)一點(diǎn)接上去,最后接完了讀使能線、寫使能線,片選線以及地址線后,CPU板可以正常bootup而且FPGA能抓到正常的讀寫(只是看不到讀寫數(shù)據(jù))時序, 插上了數(shù)據(jù)線后發(fā)現(xiàn)CPU就不能啟動了,至此,總算定位到問題出在哪了,為此,F(xiàn)PGA側(cè)第一次修改,做簡單的延遲處理,數(shù)據(jù)線一直處于20s的高阻態(tài)(此時CPU可以進(jìn)行Local Bus寫操作),等到bootup后,才使能數(shù)據(jù)的讀出,這樣處理其實很笨拙,但是確實能解決CPU不能正常啟動的問題,可治標(biāo)不治本/允悲/,畢竟刻意的延遲不靠譜。
/**第一次修改/
//rst_done只有20s后才為1,在此之前cpu_data處于高阻
分配cpu_data =((cpu_oen==1'b0)&&(rst_done==1'b1)) ?cpu_rdata : 16'bz;
分配cpu_wdata = cpu_data ;
/*******************************/
靈感一現(xiàn)。。。 FPGA側(cè)在“assign cpu_data =(cpu_oen==1'b0) ? cpu_rdata : 16'bz; ”只是多加了一條約束條件“(rst_done==1'b1)”就能讓CPU啟動,說明在CPU啟動之初,cpu_oen滿足低使能導(dǎo)致cpu_data有輸出干擾到CPU側(cè)的數(shù)據(jù)線,,,本文之初提及p2020內(nèi)部還有nand_flash和nor_flash,在p2020啟動的時候要從這些flash里讀寫數(shù)據(jù),也拉低了cpu_oen ,此時Local Bus讀出的是默認(rèn)值16’h0,而本應(yīng)該從*_flash里讀出一些有用的值被16’h0覆蓋。 為了驗證這種猜想,我將數(shù)據(jù)信號的代碼做第二次修改。
/**第二次修改/
//CPU只有片選CS_4了localbus后FPGA才會將cpu_rdata輸出,否則高阻.
assign cpu_data =((cpu_oen==1'b0)&&(cpu_csn[2]==1'b0)) ?cpu_rdata : 16'bz;
分配cpu_wdata = cpu_data ;
/*******************************/
這樣修改后CPU正常啟動,因為p2020啟動之初,會讀*_flash,雖然拉低了cpu_oen,但是選通并非CS2,故此時FPGA的cpu_data保持高阻,直到片選成功且讀使能低有效才將讀數(shù)據(jù)輸出。 最終調(diào)試正確的板級讀操作時序如下圖6所示。
圖6 板級讀操作
3.2.硬中斷
p2020處理器的中斷分為外部中斷和內(nèi)部中斷,我們使用的是外部中斷1。 在Vxworks下,處理器外部中斷向量從0開始編號,故分配給外部中斷1的中斷向量為1。 首先,在BSP中將中斷向量與設(shè)備綁定,并注冊到hcfDevice設(shè)備列表中; 然后,在驅(qū)動中初始化并使能中斷,即可收到來自外部中斷1引腳的中斷信號。
需要注意的是,下圖7是p2020datasheet關(guān)于中斷irq的描述:為高時置中斷,為低時不產(chǎn)生中斷,然而實際板級測試發(fā)現(xiàn),irq為低時有效,產(chǎn)生硬線中斷。
圖7 p2020中斷irq描述
當(dāng)驅(qū)動收到中斷后,需要對硬線中斷進(jìn)行復(fù)位,參考PCIe總線中INTa中斷操作(干貨! 實測VxWorks響應(yīng)PCIe中斷的最小時間間隔),我們定義0x110寄存器為中斷寄存器,驅(qū)動往0x110第[15]位寫1再寫0時硬件將硬線中斷信號重新拉回高電平復(fù)位狀態(tài),中斷時序如下圖8所示。
圖8 中斷時序
審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1629文章
21729瀏覽量
602986 -
cpu
+關(guān)注
關(guān)注
68文章
10854瀏覽量
211578 -
接口
+關(guān)注
關(guān)注
33文章
8575瀏覽量
151015 -
總線
+關(guān)注
關(guān)注
10文章
2878瀏覽量
88051 -
locale
+關(guān)注
關(guān)注
0文章
11瀏覽量
1173
原文標(biāo)題:FPGA與嵌入式CPU的Local Bus接口調(diào)試
文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論