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