摘 要:基于APB總線接口,設(shè)計了一種可靈活配置為Master/Slave模式、設(shè)置傳輸速率、支持DMA功能并適用于4種時鐘模式的SPI 協(xié)議IP核。首先介紹了SPI協(xié)議標準,然后詳細說明了該IP核的系統(tǒng)結(jié)構(gòu)、接口信號和子模塊設(shè)計,并使用了Verilog HDL語言實現(xiàn)硬件設(shè)計。最后通過了FPGA時序仿真,驗證了該設(shè)計的正確性。該IP核已成功用于一款通信芯片,證明了該IP核在實際工程中的可行性。
關(guān)鍵詞:SPI協(xié)議;IP核;Verilog HDL;FPGA
1 引言
隨著集成電路工藝的不斷發(fā)展,SOC的規(guī)模不斷擴大,集成的IP模塊不斷增多,可復(fù)用IP核可以大幅減少設(shè)計的復(fù)雜度,縮短SOC的開發(fā)周期和提高流片成功率。SPI(Serial Peripheral Interface)串行通信總線具有配置靈活,結(jié)構(gòu)簡單等特有的優(yōu)點,被廣泛應(yīng)用于各位處理器和嵌入式系統(tǒng)當中。因此,SPI協(xié)議IP核設(shè)計已經(jīng)成為業(yè)界的設(shè)計熱點之一,但現(xiàn)有的設(shè)計功能還不夠完善。文獻[1]設(shè)計了一種SPI協(xié)議總線,只具有Master功能,不具有Slave功能;文獻[2]設(shè)計了一種基于FPGA的SPI協(xié)議總線,但是不支持四線工作模式,并且對總線本身的結(jié)構(gòu)和特性敘述不多,缺乏通用性;文獻[3]設(shè)計了一種多功能化的SPI協(xié)議IP核,但是不支持DMA功能,所設(shè)計的IP核 Master模塊也沒有作流水考慮,數(shù)據(jù)傳輸率受到限制。本文提出了一種基于APB總線的高速可復(fù)用的SPI協(xié)議IP核,解決了上述設(shè)計中存在的問題,并具有更高的可行性,方便靈活,并且已經(jīng)得到了驗證,成功應(yīng)用于一款基帶通信芯片。
2 SPI協(xié)議及時序概述
SPI是一種高速高效率的串行接口技術(shù),由Motorola公司提出。通常由1個主模塊和1個或多個從模塊組成,主模塊選擇一個從模塊進行同步通信,從而完成數(shù)據(jù)交換。
SPI協(xié)議在芯片的管腳上通常只占用四根芯片管腳,分別對應(yīng)于四種信號:MOSI:主模塊數(shù)據(jù)輸出,從模塊數(shù)據(jù)輸入;MISO:主模塊數(shù)據(jù)輸入,從模塊數(shù)據(jù)輸出;SCK:時鐘信號,由主模塊產(chǎn)生;CSn:片選信號,低電平有效,由主模塊產(chǎn)生。該協(xié)議規(guī)定了SPI模塊主從兩種工作模式,主模塊產(chǎn)生串行時鐘SCK和對從模塊的片選信號。
SPI模塊在和外設(shè)進行數(shù)據(jù)交換時,根據(jù)外設(shè)的工作要求,其時鐘信號SCK的極性(CPOL)和相位(CPHA)可以進行配置。因此,SPI有四種傳輸時序:CPOL=0時,串行時鐘的空閑狀態(tài)為低電平;CPOL=1時,串行同步時鐘的空閑狀態(tài)位高電平;CPHA=1時,在SCK的第二個跳變沿數(shù)據(jù)被采樣;CPHA=0時,SCK的第一個跳變沿數(shù)據(jù)被采樣。SPI協(xié)議4種數(shù)據(jù)傳輸時序如圖1所示。
3 SPI IP核的設(shè)計
3.1 SPI IP核系統(tǒng)結(jié)構(gòu)及主要功能
本IP核基于APB總線進行設(shè)計,可連接APB Host(例如ARM CPU等)。APB Host通過APB總線完成對SPI模塊進行狀態(tài)控制、數(shù)據(jù)讀寫和中斷處理等操作。系統(tǒng)結(jié)構(gòu)圖如圖2所示,設(shè)計的SPI電路主要包括以下模塊:SPI控制寄存器SPCR、數(shù)據(jù)發(fā)送模塊TRANSMITTER、數(shù)據(jù)接收模塊RECEIVER、發(fā)送/接收同步FIFO、狀態(tài)寄存器SPSR。
由圖2所示,所設(shè)計的SPI協(xié)議IP核實現(xiàn)了傳統(tǒng)的4線結(jié)構(gòu),同時通過控制寄存器的CPOL和CPHA位來控制,滿足了4種接口時序。此外,增加了兩個8位深度、32位寬度的同步可選FIFO,用以提高傳輸速率。每次發(fā)送/接收的比特數(shù)可自由在8比特、16比特和32比特間選擇,并且首尾比特位的發(fā)送/接收順序也可選?;趯嶋H應(yīng)用中存在的半雙工工作要求,本設(shè)計也可以只使用SDI數(shù)據(jù)線的三線工作方式,使IP核進行半雙工工作,增強了本設(shè)計的通用性。
3.2 主要模塊的設(shè)計
SPI核主要模塊設(shè)計包括存儲器模塊、時鐘分頻模塊、Master模塊和Slave模塊的設(shè)計。
3.2.1 存儲器模塊
存儲器模塊主要包括一個32位的控制寄存器、一個32位的狀態(tài)寄存器和兩個8X32的同步FIFO??刂萍拇嫫鲗崿F(xiàn)Master/Slave功能的切換、中斷模式/DMA模式的切換等;狀態(tài)寄存器記錄發(fā)送/接收中斷、同步FIFO空滿標志等狀態(tài);兩個同步FIFO可選擇是否使用。
3.2.2 時鐘分頻模塊
主模塊會根據(jù)控制寄存器SPI_DIV所設(shè)置的分頻值來對APB總線時鐘進行分頻,產(chǎn)生從模塊需要的時鐘信號SCK。本設(shè)計默認分頻值為二分頻,最高可完成對APB總線時鐘4096分頻,分頻公式為:
3.2.3 SPI Master模塊
控制寄存器MSTR位可以將SPI協(xié)議IP核設(shè)定在Master工作模式。工作于此模式下,IP核將產(chǎn)生CSn片選信號和SCK時鐘信號,同時完成SPI四種時鐘時序的產(chǎn)生邏輯。相對于傳統(tǒng)的SPI 協(xié)議Master,本IP核不再局限于每次8比特的傳輸量,增加了16比特、32比特可選配置。傳統(tǒng)的SPI協(xié)議IP核沒有數(shù)據(jù)流水線機制,相鄰的數(shù)據(jù)傳輸需要間隔幾個時鐘來讀取數(shù)據(jù),影響傳輸速率。本IP協(xié)議核引入流水線機制,在數(shù)據(jù)傳輸?shù)阶詈笠槐忍貢r,查詢FIFO是否為空。若飛空,則立即將下一組待發(fā)數(shù)據(jù)提前準備好,結(jié)束查詢,這樣實現(xiàn)了傳輸?shù)倪B續(xù)性,提高了傳輸速率。SPI協(xié)議 Master模塊的狀態(tài)機如圖3(a)所示。
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:空閑狀態(tài),每次傳輸結(jié)束或者復(fù)位后,狀態(tài)機即處于這一狀態(tài)。該狀態(tài)克通過控制寄存器配置為Master模式并出現(xiàn)傳輸請求,則跳轉(zhuǎn)為TRAMAS1狀態(tài)。
TRMAS1:讀指令狀態(tài),該狀態(tài)保持一個APB總線周期,在此周期內(nèi)向FIFO或者發(fā)送寄存器產(chǎn)生讀指令,然后直接跳轉(zhuǎn)到TRMAS2狀態(tài)。
TRMAS2:寫寄存器狀態(tài),該狀態(tài)也保持一個APB總線周期,在此周期內(nèi)將待發(fā)送的一組數(shù)據(jù)寄存到傳輸移位寄存器中,在HOLDMAS狀態(tài)下作移位發(fā)送。
HOLDMAS:保持狀態(tài),該狀態(tài)下Master向外設(shè)發(fā)送數(shù)據(jù),直到發(fā)送最后一個比特位并且沒有待發(fā)送的數(shù)據(jù)。為了提高傳輸速率,此期間要不斷輪詢SCK產(chǎn)生狀態(tài)機和FIFO空滿標志位。
ENDMAS:結(jié)束狀態(tài),保持一個APB總線時鐘,產(chǎn)生傳輸結(jié)束中斷或者DMA請求信號。
CLKPH1:根據(jù)配置的時鐘分頻數(shù)值,對應(yīng)于一個同步串行時鐘SCK周期的前半周期。
CLKPH2:根據(jù)配置的時鐘分頻數(shù)值,對應(yīng)于一個同步串行時鐘SCK周期的后半周期。在傳輸?shù)阶詈笠槐忍厍覜]有下一組待發(fā)數(shù)據(jù)時,跳回到IDLE狀態(tài)。
3.2.4 SPI Slave模塊
SPI作為Slave模塊使用時,由外部輸入SCK時鐘信號。模塊從空閑狀態(tài)到傳輸狀態(tài)的觸發(fā)條件,也是來自于主設(shè)備的CSn片選信號。Slave模塊的傳輸受到Master模塊的控制,當Master模塊沒有同步串行時鐘信號輸入時,Slave模塊需要重新返回到空閑狀態(tài),并產(chǎn)生相應(yīng)的狀態(tài)標志位。SLAVE模塊狀態(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)部作異步時鐘處理操作,來避免亞穩(wěn)態(tài)現(xiàn)象出現(xiàn)。異步時鐘處理采取的方法如圖4所示。
在SCK時鐘域和APB時鐘域之間,每次交換的是多比特數(shù)據(jù),因此不能采用傳統(tǒng)的單比特同步方法。在本次設(shè)計中,采用的是類似于握手協(xié)議的處理方法[5],當一次數(shù)據(jù)傳輸完成后,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)現(xiàn)象的產(chǎn)生。
4 仿真驗證和綜合結(jié)果
首先用Verilog HDL語言編寫頂層的Testbench,在該頂層內(nèi)編寫測試變量,通過Synopsys公司的VCS仿真軟件進行功能仿真。然后通過Design Compile軟件進行綜合,得到網(wǎng)表文件再使用VCS軟件進行時序仿真。最后,再在FPGA芯片搭建的驗證平臺上,配合通信芯片的其他模塊,完成實測。經(jīng)過驗證測試,完全符合設(shè)計要求。
4.1 軟件仿真驗證
在頂層Testbench模塊內(nèi)[6][7],實例化兩個SPI模塊SPI_M和SPI_S,分別設(shè)置成主模塊和從模塊,相互連接進行數(shù)據(jù)傳輸,并把APB總線信號設(shè)為寄存器變量,向兩個SPI模塊發(fā)送命令和讀寫數(shù)據(jù),完成數(shù)據(jù)的收發(fā)測試。圖5所示為部分數(shù)據(jù)時序仿真圖。圖(a)對應(yīng)著SPI Master模式下,相鄰發(fā)送數(shù)據(jù)可以產(chǎn)生連續(xù)的同步串行時鐘SCK;圖(b)顯示了SPI Master中發(fā)送的數(shù)據(jù)經(jīng)過SPI Slave模塊接收并存儲后,通過APB總線進行讀取能得到正確的驗證。
此外,圖5(a)中可以看到,每次最高可以完成32比特的傳輸,并且當mas_cr_byte=0x01時,傳輸完最后一個比特后,會自動開始下一組數(shù)據(jù)的發(fā)送,不需要延遲APB時鐘周期。內(nèi)部設(shè)計的兩個狀態(tài)機繼續(xù)保持在傳輸狀態(tài),大大提高了傳輸效率。圖5(b)中,SPI Master中的數(shù)據(jù)tr_data_out,經(jīng)過轉(zhuǎn)串處理,從sdi端傳輸?shù)絊PI Slave模塊。SPI Slave模塊對串行數(shù)據(jù)進行采樣并存儲到接收FIFO后,APB總線讀取到的接收數(shù)據(jù)prdata和發(fā)送的數(shù)據(jù)tr_data_out一致。
4.2 綜合結(jié)果
使用Synopsys公司的Design Compile軟件,在SMIC0.13μm工藝下,對SPI協(xié)議IP核進行綜合,所得到的report_area如圖6所示。模塊的總面積為37566μm2,約合7500邏輯門。
5 結(jié)束語
本文設(shè)計一種應(yīng)用于通信芯片中的可復(fù)用SPI協(xié)議IP核,它具有功能完善、使用方便靈活、速度快、可重用性高等特點,并通過了仿真驗證、邏輯綜合和FPGA平臺測試,證明了其設(shè)計的可靠性和實用性,并具有作為IP核進行ASIC設(shè)計或者FPGA設(shè)計的工程價值。
[參考文獻]
[1]李大江,崔建明.一種基于FPGA的可配置SPI Master接口設(shè)計實現(xiàn)[J].電子技術(shù)應(yīng)用,2010.10(36):60-62.
[2]汪永琳,丁一.一種3線半雙工SPI接口設(shè)計[J].半導(dǎo)體技術(shù), 2010.5(35):482-484.
[3]郭林,劉文杰,李躍輝.基于FPGA的可復(fù)用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]高谷剛,羅春.可復(fù)用SPI模塊IP核的設(shè)計與驗證[J].單片機與嵌入式系統(tǒng)應(yīng)用,2004(11):5-8.
作者簡介:郭艾華(1979-),男,講師、碩士、數(shù)據(jù)庫系統(tǒng)工程師,長期從事軟件技術(shù)專業(yè)的教學(xué)與研究,對編程技術(shù)、數(shù)據(jù)庫系統(tǒng)理論及工程技術(shù)有較深的了解。