曹磊 李曉江 馬成炎
(1.中國科學院微電子研究所,北京 100029;2.杭州中科微電子有限公司,杭州 310053;3.嘉興聯(lián)星微電子有限公司,嘉興 314000;)
隨著SOC的規(guī)模不斷擴大,集成的IP模塊不斷增多,設(shè)計一款可復用的IP核對于減少設(shè)計復雜度、縮短SOC開發(fā)周期、提高流片成功率都是重要的一環(huán)。SPI(Serial Peripheral Interface)串行通信總線具有配置靈活,結(jié)構(gòu)簡單等優(yōu)點,被廣泛應(yīng)用于各位處理器和嵌入式系統(tǒng)當中。因此,對于SPI IP核的設(shè)計已經(jīng)成為業(yè)界的設(shè)計熱點之一,但現(xiàn)有設(shè)計功能還不夠完善。文獻[1]設(shè)計了SPI Master模塊,不具有SPI Slave功能;文獻[2]設(shè)計了一款基于FPGA的SPI總線,但是不支持四線工作模式,并且對設(shè)計本身的結(jié)構(gòu)和特性敘述不多;文獻[3]的設(shè)計實現(xiàn)了多功能化的SPI IP核,但是不支持DMA功能,所設(shè)計的SPI Master也沒作流水考慮,數(shù)據(jù)傳輸率受到限制。本文總結(jié)上述設(shè)計中存在的問題,提出了一種基于APB總線的高速可復用的SPI IP核實現(xiàn)方法,使所設(shè)計的SPI接口具有更高的實際可操作性,并且已經(jīng)在流片回來的芯片上得到了驗證。
SPI是由Motorola公司首先在其MC68HCXX系列處理器上定義的一種高速的、全雙工的、同步的通信總線,通常只占用四根芯片管腳,分別為MOSI:串行數(shù)據(jù)輸出線,當SPI模塊為主模塊時,它輸出數(shù)據(jù);當SPI模塊為從模塊時,它接收數(shù)據(jù);MISO:串行數(shù)據(jù)輸入線,當SPI模塊為主模塊時,它接收數(shù)據(jù);當SPI模塊為從模塊時,它輸出數(shù)據(jù);SCK:同步串行時鐘,由SPI主模塊產(chǎn)生;nCS:從機片選線,低電平有效,由主模塊產(chǎn)生。協(xié)議規(guī)定了SPI的主、從兩種工作模式,工作在主模式的SPI模塊負責產(chǎn)生串行時鐘SCK和對從模塊的片選信號。

圖1 SPI外設(shè)接口的四種數(shù)據(jù)傳輸時序
SPI模塊為了和外設(shè)進行數(shù)據(jù)交換,根據(jù)外設(shè)的工作要求,其輸出串行同步時鐘SCK的極性CPOL和相位CPHA可以進行配置,因此SPI有四種傳輸時序,其共同特點是每位數(shù)據(jù)的發(fā)送/接收需要一個SCK周期,每次傳輸整數(shù)倍個8位數(shù)據(jù)。當CPOL=0時,串行時鐘的空閑狀態(tài)為低電平;當CPOL=1時,串行同步時鐘的空閑狀態(tài)位高電平。而時鐘相位CPHA則決定了數(shù)據(jù)采樣的數(shù)據(jù)沿,當CPHA=1時,在串行同步時鐘的第二個跳變沿數(shù)據(jù)被采樣;當CPHA=0時,在串行同步時鐘的第一個跳變沿數(shù)據(jù)被采樣。SPI模塊的四種
接口時序如圖1所示。
該IP核應(yīng)用于國家導航基帶項目,基于APB總線進行設(shè)計。CPU或者DMA模塊可通過APB總線完成對該SPI模塊的寄存器配置、數(shù)據(jù)讀寫及中斷處理等操作。所設(shè)計的SPI電路主要包括:SPI控制寄存器SPCR、數(shù)據(jù)發(fā)送模塊TRANSMITTER、數(shù)據(jù)接收模塊RECEIVER、發(fā)送/接收同步FIFO、狀態(tài)寄存器SPSR。其總體結(jié)構(gòu)圖如圖2所示。

圖2 SPI IP核系統(tǒng)結(jié)構(gòu)
如圖2所示,所設(shè)計的SPI IP核實現(xiàn)了傳統(tǒng)SPI協(xié)議的四線結(jié)構(gòu)。同時滿足SPI的四種接口時序,通過控制寄存器的CPOL和CPHA位來控制。增加了兩個8位深度、32位寬度的同步可選FIFO,用以提高傳輸速率。每次發(fā)送/接收的比特數(shù)可在8bits、16bits、32bits選擇,并且首尾比特位的發(fā)送/接收順序也可選??紤]到部分應(yīng)用中可能需要三線結(jié)構(gòu)的SPI核進行半雙工工作,本設(shè)計可只使用SDI數(shù)據(jù)線作三線工作方式。
本次設(shè)計主要采用自頂向下的設(shè)計方法,首先完成設(shè)計說明文檔,劃分好各子模塊和系統(tǒng)架構(gòu),再進行Verilog代碼的編寫,主要實現(xiàn)的功能和設(shè)計中部分問題的解決方法如下。
2.2.1 存儲器模塊
所設(shè)計的SPI核主要包括一個32位的控制寄存器,實現(xiàn)Master/Slave功能的切換、中斷模式/DMA模式的切換等功能的控制;一個32位的狀態(tài)寄存器,記錄發(fā)送/接收中斷、同步FIFO空滿標志等狀態(tài);兩個8X32的同步FIFO,可選擇是否使用。
2.2.2 時鐘分頻模塊
當SPI被用作Master時,將會根據(jù)控制寄存器SPI_DIV位所設(shè)置的分頻數(shù)值來對APB總線時鐘進行分頻,用以產(chǎn)生所需要的同步串行時鐘SCK。本設(shè)計可完成對APB總線時鐘進行最高4096分頻,默認分頻值是二分頻,所采用的分頻公式為:fpclk= fSCK*2SPI_DIV+1。
2.2.3 SPI Master模塊
通過控制寄存器MSTR位的配置,可將SPI IP設(shè)定在Master工作模式。在此工作模式下,SPI會自主產(chǎn)生nCS片選信號和SCK時鐘信號,同時完成SPI四種時鐘時序的產(chǎn)生邏輯。相比較傳統(tǒng)的SPI Master,本次設(shè)計不僅僅再局限于每次8比特的傳輸量,增加了16比特、32比特可選配置。并且,相比較于文獻[4]每二次的傳輸都要間隔幾個總線時鐘用來取數(shù)據(jù),會影響傳輸速率。對此,考慮到SCK一般都比APB總線時鐘周期大,可以在每組數(shù)據(jù)傳輸?shù)阶詈笠粋€比特時,輪詢發(fā)送FIFO,查看是否為空,持續(xù)半個SCK周期。若發(fā)送FIFO非空,則立即將下一組待發(fā)送數(shù)據(jù)提前準備好,結(jié)束輪詢。這樣可以實現(xiàn)傳輸?shù)倪B貫性,減小本身設(shè)計造成的傳輸延遲,增加傳輸速率。所設(shè)計的SPI Master模塊的狀態(tài)機如圖3所示。

圖3 SPI Master模塊有限狀態(tài)機
SPI在發(fā)送數(shù)據(jù)時,所發(fā)送的數(shù)據(jù)要和模塊產(chǎn)生的串行時鐘SCK保持同步,這就要求了在每次SCK后半周期的跳變沿時,發(fā)送數(shù)據(jù)才能變成下一比特。這也使得兩個狀態(tài)機在邏輯上出現(xiàn)交叉控制,相互協(xié)同工作,同時保證在SCK一個時鐘周期的第一個時鐘沿采樣接收數(shù)據(jù),第二個時鐘沿改變發(fā)送數(shù)據(jù)。
TIDLE:當每次傳輸結(jié)束或者進行復位后,狀態(tài)機處于這一狀態(tài)。在該狀態(tài)下,若控制寄存器配置成Master模式并且出現(xiàn)傳輸請求,則跳轉(zhuǎn)到TRMAS1狀態(tài)。
TRMAS1:該狀態(tài)只保持一個APB總線周期,用于向FIFO或者發(fā)送寄存器產(chǎn)生讀指令,然后直接跳轉(zhuǎn)到TRMAS2狀態(tài)。
TRMAS2:該狀態(tài)也只保持一個APB總線周期,用以將待發(fā)送的一組數(shù)據(jù)寄存到傳輸移位寄存器中,在HOLDMAS狀態(tài)下作移位發(fā)送。
HOLDMAS:保持該狀態(tài),直到發(fā)送最后一個比特位并且沒有待發(fā)送的數(shù)據(jù),期間要不斷輪詢SCK產(chǎn)生狀態(tài)機和FIFO空滿標志位。
ENDMAS:保持一個APB總線時鐘,用以產(chǎn)生傳輸結(jié)束中斷或者DMA請求信號。
CLKPH1:根據(jù)所配置的時鐘分頻數(shù)值,對應(yīng)于一個同步串行時鐘SCK周期的前半周期。
CLKPH2:根據(jù)所配置的時鐘分頻數(shù)值,對應(yīng)于一個同步串行時鐘SCK周期的后半周期,在傳輸?shù)阶詈笠槐忍厍覜]有下一組待發(fā)數(shù)據(jù)時,跳回到IDLE狀態(tài)。
2.2.4 SPI Slave模塊
相比較于Master模式,當SPI作為Slave使用時,不需要自己產(chǎn)生同步串行時鐘SCK,由外部輸入SCK時鐘。從空閑狀態(tài)到傳輸狀態(tài)的觸發(fā)條件,也是來自于主設(shè)備的nCS片選信號。由此,可以看到Slave的傳輸受到Master的控制,當Master沒有同步串行時鐘輸入時,Slave需要重新返回到空閑狀態(tài),并產(chǎn)生相應(yīng)的狀態(tài)標志位,其狀態(tài)機主要參考Master模式設(shè)計。另外,因為SCK時鐘是由Master產(chǎn)生輸入到Slave,Slave本身還有來自APB的總線時鐘,這樣當在SCK時鐘域下,完成接收數(shù)據(jù)的串行轉(zhuǎn)并行和發(fā)送數(shù)據(jù)的并行轉(zhuǎn)串行后,需要將保存好的接收數(shù)據(jù)傳輸?shù)紸PB時鐘域下,和從APB時鐘域讀取下一組待發(fā)數(shù)據(jù),這樣就需要在Slave內(nèi)部作異步時鐘處理操作,用以避免出現(xiàn)亞穩(wěn)態(tài)現(xiàn)象。所采取的方法如圖4所示。

圖4 SPI Slave異步時鐘處理設(shè)計
在SCK時鐘域和APB時鐘域之間,每次交換的都是多比特數(shù)據(jù),不能采用傳統(tǒng)的單比特同步方法。在本次設(shè)計中,使用的是類似于握手協(xié)議的處理方法[5],當一次傳輸完成,SCK時鐘域內(nèi)會產(chǎn)生單比特的標志信號送到APB時鐘域下,經(jīng)過兩級時鐘采樣再作為控制信號,再將SCK時鐘域下接收的數(shù)據(jù)轉(zhuǎn)移到APB時鐘域下,同時將APB時鐘域下準備好的下組待發(fā)數(shù)據(jù)轉(zhuǎn)移到SCK時鐘域下。這樣就可以滿足異步信號的建立和保持時間沖突問題,避免亞穩(wěn)態(tài)的產(chǎn)生。
本設(shè)計,首先用Synopsys公司的VCS仿真軟件,用Verilog HDL語言編寫頂層的Testbench,并在該頂層內(nèi)編寫測試變量,進行功能仿真。然后,利用Synopsys公司的Design Compile軟件進行綜合,得到網(wǎng)表和延時文件再回到VCS軟件中進行時序仿真。最后,再采用Altera公司EP3SL150F1152 FPGA芯片搭建的驗證平臺上,配合導航芯片ATGB03的其他模塊,完成實測。在驗證無誤的情況下,已經(jīng)成功流片并且流片回歸測試運行正常,完全符合設(shè)計要求。
該部分的測試代碼設(shè)計思路是,在建立的頂層Testbench模塊內(nèi)[6][7],實例化兩個SPI模塊SPI_M和SPI_S,分別設(shè)置成主模塊和從模塊,完成數(shù)據(jù)的收發(fā)測試。圖5所示為VCS軟件上局部時序仿真圖。分別對應(yīng)著SPI Master模式下,相鄰發(fā)送數(shù)據(jù)可以產(chǎn)生連續(xù)的同步串行時鐘SCK;以及從SPI Master中發(fā)送的數(shù)據(jù)進過SPI Slave模塊接收存儲后,能正確的通過APB總線進行讀取。

圖5 SPI IP核仿真結(jié)果
從圖5(a)中可以看到,每次最高可以完成32比特的傳輸,并且當mas_cr_byte=0x01時,傳輸?shù)阶詈笠粋€比特,會自動開始下一組數(shù)據(jù)的發(fā)送,不需要再延遲幾個APB時鐘周期。內(nèi)部設(shè)計的兩個狀態(tài)機繼續(xù)保持在傳輸狀態(tài),大大提高了傳輸效率。在圖5(b)中,SPI Master中的數(shù)據(jù)tr_data_out,在進過并轉(zhuǎn)串處理,從sdi端傳輸?shù)絊PI Slave模塊。SPI Slave模塊對串行數(shù)據(jù)完成采樣存儲到接收FIFO后,從APB總線讀取到的接收數(shù)據(jù)prdata和所發(fā)送的數(shù)據(jù)tr_data_out一致。
使用Synopsys公司的Design Compile軟件,對所寫的SPI IP進行綜合,所得到的report_area如 圖6所 示。在SMIC 0.13工藝下,模塊的總面積為37566.1,約合7513邏輯門。在將APB總線時鐘設(shè)置在60MHz情況下,SPI IP運行在20MHz仍能完成數(shù)據(jù)的傳輸,達到了設(shè)計目的。

圖6 SPI IP在SMIC 0.13工藝下的綜合結(jié)果
本文設(shè)計一種應(yīng)用于GPS導航芯片的可復用SPI IP核,它具有功能完善、速度快、可重用性高等特點,并通過了仿真驗證、邏輯綜合和FPGA平臺測試,證明了其設(shè)計的可靠性和實用性,目前已經(jīng)成功應(yīng)用到已經(jīng)量產(chǎn)的ATGB03 GPS導航芯片上,具有實際的商業(yè)價值。
[1] 李大江,崔建明. 一種基于FPGA的可配置SPI Master接口設(shè)計實現(xiàn)[J].電子技術(shù)應(yīng)用. 2010.10(36):60-62.
[2] 汪永琳,丁一. 一種3線半雙工SPI接口設(shè)計[J]. 半導體技術(shù). 2010.5(35):482-484.
[3] 郭林,劉文杰,李躍輝. 基于FPGA的可復用SPI總線實現(xiàn)[J] .2012.4(155):34-37.
[4] Jianlong Zhang, Chunyu Wu, Wenjing Zhang The design and realization of a comprehensive SPI interface controller [J]. IEEE 2011.2:4529-4532.
[5] 謝修祥,王廣生 異步多時鐘系統(tǒng)的同步設(shè)計技術(shù)[J]. 電子工程師. 2005.5(31):36-38.
[6] Bergeron Janick. Writing testbenches: functional verification of HDL models [M] .[S.L]:Kluwer Academic Publishers.2003.
[7] 高谷剛,羅春. 可復用SPI模塊IP核的設(shè)計與驗證[J].單片機與嵌入式系統(tǒng)應(yīng)用. 2004(11):5-8.