石 敏 莫錦輝 易清明
暨南大學信息科學與技術學院, 廣州 510632
隨著芯片集成度越來越高,基于知識產權(Intellectual Property,IP)進行片上系統(System on Chip,SoC)芯片設計的能力和技術得到了迅速提高。有關IP核復用的SoC設計方法學已成為解決設計成本高、開發周期長以及功能復雜等問題的有效手段[1]。在IP核復用過程中,SoC系統需要片上總線實現各個IP核之間的互聯。不同的總線技術會對系統的傳輸效率造成差異,從而影響系統的整體性能。目前市面上仍然有許多串行外設接口(Serial Peripheral Interface,SPI)和通用異步收發傳輸器(Universal Asynchronous Receiver /Transmitter,UART)用于串行通信總線,因其低速傳輸的局限造成SoC系統傳輸效率低和CPU指令執行效率低的問題[2]。AXI4(Advanced eXtensible Interface)總線作為ARM公司于2010年推出的一種最新總線規范,因其高效的傳輸效率和可靠性能,廣泛應用在工程上。本文在研究AXI4最新協議的基礎上,通過擴展ARMv4自定義指令和提出支持全雙工通信的AXI4協議轉換接口,實現一個由主機CPU、AXI4總線和從機SPI、UART組成的互聯模型。
目前絕大多數的AXI4總線互聯模型[3-5]采用APB轉換橋實現總線與外設的互聯,但由于APB 協議的局限,兩者之間不能同時進行讀和寫操作;它也沒有指出主機與總線之間具體的互聯方式。本文設計的互聯模型采用支持AXI4協議的從機接口,實現了總線與從機之間的全雙工通信,具有較高的傳輸效率。另外,提供了主機與總線互聯的具體方案,具有較強的實用性。
如圖1互聯模型所示,CPU分別通過AXI4總線與UART和SPI互聯。AXI4總線模塊內部分為主機接口、AXI4接口、中繼模塊和從機接口。下面分別介紹CPU與AXI4總線互聯和AXI4總線與SPI、UART互聯。

圖1 支持AXI4總線協議的IP核互聯模型
1.1.1 AXI4總線概述
ARM公司推出的AXI4總線標準可以滿足目前SoC系統對總線帶寬和通訊復雜度等要求,它已成為業界片上總線的首選及學術界的研究熱點[6-11]。AXI4總線包含讀地址、讀數據、寫地址、寫數據和寫響應5個獨立通道。采用獨立傳輸通道可以避免信號阻塞和錯誤冗余,且允許讀和寫傳輸同時進行,提高了讀寫效率。AXI4總線增強了猝發模式的支持和多個設備互聯的利用率,為保證數據傳輸的效率提出亂序操作,對于不同的訪問可以亂序進行(如圖2所示),使用 ID標記訪問的歸屬。

圖2 AXI4總線亂序操作示意圖
1.1.2 AXI4主機接口
SoC系統內部的各個IP核之間必須都要具備時序要求一致的接口才能實現互聯。如果時序要求不一致,需要在原來的IP上擴展轉換接口。CPU與AXI4總線需要通過主機接口(圖3所示)才能實現互聯。主機接口的作用是將CPU產生的地址、數據和控制信號進行協議轉換,并按照一定的時序邏輯提供給AXI4總線。

圖3 主機接口
如圖4和5主機操作時序圖所示,主機先提供一次地址/控制信息(addr/length,type,rd_req,wr_req)給AXI4總線發起讀寫操作請求。在從機回應rd_addack /wr_addrack,主機發起的讀/寫操作分別通過獨立的通道進行數據傳輸,主機最后根據rd_cmplt/wr_cmplt信號確認傳輸完成。當主機在發送讀地址ADDR1后立即發送下一個讀地址ADDR2,AXI4總線就存在兩個待被讀傳輸,即交疊傳輸。交疊傳輸能支持該流水傳輸,可以減少傳輸延遲,提高數據傳輸效率。

圖4 AXI4主機接口讀操作時序圖

圖5 AXI4主機接口寫操作時序圖
1.1.3 支持AXI4主機接口的CPU設計
互聯模型的嵌入式CPU支持ARMv4指令集,具有體積小、功耗低及執行效率高等優點。如圖6所示,CPU按照功能劃分為3個主要模塊:控制模塊、數據通路模塊和運算器模塊[12]。

圖6 CPU內核結構
控制模塊負責對指令進行譯碼操作,分析出當前指令所要實現的功能,并將指令執行操作涉及的相關寄存器和存儲器選擇信號發送給數據通路模塊。數據通路模塊產生數據通路信號對指定的寄存器或存儲器進行讀寫操作,同時配合運算模塊的數據運算操作,對寄存器進行回寫操作,從而完成指令的執行功能。
CPU內核能夠實現5大類指令功能:分別是數據處理指令、乘法指令、跳轉指令、加載/存儲指令和傳輸指令。一條典型的32位ARM指令編碼格式如圖7所示。


如表1所示,本文擴展3條ARMv4自定義指令用于實現CPU與AXI4之間的數據傳輸。MRB指令用于CPU讀取AXI4總線的數據,實現將主機接口的數據讀取到CPU寄存器堆的功能;MBR指令用于CPU對AXI4總線寫數據,實現將CPU寄存器堆的內容寫到主機接口的功能。MBI指令用于設置AXI4總線猝發的地址、長度和類型,實現將立即數直接寫到主機接口的功能。
表1擴展的ARMv4自定義指令

AXI4總線的中繼模塊將AXI4接口通過路由的方式拓展為2個AXI4接口,它通過尋址的方式選擇與SPI、UART中的1個進行通信。
1.2.1 AXI4從機轉接口
如圖8所示,從機接口的作用是實現AXI4總線與SPI、UART之間的地址、數據和控制信號的轉換。

圖8 從機接口
從機接口AXI4總線對外圍設備的讀和寫操作時序圖與主機接口CPU對AXI4的讀和寫操作時序相似。
1.2.2 AXI4從機接口的SPI設計
SPI是一種同步串行接口,可以同時驅動串行數據的發送和接收[12]。它有SCK同步串行時鐘線,SDI串行數據輸入線,SDO 串行數據輸出線,和SS從器件選擇線。可以通過對時鐘極性和時鐘相位的配置來選擇SPI四種傳輸模式的一種。
SPI具有接口少、時序簡單及功能強大等優點。但它缺點也比較明顯:沒有傳輸需求和應答機制,不能夠很好地確定數據收發是否正確。本文設計的支持AXI4從機接口的SPI(如圖9所示)可以解決這些問題,并且實現了高速總線與低速設備的兼容。

圖9 支持AXI4從機接口的SPI結構圖
它主要包含以下幾個模塊:收發控制模塊、時鐘模塊、接收FIFO、發送FIFO和總線接口控制模塊。收發控制模塊的功能是時刻檢測發送FIFO和接收FIFO中數據的存儲狀態,控制數據的發送和接收。接收FIFO用于存儲SPI接口收到的數據,而發送FIFO用于存儲SPI接口要發送出去的數據,兩者都會同時向收發控制模塊和總線接口控制模塊發送FIFO存儲信息。總線接口控制模塊的功能是實現AXI4總線與SPI的讀寫操作:當AXI4總線要對外發送數據時,總線接口控制模塊會向發送FIFO發送寫信號,并將數據寫入到發送FIFO中,然后等待SPI將FIFO中的數據發送出去;當AXI4總線要接收數據時,總線接口控制模塊會向接收FIFO發送讀信號,并讀出FIFO中的數據。
1.2.3 支持AXI4從機接口的UART設計
UART 是一種異步通信接口,支持串行鏈路上的全雙工通信[13]。 通信的發送方和接收方各自有獨立的時鐘,傳輸的速率由雙方約定。它的作用是將接收到的串行數據轉換為并行數據或者將并行數據轉換為串行數據發送。
UART有2根信號線:發送信號txd和接收信號rxd。通常情況下,一幀數據包括起始位、數據位、奇偶校驗位和停止位。UART的數據傳輸格式以低電平作為起始位,可傳輸從低位到高位順序排列的8 比特數據,1 比特奇偶校驗位,最后以高電平作為停止位。
由于UART采用串行通信,一幀只能傳輸8比特有效數據,傳送效率非常低。本文設計支持AXI4從機接口的UART能夠利用AXI4總線的優勢減少傳輸延遲,實現CPU與UART之間快速的數據傳輸。
如圖10所示,UART可分為發送單元、接收單元、波特率產生器和總線接口控制模塊。

圖10 支持AXI4從機接口的UART的結構圖
UART的發送單元由發送模塊、發送控制模塊及發送FIFO組成。發送模塊的主要功能是接收來自FIFO的有效數據信號,將并行數據轉換為串行數據,并添加起始位、奇偶校驗位和停止位后通過發送端口按位發送出去。發送控制模塊的作用是檢測FIFO中數據的存儲狀態,控制發送模塊對FIFO的讀操作。同樣,UART的接收單元由接收模塊、接收控制模塊以及接收FIFO組成。接收模塊的主要功能是檢測接收信號線上的數據是否有效,并將接收到的串行有效數據轉換為并行數據寫入到FIFO。接收控制模塊的作用是根據FIFO的存儲情況來控制接收模塊對FIFO的寫操作。UART總線接口控制模塊的功能是實現AXI4總線與SPI的讀寫操作。
編寫CPU測試指令(表2所示),并用Modelsim -Altera 10.1a對整個互聯模型進行仿真驗證,通過判斷主機CPU、AXI4總線和從機SPI、UART之間的數據傳輸與指令測試內容的預期值是否一致,驗證模型的正確性。Modelsim需要提供激勵源,其中包括對SPI的MISO輸入端提供數據35h、69h、92h和UART的rxt輸入端提供數據8fh、89h和b3h。
表2ROM存儲的測試指令

指令測試主要內容是:CPU申請地址為00000400h,長度為3的寫猝發,并依次將R0、R5和R3上的數據發給AXI4總線;CPU申請對地址為00000400h,長度為3的讀猝發操作,并將讀數據存放在R3;CPU申請地址為00000000h,長度為3的寫猝發,并依次將R2、R6、和R7上的數據發給AXI4總線;將R0~R5上數據批量加載到以地址0x40000020為開始的RAM;CPU申請地址為00000000h,長度為3的讀猝發操作,并將讀數據存放在R2上。
圖11和12分別是CPU發起讀寫操作時主機接口和從機接口的時序圖,從中可以觀察到兩者均有與測試指令相對應的傳輸數據。
從圖13模型的系統仿真圖可以看到:CPU執行數據處理和存儲加載指令后,R0~R7的數據分別為00000037、00000045、000000ef、0000007c、0000406b、00000ed3、40000020和00000406,均與預算值相符;CPU執行完所有指令后,R2上的數據依次出現00000035、00000069和00000092,R3上的數據依次出現0000008f、00000089和000000b3,并且以上6個數據以交叉的形式出現,表明CPU能充分利用AXI4總線亂序傳輸、交疊傳輸的機制,同時讀取了SPI和UART數據,并且所讀數據與Modelsim提供的數據一致;UART的txd信號輸出00000037、00000ed3和0000007c,SPI的MOSI信號輸出000000ef、40000020和0000406b,表明UART、SPI能正確接收CPU發出的數據。

圖11 主機接口仿真圖
從MOSI、MISO、txd和rxd的波形可以看出,CPU可同時與SPI、UART進行全雙工通信。另外,當CPU與SPI、UART傳輸數據時,CPU已經提前執行耗時較多的批量加載指令E8A6003F,這說明CPU高速的指令執行與系統低速的數據傳輸是相互獨立的。由仿真圖測得:CPU執行所有的測試指令需要36個時鐘周期,SPI數據傳輸需要60個時鐘周期,UART數據傳輸需要192個時鐘周期。CPU可以充分利用系統數據傳輸延遲的156個時鐘周期去處理系統的其它事務,具有很高的指令執行效率。

圖12 從機接口的仿真圖

圖13 模型系統功能仿真圖

圖14 自定義SPI讀寫時序圖
文獻[2]模型采用的是幀長固定為32個比特的自定義SPI串行總線讀寫時序(圖14所示),需要主機先提供控制和地址字段,才能傳輸一個16比特的數據,即總線數據傳輸利用率僅僅為50%。文獻[3]模型采用APB轉換橋實現AXI4總線與SPI的互聯,但兩者之間不能同時進行讀和寫操。將本文模型與文獻[2]和[3]涉及的模型在傳輸性能上做比較。在CPU時鐘頻率為100MHz,AXI4總線和SPI的時鐘頻率都為25MHz的條件下 ,CPU對SPI先后發起100個字節數據的讀和寫操作,其結果如表3所示。

表3 不同模型的傳輸性能比較
從表3中可以看出,本文設計的互聯模型相較于文獻[2]的帶寬提高127倍,傳輸時間減少97.2%;比文獻[2]的帶寬提高33.3%,傳輸時間減少56.1%,說明本文互聯模型的帶寬和傳輸速率都得到了很好的優化和提升。
在研究ARM公司最新的AXI4協議基礎上,通過擴展ARMv4自定義指令和提出一種基于AXI4總線協議的轉換接口,設計并實現了一種支持多個從機同時全雙工通信的IP核互聯模型。該模型能夠克服市面上大多數SoC主機與多個從機進行通信、需要長時間排隊等待和讀寫操作不能同時進行的問題,具有廣泛的應用前景和市場需求。仿真及實驗結果表明,該模型能夠大幅度地提高數據傳輸效率并且CPU具備較高的指令執行效率。