0 引言
在一些軍用芯片的早期設(shè)計中,一般先采用比較成熟的商用協(xié)議芯片進行軍用化改造(通常做成板卡形式),而商用芯片的軍用化改造主要體現(xiàn)在確定性、實時性、穩(wěn)定性、安全性等問題上,所以一般需要在商用協(xié)議芯片的上層加入較多的控制功能。FPGA以其資源豐富,易于組織流水和并行處理等優(yōu)點,為這種復(fù)雜控制提供了很好的選擇。而SPI在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時為PCB的布局上節(jié)省空間,因此在基于FPGA的讀寫接口設(shè)計中,高速SPI是一種很好的選擇。
1 SPI結(jié)構(gòu)
SPI (Serial Peripheral Interface-串行外圍設(shè)備接口)是Motorola公司推出的一種高效率全雙工同步串行數(shù)據(jù)接口,以主從模式工作,廣泛應(yīng)用于FLASH,實時時鐘,AD轉(zhuǎn)換器等。SPI串行外圍設(shè)備總線根據(jù)串行同步時鐘極性(CPOL)和時鐘相位(CPHA)兩個參數(shù)的設(shè)置分為四種工作方式(SPO,SP1,SP2,SP3)。本板卡選用的片外存儲器AT25F1024僅支持0和3模式,為簡化設(shè)計,本設(shè)計的SPI時鐘采用SP0模式(CP-OL=0,CPHA=0),時鐘極性為低電平,時鐘相位串行時鐘上升沿采樣數(shù)據(jù),下降沿數(shù)據(jù)輸出.SPI為主從工作方式,主設(shè)備由三部分構(gòu)成,SPI_CFG_LOAD配置加載模塊可自動讀取存儲器FLASH的值,并加載到片內(nèi)DPRAM中。主機通過配置SPI_CTRL控制模塊相應(yīng)的寄存器,來完成對片外FLASH的訪問。SPI結(jié)構(gòu)框圖如圖1所示。
2 高速SPI接口設(shè)計
2.1 配置加載模塊的設(shè)計
SPI_CFG_LOAD配置加載模塊主要完成從片外FLASH讀取數(shù)據(jù),并將數(shù)據(jù)存入片內(nèi)DPRAM中的功能。圖2給出了對應(yīng)的狀態(tài)機設(shè)計。
各狀態(tài)說明如下:
SPI_IDLE:空閑狀態(tài),如果主機配置了寄存器SPICFGSTART,狀態(tài)就跳到SPI_TX_BUFFER狀態(tài)。
SPI_TX_BUFFER:在此狀態(tài)主要向SPI_CTRL模塊的發(fā)送緩沖區(qū)地址0填入8位讀命令及讀取數(shù)據(jù)的三字節(jié)起始地址,狀態(tài)機之間進入下一狀態(tài)。
SPI_CTRL_REG:在這一狀態(tài),配置SPI_CTRL模塊CTRL寄存器的值,包括一次讀操作搬運的數(shù)據(jù)位數(shù),數(shù)據(jù)加載方式。如果配置GO位為“1”,表明可以開始進行讀傳輸,進入下一狀態(tài)SPI_CS。
SPI_CS:配置SPI_CTRL)模塊寄存器SS位的值,以選擇傳輸數(shù)據(jù)的從設(shè)備。
SPI_WAIT:本狀態(tài)判斷讀操作的起始地址和終止地址是否在要求的范圍內(nèi),如果處于相應(yīng)的范圍,地址自動加64后,狀態(tài)機進入SPI_SS_ UA狀態(tài)。
SPI_SS_UA:等待片內(nèi)DPRAM的寫操作完成,如果DPRAM_WR_END_T信號為高,說明當(dāng)前的傳輸操作已經(jīng)結(jié)束,可以進入下一次的訪問,狀態(tài)機進入SPI_IDLE狀態(tài)。
2.2 控制模塊的設(shè)計
SPI_CTRL控制模塊可將發(fā)送緩沖區(qū)0的數(shù)據(jù)讀出來,經(jīng)過并串轉(zhuǎn)換,發(fā)送到串行線SI上,并且控制從串行線SO上接收數(shù)據(jù),存儲在接收緩沖區(qū),并行數(shù)據(jù)轉(zhuǎn)換成串行輸出由并串轉(zhuǎn)換狀態(tài)機來控制實現(xiàn),見圖3。
各狀態(tài)含義如下:
TX_IDLE:等待主機設(shè)置控制寄存器的GO位,如果置“1”,表示準(zhǔn)備開始傳輸,跳入下一狀態(tài)TX_ADDR。
TX_ADDR:當(dāng)傳輸長度小于等于32位時,跳入下一狀態(tài)PARALELL_DATA。
PARALELL_DATA:如果GO為1,在此狀態(tài)TIP將被置“1”,說明傳輸開始,傳輸?shù)挠嫈?shù)器開始計數(shù)。
SERIAL_DATA:并行數(shù)據(jù)轉(zhuǎn)換為串行數(shù)據(jù)發(fā)送出去,當(dāng)CNT_SHIFT計數(shù)器減到0時,傳輸結(jié)束,狀態(tài)跳入TX_IDLE。
2.3 串行移位時鐘設(shè)計
SPI串行線上的主從設(shè)備必須根據(jù)具體要求設(shè)置匹配的傳輸時序模式,時序只有匹配,數(shù)據(jù)傳輸才能正常進行。如果設(shè)置的不匹配,可能導(dǎo)致數(shù)據(jù)接收方和發(fā)送方在同一時鐘沿作用,而使數(shù)據(jù)傳輸失敗。本設(shè)計中的時鐘僅支持SP0模式,即串行時鐘處于空閑電平時,空閑狀態(tài)時鐘的極性電平為低,在時鐘的前沿采樣數(shù)據(jù),時鐘后沿串行線上數(shù)據(jù)變化。
在采樣時刻,線上數(shù)據(jù)必須已經(jīng)穩(wěn)定可靠,因此數(shù)據(jù)發(fā)送端設(shè)備應(yīng)提前將數(shù)據(jù)移出到數(shù)據(jù)線上,本SPI接口電路設(shè)計在同一串行移位時鐘周期中的前一個時鐘沿(即相反時鐘變化方向)將數(shù)據(jù)移出,移位時鐘設(shè)計為系統(tǒng)時鐘的兩分頻,為40/2MHz。
2.4 SPI相關(guān)寄存器描述
在本設(shè)計中,共有四種32位寄存器,包括控制寄存器,從設(shè)備選擇寄存器,加載配置數(shù)據(jù)起始寄存器以及加載配置數(shù)據(jù)完成寄存器。
控制寄存器用來控制配置信息加載方式,即:片外FLASH加載方式或主機直接加載方式。當(dāng)選擇片外FLASH加載方式時,控制寄存器還用來控制一次數(shù)據(jù)傳輸?shù)拈L度。CTRL寄存器的具體描述見表1。
從設(shè)備選擇寄存器的SS位置“1”時,表示選中從設(shè)備。置“0”表示不選擇任何從設(shè)備,本設(shè)計僅支持一個從設(shè)備。
加載配置數(shù)據(jù)起始寄存器的SPICFGSTART位置“1”時,配置數(shù)據(jù)自動從FLASH中讀取并寫入到DPRAM中,置“0”不進行讀FLASH操作。
加載配置數(shù)據(jù)完成寄存器為只讀寄存器,用來判斷數(shù)據(jù)是否已經(jīng)加載完成。
2.5 SPI緩沖區(qū)設(shè)計
圖4所示為主機可直接訪問的SPI接口內(nèi)部DPRAM發(fā)送和接收數(shù)據(jù)緩沖區(qū)。
SPI發(fā)送數(shù)據(jù)緩沖區(qū)深度65,數(shù)據(jù)位寬32位,其中地址22’h 3e0600存放訪問AT25F1024存儲器的指令,當(dāng)進行寫操作時,從數(shù)據(jù)發(fā)送緩沖區(qū)最低位地址22’h3e0604開始,將數(shù)據(jù)搬運出來,串行發(fā)送到AT25F1024存儲器。
SPI接收數(shù)據(jù)緩沖區(qū)深度65,數(shù)據(jù)位寬32位,其中地址22’h3e0400緩存讀取的AT25F1024配置和狀態(tài)信息,偏移地址22’h3e0404~22’ h3e0500緩存指定FLASH讀取的總線配置數(shù)據(jù)數(shù)據(jù),最大緩存2048位。
3 數(shù)據(jù)搬運時間
3.1 主機寫片外FLASH的時間
本設(shè)計使用的存儲器AT25F1024緩沖數(shù)據(jù)寄存器大小2048位,寫使能需要8個串行時鐘周期,向片外FLASH傳輸2048位數(shù)據(jù)需要2080個串行時鐘周期(包括了32位寫指令的傳輸數(shù)據(jù)),這樣寫一次需要時間為2088個時鐘周期,主機將1Mbits的FLASH填滿,時間大約為2088 x50ns(串行時鐘40/2MHz)×512 (填滿1Mbits需要512次寫操作)=53.4ms。讀1Mbits的FLASH需要的時間約為2080x50x512=53.2ms。圖5所示為主機寫片外FLASH時序圖。
3.2 讀取數(shù)據(jù)并加載到片內(nèi)DPRAM的時間
通過SO管腳讀取AT25F1024的過程按下面順序執(zhí)行,當(dāng)片選拉低選擇此器件之后,通過SI線發(fā)送讀指令,后面跟隨要讀的地址(三個字節(jié)地址),指令傳輸完之后,SI線上的任何數(shù)據(jù)將被忽略。指定地址的數(shù)據(jù)接著被移出到SO線上。如果僅讀取一個字節(jié),當(dāng)數(shù)據(jù)讀出來之后,CS信號驅(qū)動為高。讀指令繼續(xù)時,字節(jié)地址自動增加,并且數(shù)據(jù)不斷被搬運出來。
AT25F1024緩沖數(shù)據(jù)寄存器大小2048位,在本設(shè)計中,寫使能需要32個串行時鐘周期,這樣讀取一次需要時間為2080個時鐘周期,將片內(nèi)DPRAM(DPRAM大小14940字節(jié))填滿,時間大約為2080x50ns(串行時鐘40/2MHZ)x59(填滿片內(nèi)DPRAM需要大約59次讀操作)=6.13ms。
4 結(jié)束語
本文從應(yīng)用的實際需求出發(fā),在FPGA中實現(xiàn)了對外部FLASH進行讀寫的高速SPI接口,并已在某型板卡中成功應(yīng)用。本文重點用有限狀態(tài)機的形式對各部分的工作原理和實現(xiàn)方法進行了描述。在FPGA資源比較緊張,限制管腳的使用數(shù)目,對速率又有比較高的需求的情況下,利用此SPI接口進行數(shù)據(jù)的加載或者固化,具有很高的應(yīng)用價值。