姜冬梅,何衛(wèi)國,楊瑞瑞
(成都三零嘉微電子有限公司,四川 成都 610041)
傳統(tǒng)的串仔外設(shè)接口(Serial peripheral Interface,SPI)接口傳輸速率較低,本設(shè)計(jì)通過采用多比特傳輸和雙沿采樣的方法來提高SPI傳輸帶寬[1,2]。通常印刷電路板(Printed Circuit Board,PCB)布線時(shí)不同的數(shù)據(jù)線、時(shí)鐘線無法做到等距離傳輸,接收端不同數(shù)據(jù)線、時(shí)鐘線的延遲不同,該延遲差別為skew[3]。skew的引入導(dǎo)致接收端的數(shù)據(jù)有效采樣窗口變小,時(shí)鐘頻率越高,skew對(duì)正確采樣數(shù)據(jù)的影響越大。為了實(shí)現(xiàn)高速傳輸,采用自動(dòng)de-skew 算法解決PCB布線引入的skew問題。此外,傳統(tǒng)SPI通信中從接口不能暫停傳輸,而本文提出一種基于先進(jìn)先出儲(chǔ)存器(First Input First Output,F(xiàn)IFO)空、滿狀態(tài)的流量控制機(jī)制,通信的任意一方都可以隨時(shí)暫停傳輸,待準(zhǔn)備好之后繼續(xù)通信[4]。
SPI主接口模塊框架如圖1所示。
圖1 SPI主接口模塊框架
SPI主機(jī)根據(jù)軟件配置的工作模式和數(shù)據(jù)長度發(fā)起對(duì)SPI從機(jī)的讀寫操作。當(dāng)SPI主機(jī)發(fā)起寫操作時(shí),軟件先配置模式寄存器為寫模式,再配置數(shù)據(jù)長度,然后將命令和數(shù)據(jù)寫到發(fā)送異步FIFO中。有限狀態(tài)機(jī)(Finite State Machine,F(xiàn)SM)檢測(cè)到發(fā)送異步FIFO非空時(shí),啟動(dòng)SCLK生成電路,產(chǎn)生SCLK_out時(shí)鐘,同時(shí)啟動(dòng)并串轉(zhuǎn)化電路,從發(fā)送FIFO讀出TX data,通過并串轉(zhuǎn)化電路轉(zhuǎn)換成TXD輸出。狀態(tài)機(jī)根據(jù)從機(jī)接收FIFO是否快滿和主機(jī)發(fā)送FIFO是否為空來控制SCLK_out輸出,當(dāng)從機(jī)接收FIFO快滿或主機(jī)發(fā)送FIFO為空時(shí),停止SCLK_out時(shí)鐘輸出,從而暫停當(dāng)前傳輸;當(dāng)從機(jī)接收FIFO非滿且主機(jī)發(fā)送FIFO非空狀態(tài)時(shí),繼續(xù)傳輸。當(dāng)SPI主機(jī)發(fā)起讀操作時(shí),軟件先配置模式寄存器為讀模式,再配置讀數(shù)據(jù)長度,然后將命令和數(shù)據(jù)長度寫到發(fā)送異步FIFO中。FSM狀態(tài)機(jī)檢測(cè)到發(fā)送異步FIFO非空時(shí),啟動(dòng)SCLK生成電路,產(chǎn)生SCLK_out時(shí)鐘,同時(shí)啟動(dòng)并串轉(zhuǎn)化電路,從發(fā)送異步FIFO讀出TX data,通過并串轉(zhuǎn)化電路將命令和數(shù)據(jù)長度發(fā)送給從機(jī)。從機(jī)在接收到讀命令后,由接收狀態(tài)切換到發(fā)送狀態(tài)。主機(jī)在完成命令發(fā)送后進(jìn)入等待狀態(tài),等到從機(jī)完成狀態(tài)切換后再由發(fā)送狀態(tài)切換到接收狀態(tài)。RXD和RXD valid經(jīng)過de-skew模塊后,進(jìn)入串并轉(zhuǎn)化模塊,將RX data寫入接收FIFO中。
AHB從接口模塊完成AHB總線讀寫信號(hào)到內(nèi)部信號(hào)的轉(zhuǎn)換,可以通過該接口訪問內(nèi)部寄存器[5]。發(fā)送FIFO是一個(gè)異步FIFO,寫端口工作在AHB時(shí)鐘域,讀端口工作在SSI clock時(shí)鐘域。通過寫發(fā)送數(shù)據(jù)寄存器可以將數(shù)據(jù)寫入發(fā)送異步FIFO,并串轉(zhuǎn)換模塊從讀端口將發(fā)送數(shù)據(jù)讀出[6,7]。SCLK生成器產(chǎn)生SCLK_out時(shí)鐘,本設(shè)計(jì)采用雙數(shù)據(jù)速率(Double Date Rate,DDR)模式傳輸,因此SCLK_out時(shí)鐘頻率是數(shù)據(jù)傳輸頻率的一半。當(dāng)SCLK_in有效時(shí),SCLK_out是SSI clock的2分頻時(shí)鐘;當(dāng)SCLK_in無效時(shí),SCLK_out保持低電平輸出。
并串轉(zhuǎn)換模塊將32 bit的TX data 轉(zhuǎn)換成8 bit的TXD。為了使從機(jī)接收數(shù)據(jù)建立和保持時(shí)間有SCLK_out時(shí)鐘周期的余量,TXD采用SSI clock下降沿輸出,如圖2所示[8]。
圖2 SPI主機(jī)TXD與SCLK_out相位關(guān)系
時(shí)鐘de-skew電路由粗精度可調(diào)延遲電路和高精度可調(diào)延遲電路組成,粗精度可調(diào)延遲電路可以增大延遲范圍,高精度可調(diào)延遲電路可以提高延遲精度。de-skew模塊中,每條接收數(shù)據(jù)線(RXD[n])和RXD valid分別經(jīng)過1條高精度可調(diào)延遲線后送入串并轉(zhuǎn)化模塊。RX en gate信號(hào)經(jīng)過粗精度可調(diào)延遲電路后去門控SSI clock,得到門控時(shí)鐘gate SSI clock,該門控時(shí)鐘再通過高精度可調(diào)延遲線。串并轉(zhuǎn)化電路完成接收信號(hào)的串并轉(zhuǎn)化,并將其寫入接收FIFO。
狀態(tài)機(jī)模塊負(fù)責(zé)數(shù)據(jù)收、發(fā)過程的流程控制。復(fù)位后狀態(tài)機(jī)進(jìn)入空閑狀態(tài),當(dāng)檢測(cè)到發(fā)送FIFO非空并且從機(jī)接收FIFO非滿時(shí),狀態(tài)機(jī)進(jìn)入Assert SS狀態(tài),在該狀態(tài)ss_out_n信號(hào)生效,隨后進(jìn)入發(fā)送命令狀態(tài)。若是寫模式,在發(fā)送完命令后進(jìn)入發(fā)送數(shù)據(jù)狀態(tài),在發(fā)送數(shù)據(jù)過程中若主機(jī)發(fā)送FIFO空或從機(jī)接收FIFO將滿,則進(jìn)入停止發(fā)送狀態(tài)。在該狀態(tài)下,SCLK_out時(shí)鐘為低,直到發(fā)送條件恢復(fù),回到數(shù)據(jù)發(fā)送狀態(tài)完成數(shù)據(jù)發(fā)送。若是讀模式,在發(fā)送完命令后進(jìn)入等待狀態(tài),完成等待狀態(tài)后進(jìn)入接收狀態(tài),當(dāng)主機(jī)接收FIFO將滿時(shí)進(jìn)入停止接收狀態(tài)。在該狀態(tài)下,SCLK_out時(shí)鐘為低,直到接收條件恢復(fù),回到數(shù)據(jù)接收狀態(tài)。主機(jī)狀態(tài)轉(zhuǎn)移流程如圖3所示。
圖3 主機(jī)狀態(tài)轉(zhuǎn)移流程
SPI從機(jī)默認(rèn)工作在接收模式,接收到命令字段后根據(jù)讀寫命令切換工作模式。當(dāng)收到寫命令,SPI從機(jī)繼續(xù)工作在接收模式;當(dāng)收到讀命令,SPI從機(jī)切換到發(fā)送模式。SPI從機(jī)結(jié)構(gòu)與主機(jī)類似,如圖4所示。
圖4 SPI從接口模塊框架
狀態(tài)機(jī)模塊負(fù)責(zé)數(shù)據(jù)接收和發(fā)送的流程控制,為其他模塊提供控制信號(hào)。狀態(tài)機(jī)默認(rèn)為detect狀態(tài),當(dāng)收到寫命令時(shí)進(jìn)入接收數(shù)據(jù)狀態(tài),在該狀態(tài)中完成數(shù)據(jù)接收。當(dāng)數(shù)據(jù)傳輸完成后,狀態(tài)機(jī)回到初始狀態(tài)。從機(jī)收到讀請(qǐng)求命令后進(jìn)入等待狀態(tài),在該狀態(tài)中完成接收模式到發(fā)送模式的切換,完成收發(fā)模式切換后進(jìn)入發(fā)送數(shù)據(jù)狀態(tài)。當(dāng)發(fā)送FIFO為空時(shí),進(jìn)入發(fā)送停止?fàn)顟B(tài),在停止?fàn)顟B(tài)TX valid信號(hào)無效;當(dāng)發(fā)送FIFO非空時(shí),回到發(fā)送狀態(tài),直到發(fā)送數(shù)據(jù)完成,回到初始狀態(tài)。SPI從機(jī)狀態(tài)轉(zhuǎn)移流程如圖5所示。
圖5 SPI從機(jī)狀態(tài)轉(zhuǎn)移流程
自動(dòng)de-skew算法包含從機(jī)接收端de-skew和主機(jī)接收端de-skew。
從機(jī)接收端de-skew算法包含數(shù)據(jù)de-skew和時(shí)鐘de-skew。數(shù)據(jù)de-skew完成RXD各比特位對(duì)齊,時(shí)鐘de-skew使時(shí)鐘的跳變沿對(duì)齊數(shù)據(jù)的中點(diǎn)位置。分別從主機(jī)算法和從機(jī)算法2個(gè)方面進(jìn)行闡述。
2.1.1 主機(jī)算法
步驟一:調(diào)整SSI clock,使其處于低頻模式。本設(shè)計(jì)中,SSI clock為50 MHz,數(shù)據(jù)傳輸周期為20 ns,從機(jī)接收端的建立保持時(shí)間均有10 ns的余量。在該頻率下,對(duì)于skew不敏感,從機(jī)能正確接收數(shù)據(jù)。
步驟二:主機(jī)向從機(jī)發(fā)送訓(xùn)練序列0x00FF00FF00FF00FF,使得傳輸數(shù)據(jù)的每一比特都在不斷進(jìn)行0和1的跳變。
步驟三:等待10 μs,以便從機(jī)完成數(shù)據(jù)接收和延遲線的調(diào)整,再返回步驟二。重復(fù)步驟二、步驟三,直到完成從機(jī)接收端de-skew。
步驟四:將SSI clock調(diào)到正常工作頻率。
2.1.2 從機(jī)算法
步驟一:通過逐步增大接收數(shù)據(jù)線RXD[n]的延遲線長度,尋找RXD[n]的下降沿,得到時(shí)鐘上升沿與RXD[n]下降沿的間距,記為dn(n=0,1,2,…,7),如圖6所示。
圖6 RXD[n]下降沿與時(shí)鐘上升沿間距
找出d0到d7的最小值并記為dmin,將dn與dmin的差值作為RXD[n]的延遲值。如果延遲線調(diào)到最大延遲值都無法找到數(shù)據(jù)的下降沿,則進(jìn)入步驟二,否則進(jìn)入步驟三。
步驟二:通過不斷增大時(shí)鐘的延遲長度尋找數(shù)據(jù)RXD[n]的上升沿,將SCLK_in上升沿和數(shù)據(jù)RXD[n]上升沿的間距記為Rn(n=0,1,2,…,7),如圖7所示。
圖7 RXD[n]上升沿和時(shí)鐘上升沿的間距
找出R0到R7的最大值并記為dmax,將dmax與Rn的差值作為RXD[n]的延遲值。
步驟三:通過步驟一、步驟二完成數(shù)據(jù)之間的de-skew后,進(jìn)行時(shí)鐘de-skew。
若通過第一步完成數(shù)據(jù)de-skew,則逐步增大時(shí)鐘延遲尋找數(shù)據(jù)的上升沿,將SCLK_in上升沿與數(shù)據(jù)RXD上升沿的間距記為L,如圖8所示。
圖8 RXD上升沿與時(shí)鐘上升沿的間距
若通過第二步完成數(shù)據(jù)de-skew,則通過不斷調(diào)整數(shù)據(jù)RXD延遲長度尋找數(shù)據(jù)的下升沿,將SCLK_in的上升沿與數(shù)據(jù)RXD的下降沿的間距記為P,如圖9所示。
圖9 RXD下降沿與時(shí)鐘上升沿的間距
主機(jī)接收端de-skew算法包含數(shù)據(jù)de-skew和時(shí)鐘de-skew過程,數(shù)據(jù)de-skew在低頻傳輸模式下完成,時(shí)鐘de-skew在高頻傳輸模式下完成。
2.2.1 從機(jī)算法
當(dāng)從機(jī)發(fā)送FIFO處于非滿狀態(tài)時(shí),從機(jī)不斷向發(fā)送FIFO寫入訓(xùn)練序列0x00FF00FF00FF00FF,以便主機(jī)讀回,完成de-skew訓(xùn)練。
2.2.2 主機(jī)算法
步驟一:調(diào)整SSI Clock,使其處于低頻模式。本設(shè)計(jì)中SSI clock為50 MHz,數(shù)據(jù)傳輸周期為20 ns。
步驟二:通過逐步增大接收數(shù)據(jù)RXD[n]的延遲尋找RXD[n]的下降沿,得到時(shí)鐘上升沿與RXD[n]下降沿的間距記為dn′(n=0,1,2,…,7)。通過逐步增大RX_valid的延遲尋找RX_valid的上升沿,得到時(shí)鐘上升沿與RX_valid上升沿的間距記為d8′。找出d0′到d8′的最小值記為dmin′,將dn′與dmin′的差值作為RXD[n]的延遲值。如果步驟二中延遲線調(diào)到最大延遲值都無法找到數(shù)據(jù)的下降沿,則進(jìn)入步驟三,否則進(jìn)入步驟四。
步驟三:通過逐步增大時(shí)鐘的延遲尋找數(shù)據(jù)RXD[n]的上升沿,將SCLK_in上升沿和數(shù)據(jù)RXD[n]上升沿的間距記為Rn′(n=0,1,2,…,7)。通過逐步增大時(shí)鐘的延遲尋找RX_valid的下降沿,將SCLK_in上升沿和RX_valid下升沿的間距記為d8′。找出R0′到d8′的最大值記為dmax′,將dmax′與Rn′ 的差值作為RXD[n]的延遲值,將dmax′與d8′的差值作為RX_valid的延遲值
步驟四:調(diào)整SSI clock,使其處于正常工作頻率。本設(shè)計(jì)中SSI clock為200 MHz,數(shù)據(jù)傳輸周期為5 ns。
步驟五:完成時(shí)鐘de-skew,使得SSI clock上升沿對(duì)齊數(shù)據(jù)的中點(diǎn)位置。
de-skew后RXD與SSI clock的相位關(guān)系如圖10、圖11所示。
圖10 主機(jī)接收數(shù)據(jù)延遲小于SSI clock周期
圖11 主機(jī)接收數(shù)據(jù)延遲大于SSI clock周期
主機(jī)若不能正確讀到訓(xùn)練序列,則說明接收數(shù)據(jù)的延遲大于時(shí)鐘周期,即為圖11情況。在該情況下,通過逐步增加時(shí)鐘延遲,直到第1次能正確讀到訓(xùn)練序列,將此時(shí)的時(shí)鐘延遲記為Tstart。繼續(xù)逐步增加時(shí)鐘延遲,直到再一次讀到錯(cuò)誤的訓(xùn)練序列,將最后一次正確讀到訓(xùn)練序列時(shí)的時(shí)鐘延遲記為Tend。Tstart和Tend的均值即為時(shí)鐘的延遲值。
采用Synopsys的VCS仿真軟件搭建仿真環(huán)境,分析de-skew算法的性能[9,10]。SSI clock的低頻時(shí)鐘頻率為50 MHz,高頻時(shí)鐘頻率為200 MHz,延遲線的最大延遲為15 ns。從機(jī)接收端de-skew仿真波形如圖12所示,從機(jī)接收端de-skew前后對(duì)比如圖13所示。
圖12 從機(jī)接收端de-skew仿真波形
從圖13中可以看出,接收數(shù)據(jù)由于傳輸延遲差別,有效數(shù)據(jù)窗口較小,無法正確采樣數(shù)據(jù)。經(jīng)過deskew算法處理后,接收數(shù)據(jù)有效窗口較大,且SCLK時(shí)鐘的上升沿和下降沿對(duì)齊數(shù)據(jù)窗口的中間位置。
圖13 從機(jī)接收端de-skew前后波形對(duì)比
主機(jī)接收端de-skew仿真波形如圖14所示,主機(jī)接收端de-skew前后對(duì)比如圖15所示。
圖14 主機(jī)接收端de-skew仿真波形
圖15 主機(jī)接收端de-skew前后波形對(duì)比
從圖15中可以看出,接收數(shù)據(jù)由于傳輸延遲差別,有效數(shù)據(jù)窗口較小,無法正確采樣數(shù)據(jù)。經(jīng)過de-skew算法處理后,接收數(shù)據(jù)有效窗口較大,且SSI clock時(shí)鐘的上升沿對(duì)齊數(shù)據(jù)窗口的中間位置。
本設(shè)計(jì)采用雙沿采樣來提高SPI的傳輸帶寬,通過自動(dòng)de-skew算法消除后端布局布線和PCB走線引入數(shù)據(jù)間的skew以及數(shù)據(jù)與時(shí)鐘間的skew,降低后端設(shè)計(jì)和PCB設(shè)計(jì)的難度。此外,增加流量控制機(jī)制,根據(jù)FIFO的空、滿狀態(tài),通信中的任意一方可以暫停數(shù)據(jù)傳輸。