白光澤,邢 燕
BAI Guang-ze1,XING Yan2
(1.長春職業技術學院,長春 130033;2.長春物業管理學校,長春 130033)
集成電路(IC,Integrated Circuit)作為各種信息設備的核心,它體現一個國家的利技實力、綜合國力及對科學界和社會的影響力,它也是國家的戰略性產業。為了抓住IP設計技術這一提升我國設計水平、發展IC產業不可多得的歷史機遇,信息產業部于2002年成立了集成電路IP核標準工作組,為我國IP核標準的制定及其在業界的推廣等方面做了大量的工作。因此,研究、開發和應用IP核技術,對企業、對國家、乃至對全球的IC產業的發展都有著至關重要的意義。
隨著SOC的規模不斷擴大,集成的IP模塊不斷增多,復雜程度不斷加大,使得片上各個模塊之間的通信問題越來越突出,為了解決這一問題,各大公司都相繼推出了自己的IP核互聯規范。另外,長期以來,外圍設備與主機CPU速度之間的不匹配始終困擾著人們,影響了計算機系統的迅速發展,隨著計算機處理能力及存儲規模的迅速增長,這個問題表現得更加突出。
本文的針對SOC片上系統的SPI接口設計[1],目標是實現適用于SOC設計并且符合SPI通行協議的IP核,讓SOC通過此SPI核可以與外圍設備通信,中間以片上總線Wishbone為接口。設計中,本著片上系統SOC要求的高度集成和低功耗的特點,在設計時將面積和功耗放在了第一位,這意味著在用Verilog HDL編程時,必須在遵循SPI協議、實現基本SPI通信的基礎上,將RTL級邏輯門數盡可能的減少。保留規定的四個外部信號,將SPI主機與從機分開,僅設計SPI_MASTER Core,利用控制寄存器進行狀態控制,省去時鐘極性與相位配置,直接與Wishbone總線連接。其次,圍繞著SPI IP核的設計與實現來討論和研究SOC設計中IP設計的方法。
SPI Master設計是本設計的核心,其主要目標是能實現Wishbone Master對SPI Maste的初始化,配置SPI Master的控制寄存器,以實現對SPI各傳輸模式的控制,及其雙向數據通信。其次,是實現SPI Master與SPI Slave之間的數據雙向通信,從而實現SOC與外界的數據通信。在設計程序時,采用了top-down至上而下的設計流程,那么首先做的是對所要設計的SPI IP核做總體的規劃,建立架構,對系統進行層次劃分。
根據前面對Wishbone總線的介紹,在本設計中spi_master模塊內Wishbone接口就是初wishbone slave接口。按照Wishbone協議,端口定義如下表1所示:

表1 Wishbone slave接口信號表
該模塊是宏定義模塊,主要規定了分頻值由訪divider,允許一次最大傳輸字節SPI_MAX_CH,從機擴展數SPI_SS_NB以及各寄存器的相關數據。這里采用了define來定義,主要一個特點就是這些宏定義中的參數都是全局的,并不局限在某個module范圍之內,這樣可以便于對所設計的IP核的參數做修改,從而提高IP核的通用性和可移植性。
由前面的設計思路可知,該模塊要完成與wishbone_master的連接,實分頻和串并轉換。按照設計目標,可將spi_master劃分成如下的功能塊和模塊:
(1)地址解碼;
(2)讀寄存器,并行輸出至wishbone
(3)寫寄存器,由wishbone并行輸入對曲divider, control和 slave slect寄存器初始化;
(4)實現分頻,spi_clgen子模塊;
(5)實現串并轉換,spi_shift子模塊。
spi_slave用于完成數據串行輸入輸出,其時鐘信號是spi_clgen產生的sclk,與spi_shift時鐘同步。注意的是,spi_slave均是從其數據寄存器最高位串行輸出miso,從最低位串行輸入miso,且傳輸和接收的時鐘邊沿與spi_shift相同。
該模塊在本設計中只是作為SOC端,來模擬SOC對spi_master讀寫數據,其中只是簡單地運用任務(task)寫了一個讀任務、一個寫任務和一個數據比較任務。
仿真與驗證是IP核設計中非常重要的一部分,因為它直接關系著IP的可用性??紤]到設計的SPI的門數和速度上的要求比較低,以及實際資金等清況,在仿真時,本文采用軟件仿真[4,5]的方式。為突出典型性和正確性,所以spi_master只選擇了與一個spi_slave連接進行通信,在不同的傳輸要求下,分別檢測lbit,8bit,16bit,32bit,64bit和128bit數據傳輸,測試的基本步驟為:首先是調用Wb_master模塊中的寫任務對各個相關寄存器進行初始化,完成傳輸之前的準備工作,結束之后,會顯示在某時刻programmed register;之后,是調用數據比較任務,對寫入寄存器的數據進行驗證,確認之前寫寄存器操作的正確性,完成之后會顯示在某系統時刻 verified register;接著是進行不同位數、不同順序的傳輸:最后對比傳輸之后的數據與期望的數據,從而驗證傳輸的正確性,如果傳輸正確則顯示 transfer completed ok,否則,顯示錯誤。
另外,在spi_defines模塊中,本文測試時設置了最大傳輸數據長度為128bit,先對 spi_master進行初始化,然后對各寄存器寫入數據,第一次是8bits的傳輸,spi_master tx0中并行數據為32'h5a,spi_slave數據寄存器內為32'ha5967e5a,首先傳高位,上升沿傳輸,下降沿采集,按照spi_shift模塊中tx寄存器的傳輸規則,傳輸完成之后spi_slave.data=32'h967e5a5a以tx0=32'ha5;第二次與第一次一樣是8bits的傳輸,tx0=32'ha5,只是換成在下降沿傳輸,上升沿采集,傳輸完成之后spi_slave.data=32'h7e5a5aa5以及tx0=32'h96;第三次是16bits的傳輸,首先傳低有效位(lsb first),tx0=32'h5aa5,此時spi_slave.data=32'h7e5a5aa5,由于是lsb first,按照tx的傳輸規則,32'h5aa5的lsb先傳輸,則變為32'ha55a從spi_slave.data的最低位經mosi串行輸入,同時spi_slave.data[31:16]=16'h7e5a,由最高位開始經miso并行輸入tx,從tx的最低位開始鎖存,16'h7e5a變為16'ha57e,所以傳輸完成后spi_slave.data[15:0]=16'ha55a以及tx0=32'h5a7e;同理,測試程序對64bit,128bit,32bit,1bit進行了檢測,以及在ie和ass賦值的情況下。最后在linux環境下的EDA平臺上,用Ncverilog進行仿真,最終得到了較滿意的仿真結果,仿真結果如圖2,所有仿真模式全部通過。

圖2 SPI IP 核的仿真結果
[1] L.Bacciarelli.G.Lucia.Design,testing and prototyping of a software programmable I2C/SPI IP on AMBA bus.Research in Microelectronic and Electronic.2006: 373-376.
[2] 牛風舉.劉元成.朱明程.基于IP復用的數字IC設計技術.電子工業出版社,2003.
[3] 李寬余.戴瑜興.張義兵.基于可編程邏輯器件的串行外設接口設計及實現.低壓器件,2004(11):28-30.
[4] Cadence Design Systems Inc.Verilog-XL Reference [C].Cadence, 2003.
[5] 陳獻文.HDL Debugging with Debussy [M].2004.