曹磊 李曉江 馬成炎
(1.中國(guó)科學(xué)院微電子研究所,北京 100029;2.杭州中科微電子有限公司,杭州 310053;3.嘉興聯(lián)星微電子有限公司,嘉興 314000;)
隨著SOC的規(guī)模不斷擴(kuò)大,集成的IP模塊不斷增多,設(shè)計(jì)一款可復(fù)用的IP核對(duì)于減少設(shè)計(jì)復(fù)雜度、縮短SOC開發(fā)周期、提高流片成功率都是重要的一環(huán)。SPI(Serial Peripheral Interface)串行通信總線具有配置靈活,結(jié)構(gòu)簡(jiǎn)單等優(yōu)點(diǎn),被廣泛應(yīng)用于各位處理器和嵌入式系統(tǒng)當(dāng)中。因此,對(duì)于SPI IP核的設(shè)計(jì)已經(jīng)成為業(yè)界的設(shè)計(jì)熱點(diǎn)之一,但現(xiàn)有設(shè)計(jì)功能還不夠完善。文獻(xiàn)[1]設(shè)計(jì)了SPI Master模塊,不具有SPI Slave功能;文獻(xiàn)[2]設(shè)計(jì)了一款基于FPGA的SPI總線,但是不支持四線工作模式,并且對(duì)設(shè)計(jì)本身的結(jié)構(gòu)和特性敘述不多;文獻(xiàn)[3]的設(shè)計(jì)實(shí)現(xiàn)了多功能化的SPI IP核,但是不支持DMA功能,所設(shè)計(jì)的SPI Master也沒作流水考慮,數(shù)據(jù)傳輸率受到限制。本文總結(jié)上述設(shè)計(jì)中存在的問題,提出了一種基于APB總線的高速可復(fù)用的SPI IP核實(shí)現(xiàn)方法,使所設(shè)計(jì)的SPI接口具有更高的實(shí)際可操作性,并且已經(jīng)在流片回來的芯片上得到了驗(yàn)證。
SPI是由Motorola公司首先在其MC68HCXX系列處理器上定義的一種高速的、全雙工的、同步的通信總線,通常只占用四根芯片管腳,分別為MOSI:串行數(shù)據(jù)輸出線,當(dāng)SPI模塊為主模塊時(shí),它輸出數(shù)據(jù);當(dāng)SPI模塊為從模塊時(shí),它接收數(shù)據(jù);MISO:串行數(shù)據(jù)輸入線,當(dāng)SPI模塊為主模塊時(shí),它接收數(shù)據(jù);當(dāng)SPI模塊為從模塊時(shí),它輸出數(shù)據(jù);SCK:同步串行時(shí)鐘,由SPI主模塊產(chǎn)生;nCS:從機(jī)片選線,低電平有效,由主模塊產(chǎn)生。協(xié)議規(guī)定了SPI的主、從兩種工作模式,工作在主模式的SPI模塊負(fù)責(zé)產(chǎn)生串行時(shí)鐘SCK和對(duì)從模塊的片選信號(hào)。
圖1 SPI外設(shè)接口的四種數(shù)據(jù)傳輸時(shí)序
SPI模塊為了和外設(shè)進(jìn)行數(shù)據(jù)交換,根據(jù)外設(shè)的工作要求,其輸出串行同步時(shí)鐘SCK的極性CPOL和相位CPHA可以進(jìn)行配置,因此SPI有四種傳輸時(shí)序,其共同特點(diǎn)是每位數(shù)據(jù)的發(fā)送/接收需要一個(gè)SCK周期,每次傳輸整數(shù)倍個(gè)8位數(shù)據(jù)。當(dāng)CPOL=0時(shí),串行時(shí)鐘的空閑狀態(tài)為低電平;當(dāng)CPOL=1時(shí),串行同步時(shí)鐘的空閑狀態(tài)位高電平。而時(shí)鐘相位CPHA則決定了數(shù)據(jù)采樣的數(shù)據(jù)沿,當(dāng)CPHA=1時(shí),在串行同步時(shí)鐘的第二個(gè)跳變沿?cái)?shù)據(jù)被采樣;當(dāng)CPHA=0時(shí),在串行同步時(shí)鐘的第一個(gè)跳變沿?cái)?shù)據(jù)被采樣。SPI模塊的四種
接口時(shí)序如圖1所示。
該IP核應(yīng)用于國(guó)家導(dǎo)航基帶項(xiàng)目,基于APB總線進(jìn)行設(shè)計(jì)。CPU或者DMA模塊可通過APB總線完成對(duì)該SPI模塊的寄存器配置、數(shù)據(jù)讀寫及中斷處理等操作。所設(shè)計(jì)的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è)計(jì)的SPI IP核實(shí)現(xiàn)了傳統(tǒng)SPI協(xié)議的四線結(jié)構(gòu)。同時(shí)滿足SPI的四種接口時(shí)序,通過控制寄存器的CPOL和CPHA位來控制。增加了兩個(gè)8位深度、32位寬度的同步可選FIFO,用以提高傳輸速率。每次發(fā)送/接收的比特?cái)?shù)可在8bits、16bits、32bits選擇,并且首尾比特位的發(fā)送/接收順序也可選。考慮到部分應(yīng)用中可能需要三線結(jié)構(gòu)的SPI核進(jìn)行半雙工工作,本設(shè)計(jì)可只使用SDI數(shù)據(jù)線作三線工作方式。
本次設(shè)計(jì)主要采用自頂向下的設(shè)計(jì)方法,首先完成設(shè)計(jì)說明文檔,劃分好各子模塊和系統(tǒng)架構(gòu),再進(jìn)行Verilog代碼的編寫,主要實(shí)現(xiàn)的功能和設(shè)計(jì)中部分問題的解決方法如下。
2.2.1 存儲(chǔ)器模塊
所設(shè)計(jì)的SPI核主要包括一個(gè)32位的控制寄存器,實(shí)現(xiàn)Master/Slave功能的切換、中斷模式/DMA模式的切換等功能的控制;一個(gè)32位的狀態(tài)寄存器,記錄發(fā)送/接收中斷、同步FIFO空滿標(biāo)志等狀態(tài);兩個(gè)8X32的同步FIFO,可選擇是否使用。
2.2.2 時(shí)鐘分頻模塊
當(dāng)SPI被用作Master時(shí),將會(huì)根據(jù)控制寄存器SPI_DIV位所設(shè)置的分頻數(shù)值來對(duì)APB總線時(shí)鐘進(jìn)行分頻,用以產(chǎn)生所需要的同步串行時(shí)鐘SCK。本設(shè)計(jì)可完成對(duì)APB總線時(shí)鐘進(jìn)行最高4096分頻,默認(rèn)分頻值是二分頻,所采用的分頻公式為:fpclk= fSCK*2SPI_DIV+1。
2.2.3 SPI Master模塊
通過控制寄存器MSTR位的配置,可將SPI IP設(shè)定在Master工作模式。在此工作模式下,SPI會(huì)自主產(chǎn)生nCS片選信號(hào)和SCK時(shí)鐘信號(hào),同時(shí)完成SPI四種時(shí)鐘時(shí)序的產(chǎn)生邏輯。相比較傳統(tǒng)的SPI Master,本次設(shè)計(jì)不僅僅再局限于每次8比特的傳輸量,增加了16比特、32比特可選配置。并且,相比較于文獻(xiàn)[4]每二次的傳輸都要間隔幾個(gè)總線時(shí)鐘用來取數(shù)據(jù),會(huì)影響傳輸速率。對(duì)此,考慮到SCK一般都比APB總線時(shí)鐘周期大,可以在每組數(shù)據(jù)傳輸?shù)阶詈笠粋€(gè)比特時(shí),輪詢發(fā)送FIFO,查看是否為空,持續(xù)半個(gè)SCK周期。若發(fā)送FIFO非空,則立即將下一組待發(fā)送數(shù)據(jù)提前準(zhǔn)備好,結(jié)束輪詢。這樣可以實(shí)現(xiàn)傳輸?shù)倪B貫性,減小本身設(shè)計(jì)造成的傳輸延遲,增加傳輸速率。所設(shè)計(jì)的SPI Master模塊的狀態(tài)機(jī)如圖3所示。
圖3 SPI Master模塊有限狀態(tài)機(jī)
SPI在發(fā)送數(shù)據(jù)時(shí),所發(fā)送的數(shù)據(jù)要和模塊產(chǎn)生的串行時(shí)鐘SCK保持同步,這就要求了在每次SCK后半周期的跳變沿時(shí),發(fā)送數(shù)據(jù)才能變成下一比特。這也使得兩個(gè)狀態(tài)機(jī)在邏輯上出現(xiàn)交叉控制,相互協(xié)同工作,同時(shí)保證在SCK一個(gè)時(shí)鐘周期的第一個(gè)時(shí)鐘沿采樣接收數(shù)據(jù),第二個(gè)時(shí)鐘沿改變發(fā)送數(shù)據(jù)。
TIDLE:當(dāng)每次傳輸結(jié)束或者進(jìn)行復(fù)位后,狀態(tài)機(jī)處于這一狀態(tài)。在該狀態(tài)下,若控制寄存器配置成Master模式并且出現(xiàn)傳輸請(qǐng)求,則跳轉(zhuǎn)到TRMAS1狀態(tài)。
TRMAS1:該狀態(tài)只保持一個(gè)APB總線周期,用于向FIFO或者發(fā)送寄存器產(chǎn)生讀指令,然后直接跳轉(zhuǎn)到TRMAS2狀態(tài)。
TRMAS2:該狀態(tài)也只保持一個(gè)APB總線周期,用以將待發(fā)送的一組數(shù)據(jù)寄存到傳輸移位寄存器中,在HOLDMAS狀態(tài)下作移位發(fā)送。
HOLDMAS:保持該狀態(tài),直到發(fā)送最后一個(gè)比特位并且沒有待發(fā)送的數(shù)據(jù),期間要不斷輪詢SCK產(chǎn)生狀態(tài)機(jī)和FIFO空滿標(biāo)志位。
ENDMAS:保持一個(gè)APB總線時(shí)鐘,用以產(chǎn)生傳輸結(jié)束中斷或者DMA請(qǐng)求信號(hào)。
CLKPH1:根據(jù)所配置的時(shí)鐘分頻數(shù)值,對(duì)應(yīng)于一個(gè)同步串行時(shí)鐘SCK周期的前半周期。
CLKPH2:根據(jù)所配置的時(shí)鐘分頻數(shù)值,對(duì)應(yīng)于一個(gè)同步串行時(shí)鐘SCK周期的后半周期,在傳輸?shù)阶詈笠槐忍厍覜]有下一組待發(fā)數(shù)據(jù)時(shí),跳回到IDLE狀態(tài)。
2.2.4 SPI Slave模塊
相比較于Master模式,當(dāng)SPI作為Slave使用時(shí),不需要自己產(chǎn)生同步串行時(shí)鐘SCK,由外部輸入SCK時(shí)鐘。從空閑狀態(tài)到傳輸狀態(tài)的觸發(fā)條件,也是來自于主設(shè)備的nCS片選信號(hào)。由此,可以看到Slave的傳輸受到Master的控制,當(dāng)Master沒有同步串行時(shí)鐘輸入時(shí),Slave需要重新返回到空閑狀態(tài),并產(chǎn)生相應(yīng)的狀態(tài)標(biāo)志位,其狀態(tài)機(jī)主要參考Master模式設(shè)計(jì)。另外,因?yàn)镾CK時(shí)鐘是由Master產(chǎn)生輸入到Slave,Slave本身還有來自APB的總線時(shí)鐘,這樣當(dāng)在SCK時(shí)鐘域下,完成接收數(shù)據(jù)的串行轉(zhuǎn)并行和發(fā)送數(shù)據(jù)的并行轉(zhuǎn)串行后,需要將保存好的接收數(shù)據(jù)傳輸?shù)紸PB時(shí)鐘域下,和從APB時(shí)鐘域讀取下一組待發(fā)數(shù)據(jù),這樣就需要在Slave內(nèi)部作異步時(shí)鐘處理操作,用以避免出現(xiàn)亞穩(wěn)態(tài)現(xiàn)象。所采取的方法如圖4所示。
圖4 SPI Slave異步時(shí)鐘處理設(shè)計(jì)
在SCK時(shí)鐘域和APB時(shí)鐘域之間,每次交換的都是多比特?cái)?shù)據(jù),不能采用傳統(tǒng)的單比特同步方法。在本次設(shè)計(jì)中,使用的是類似于握手協(xié)議的處理方法[5],當(dāng)一次傳輸完成,SCK時(shí)鐘域內(nèi)會(huì)產(chǎn)生單比特的標(biāo)志信號(hào)送到APB時(shí)鐘域下,經(jīng)過兩級(jí)時(shí)鐘采樣再作為控制信號(hào),再將SCK時(shí)鐘域下接收的數(shù)據(jù)轉(zhuǎn)移到APB時(shí)鐘域下,同時(shí)將APB時(shí)鐘域下準(zhǔn)備好的下組待發(fā)數(shù)據(jù)轉(zhuǎn)移到SCK時(shí)鐘域下。這樣就可以滿足異步信號(hào)的建立和保持時(shí)間沖突問題,避免亞穩(wěn)態(tài)的產(chǎn)生。
本設(shè)計(jì),首先用Synopsys公司的VCS仿真軟件,用Verilog HDL語言編寫頂層的Testbench,并在該頂層內(nèi)編寫測(cè)試變量,進(jìn)行功能仿真。然后,利用Synopsys公司的Design Compile軟件進(jìn)行綜合,得到網(wǎng)表和延時(shí)文件再回到VCS軟件中進(jìn)行時(shí)序仿真。最后,再采用Altera公司EP3SL150F1152 FPGA芯片搭建的驗(yàn)證平臺(tái)上,配合導(dǎo)航芯片ATGB03的其他模塊,完成實(shí)測(cè)。在驗(yàn)證無誤的情況下,已經(jīng)成功流片并且流片回歸測(cè)試運(yùn)行正常,完全符合設(shè)計(jì)要求。
該部分的測(cè)試代碼設(shè)計(jì)思路是,在建立的頂層Testbench模塊內(nèi)[6][7],實(shí)例化兩個(gè)SPI模塊SPI_M和SPI_S,分別設(shè)置成主模塊和從模塊,完成數(shù)據(jù)的收發(fā)測(cè)試。圖5所示為VCS軟件上局部時(shí)序仿真圖。分別對(duì)應(yīng)著SPI Master模式下,相鄰發(fā)送數(shù)據(jù)可以產(chǎn)生連續(xù)的同步串行時(shí)鐘SCK;以及從SPI Master中發(fā)送的數(shù)據(jù)進(jìn)過SPI Slave模塊接收存儲(chǔ)后,能正確的通過APB總線進(jìn)行讀取。
圖5 SPI IP核仿真結(jié)果
從圖5(a)中可以看到,每次最高可以完成32比特的傳輸,并且當(dāng)mas_cr_byte=0x01時(shí),傳輸?shù)阶詈笠粋€(gè)比特,會(huì)自動(dòng)開始下一組數(shù)據(jù)的發(fā)送,不需要再延遲幾個(gè)APB時(shí)鐘周期。內(nèi)部設(shè)計(jì)的兩個(gè)狀態(tài)機(jī)繼續(xù)保持在傳輸狀態(tài),大大提高了傳輸效率。在圖5(b)中,SPI Master中的數(shù)據(jù)tr_data_out,在進(jìn)過并轉(zhuǎn)串處理,從sdi端傳輸?shù)絊PI Slave模塊。SPI Slave模塊對(duì)串行數(shù)據(jù)完成采樣存儲(chǔ)到接收FIFO后,從APB總線讀取到的接收數(shù)據(jù)prdata和所發(fā)送的數(shù)據(jù)tr_data_out一致。
使用Synopsys公司的Design Compile軟件,對(duì)所寫的SPI IP進(jìn)行綜合,所得到的report_area如 圖6所 示。在SMIC 0.13工藝下,模塊的總面積為37566.1,約合7513邏輯門。在將APB總線時(shí)鐘設(shè)置在60MHz情況下,SPI IP運(yùn)行在20MHz仍能完成數(shù)據(jù)的傳輸,達(dá)到了設(shè)計(jì)目的。
圖6 SPI IP在SMIC 0.13工藝下的綜合結(jié)果
本文設(shè)計(jì)一種應(yīng)用于GPS導(dǎo)航芯片的可復(fù)用SPI IP核,它具有功能完善、速度快、可重用性高等特點(diǎn),并通過了仿真驗(yàn)證、邏輯綜合和FPGA平臺(tái)測(cè)試,證明了其設(shè)計(jì)的可靠性和實(shí)用性,目前已經(jīng)成功應(yīng)用到已經(jīng)量產(chǎn)的ATGB03 GPS導(dǎo)航芯片上,具有實(shí)際的商業(yè)價(jià)值。
[1] 李大江,崔建明. 一種基于FPGA的可配置SPI Master接口設(shè)計(jì)實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用. 2010.10(36):60-62.
[2] 汪永琳,丁一. 一種3線半雙工SPI接口設(shè)計(jì)[J]. 半導(dǎo)體技術(shù). 2010.5(35):482-484.
[3] 郭林,劉文杰,李躍輝. 基于FPGA的可復(fù)用SPI總線實(shí)現(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] 謝修祥,王廣生 異步多時(shí)鐘系統(tǒng)的同步設(shè)計(jì)技術(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] 高谷剛,羅春. 可復(fù)用SPI模塊IP核的設(shè)計(jì)與驗(yàn)證[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用. 2004(11):5-8.