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