四川九洲電器集團(tuán)公司 王維維 馮 碩 昌 暢
一種SPI串口模塊的FPGA實(shí)現(xiàn)
四川九洲電器集團(tuán)公司 王維維 馮 碩 昌 暢
主要介紹了一種在FPGA中實(shí)現(xiàn)SPI總線通信串口模塊的方法,并給出了設(shè)計(jì)方案、仿真結(jié)果以及硬件測試結(jié)果。本設(shè)計(jì)可以廣泛應(yīng)用于常規(guī)處理控制器件(單片機(jī)、DSP等)同外部外設(shè)及其它處理器之間進(jìn)行SPI數(shù)據(jù)通信的系統(tǒng)中,特別是需要快速構(gòu)建數(shù)據(jù)通信系統(tǒng)的應(yīng)用環(huán)境,在通信、消費(fèi)電子及工業(yè)控制等諸多領(lǐng)域有廣闊的應(yīng)用前景。
SPI接口;VHDL;FPGA
串行外設(shè)接口(SPI)是一個(gè)高速同步的串行輸入/輸出口。SPI通常用于處理器和外部外設(shè)以及其它處理器之間進(jìn)行通信。很多新型器件如LCD模塊、FLASH、ADC、EEPROM存儲器以及時(shí)鐘芯片等都采用了SPI接口。但在實(shí)際開發(fā)應(yīng)用中,若主控制器無SPI接口或需要與多個(gè)具有SPI接口的外設(shè)通信,就要使用主控制器的I/O口通過軟件來模擬,這在很大程度上限制了其應(yīng)用給數(shù)據(jù)傳輸帶來不便。所以采用硬件來實(shí)現(xiàn)SPI接口擴(kuò)充的方法最為可行。
當(dāng)前,基于主從處理器結(jié)構(gòu)的系統(tǒng)架構(gòu)已經(jīng)成為一種主流(如DSP+FPGA,MCU+FPGA等)。FPGA優(yōu)點(diǎn)主要在于它有很強(qiáng)的靈活性,即其內(nèi)部的具體邏輯功能可以根據(jù)需要配置,對電路的修改和維護(hù)很方便。傳統(tǒng)SPI接口的FPGA實(shí)現(xiàn)往往采用廠家提供的IP核實(shí)現(xiàn),這種方法雖能基本滿足SPI通信要求,但設(shè)計(jì)不夠靈活,不利于功能擴(kuò)展?;诖?,提出一種新的基于FPGA的SPI串口模塊實(shí)現(xiàn)方法。
SPI串行接口運(yùn)用4條線可與多種標(biāo)準(zhǔn)中心器件間接接口:串行時(shí)鐘線SPICLK,主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線SPISIMO,主機(jī)輸入/從機(jī)輸出數(shù)據(jù)線SPISOMI和低電平有效的從機(jī)選通信號線SPI_CS。
SPICLK為主機(jī)時(shí)鐘線,是從機(jī)的一個(gè)輸入,為SPISOMI數(shù)據(jù)的發(fā)送和接收提供同步時(shí)鐘信號。時(shí)鐘的相位(CPHA)與極性(CPOL)可以用來控制數(shù)據(jù)的傳輸。CPOL=“0”表示SCLK的靜止?fàn)顟B(tài)為低電平,CPOL=“1”則表示SCLK的靜止?fàn)顟B(tài)為高電平。時(shí)鐘相位(CPHA)可以用來選擇兩種不同的數(shù)據(jù)傳輸模式。如果CPHA=“0”,數(shù)據(jù)在信號SPI_CS聲明后的第一個(gè)SCLK邊沿有效。而當(dāng)CPHA=“1”時(shí),數(shù)據(jù)在信號SPI_CS聲明后的第二個(gè)SCLK邊沿才有效。因此,主機(jī)與從機(jī)中SPI設(shè)備的時(shí)鐘相位和極性必須要一致才能進(jìn)行通信。
SPI有兩種工作模式:主模式和從模式。工作在主模式下,不管是發(fā)送還是接收數(shù)據(jù),SPICLK為整個(gè)串行通信網(wǎng)絡(luò)提供時(shí)鐘。串行數(shù)據(jù)發(fā)送時(shí),首先發(fā)送的是最高有效位(MSB),時(shí)鐘信號的1次作用對應(yīng)1位數(shù)據(jù)的發(fā)送(SPISIMO)和另1位數(shù)據(jù)的接收(SPISOMI)。工作在從模式下,不管是發(fā)送還是接收數(shù)據(jù),一直必需在SPICLK信號作用下停止,并且SPI_CS信號必需有效。1個(gè)典型的SPI系統(tǒng)包括一個(gè)主MCU和1個(gè)或幾個(gè)從外圍器件。
SPI主模式的數(shù)據(jù)接收時(shí)序見圖1。
SPI主模式的數(shù)據(jù)發(fā)送時(shí)序見圖2。
本設(shè)計(jì)按一個(gè)默認(rèn)數(shù)據(jù)通信速率(10Mbps)、時(shí)鐘模式(無相位延時(shí)的下降沿)、主/從工作方式(主SPI模式)進(jìn)行SPI數(shù)據(jù)的收發(fā)。可通過外部處理控制器對本模塊進(jìn)行各種通信參數(shù)的動態(tài)配置,以適應(yīng)不同的通信速率、時(shí)鐘模式、工作方式、數(shù)據(jù)長度等情況。配置完畢后,即可開始SPI數(shù)據(jù)的收發(fā)過程。
圖1 SPI主模式數(shù)據(jù)接收時(shí)序
圖2 SPI主模式數(shù)據(jù)發(fā)送時(shí)序
圖3 SPI串口模塊系統(tǒng)框圖
圖5 SPI主模式數(shù)據(jù)發(fā)送流程
圖4 SPI主模式數(shù)據(jù)接收流程
圖6 仿真結(jié)果圖
本設(shè)計(jì)中增加了一根主/從SPI方的握手信號線SPI_STATUS,該信號線在從SPI方發(fā)送數(shù)據(jù)時(shí)被從方拉為低電平,而在從SPI方接收數(shù)據(jù)時(shí)被從方設(shè)置為高電平。
根據(jù)SPI總線的原理,本設(shè)計(jì)分為兩大功能模塊:數(shù)據(jù)接收及協(xié)議解析、數(shù)據(jù)發(fā)送處理。該SPI串口模塊系統(tǒng)框圖如圖3所示。
在這些子模塊中,數(shù)據(jù)接收FIFO和數(shù)據(jù)發(fā)送FIFO用來做接收、發(fā)送數(shù)據(jù)的FIFO。通信參數(shù)配置單元供處理控制器讀寫配置SPI的各種參數(shù)。對外并行接口單元負(fù)責(zé)與外部處理控制器進(jìn)行數(shù)據(jù)交互。串行數(shù)據(jù)接收、命令解析及中斷產(chǎn)生單元完成串行數(shù)據(jù)接收、通信命令解析及產(chǎn)生中斷信號通知處理控制器進(jìn)行數(shù)據(jù)接收操作。串行時(shí)鐘產(chǎn)生及收發(fā)控制單元用來發(fā)生主模式下的時(shí)鐘信號,同時(shí)對數(shù)據(jù)的接收或者發(fā)送進(jìn)行功能切換。串行數(shù)據(jù)發(fā)送處理單元負(fù)責(zé)把并行進(jìn)來的數(shù)據(jù)串行傳出,完成對數(shù)據(jù)發(fā)送的處理。
(1)數(shù)據(jù)接收及協(xié)議解析
當(dāng)從SPI方發(fā)送數(shù)據(jù)的時(shí)刻到來時(shí),本設(shè)計(jì)檢測到狀態(tài)線SPI_STATUS為“低”,則串行時(shí)鐘產(chǎn)生及收發(fā)控制單元立即啟動接收邏輯,對外輸出串行時(shí)鐘SPICLK信號和選通信號SPI_CS,同時(shí)在SPICLK上升沿時(shí)刻進(jìn)行數(shù)據(jù)采樣,并將串行數(shù)據(jù)進(jìn)行相應(yīng)緩存。
每當(dāng)采樣數(shù)據(jù)構(gòu)成一個(gè)完整字節(jié)時(shí),由接收模塊將收到的數(shù)據(jù)存入“數(shù)據(jù)接收FIFO”,同時(shí)對串口數(shù)據(jù)中的特殊字段進(jìn)行協(xié)議解析。過程如下:先檢索收全數(shù)據(jù)同步頭字節(jié)“AAH AAH”后,對后面接收的完整字節(jié)進(jìn)行+1計(jì)數(shù)處理,再檢索收到串口數(shù)據(jù)總長度字節(jié)后,判斷已收到的字節(jié)總數(shù)是否達(dá)到串口數(shù)據(jù)總長度值。如果達(dá)到接收數(shù)據(jù)總長度值,則表示一幀數(shù)據(jù)命令接收完整,此處由接收模塊置出“命令數(shù)據(jù)接收完整”標(biāo)志;同時(shí),當(dāng)檢測到狀態(tài)線SPI_STATUS的上升沿到來,給出數(shù)據(jù)接收完畢中斷標(biāo)志信號int_rxd及時(shí)中斷處理控制器,通知外部控制器讀取數(shù)據(jù)進(jìn)行處理,而不必每接收到1個(gè)字節(jié)就中斷一次,避免了主程序被頻繁中斷。
目前,本設(shè)計(jì)的接收FIFO和發(fā)送FIFO深度均設(shè)定為2048字節(jié),可以緩存大量的通信數(shù)據(jù),而不會將先前收到的數(shù)據(jù)覆蓋,外部處理控制器可以在處理完其它緊要任務(wù)后,再來進(jìn)行SPI數(shù)據(jù)的讀取和后續(xù)處理,而不必?fù)?dān)心已接收的SPI數(shù)據(jù)會丟掉。
接收數(shù)據(jù)的流程圖如圖4所示。
(2)數(shù)據(jù)發(fā)送處理
當(dāng)需要發(fā)送SPI數(shù)據(jù)時(shí),外部處理控制器將需要發(fā)送的所有數(shù)據(jù)依次寫入本設(shè)計(jì)的“數(shù)據(jù)發(fā)送FIFO”中,再對本設(shè)計(jì)另一個(gè)地址單元寫入“啟動發(fā)送命令”后,即可啟動數(shù)據(jù)發(fā)送模塊發(fā)送數(shù)據(jù)。該模塊實(shí)時(shí)判定數(shù)據(jù)發(fā)送FIFO是否為空,若FIFO內(nèi)有數(shù)據(jù)則立即對外輸出串行時(shí)鐘SPICLK信號和選通信號SPI_CS,并在SPICLK的下降沿時(shí)刻對取出的數(shù)據(jù)進(jìn)行發(fā)送,首先發(fā)送的是最高有效位(MSB)。即對主程序而言,就是向一特定地址寫入所有需要發(fā)送的數(shù)據(jù),再寫入一個(gè)啟動發(fā)送命令即可自動完成全部數(shù)據(jù)的發(fā)送,無需進(jìn)行發(fā)送流程控制。
發(fā)送數(shù)據(jù)的流程圖如圖5所示。
為了保證代碼的準(zhǔn)確性,首先應(yīng)根據(jù)模塊功能需求來編寫相應(yīng)測試向量作為本SPI模塊的輸入激勵,然后經(jīng)過查看模塊的輸出結(jié)果,判定本SPI模塊的各項(xiàng)功能是否正確。
采用了XILINX公司的EDA編譯軟件平臺ISE10.1,將用VHDL語言描述好的SPI接口模塊進(jìn)行了綜合,然后用modelsim軟件進(jìn)行仿真。在建立測試平臺時(shí),首先建立模擬從SPI方數(shù)據(jù)發(fā)送的模塊,同時(shí)建立模擬主SPI方數(shù)據(jù)發(fā)送的模塊,再將接收/發(fā)送數(shù)據(jù)內(nèi)容進(jìn)行比較、驗(yàn)證。在仿真軟件的輔助分析下,得到了正確的結(jié)果。仿真結(jié)果如圖6所示。
仿真通過后,將整個(gè)設(shè)計(jì)工程文件經(jīng)綜合后的EDIF文件提交給ISE進(jìn)行布局、布線后,把所生成的mcs文件下載到XILINX公司的FPGA芯片XC3S400中運(yùn)行,結(jié)果與在modelsim中的仿真結(jié)果一致,該SPI總線接口模塊能達(dá)到所要求實(shí)現(xiàn)的性能,具有很強(qiáng)的實(shí)用性。
本設(shè)計(jì)以FPGA為硬件平臺,應(yīng)用VHDL語言進(jìn)行程序編制??蓪?shí)現(xiàn)對SPI通信數(shù)據(jù)的自動接收和發(fā)送,也可由外部程序?qū)υ揝PI串口進(jìn)行快速配置,從而完成串口通信速率、時(shí)鐘模式、工作方式、數(shù)據(jù)長度等的動態(tài)更改。
通過簡單的程序復(fù)用,該設(shè)計(jì)可擴(kuò)充為多路SPI數(shù)據(jù)通信接口,一方面彌補(bǔ)了常規(guī)處理控制器件(單片機(jī)、DSP等)所自帶的SPI硬件串口操作繁瑣、功能受限的不足,另一方面也把單片機(jī)、DSP從頻繁的數(shù)據(jù)查詢或數(shù)據(jù)中斷中解放出來,從而投入更多精力到其它的功能控制中。
[1]侯伯亨,顧新,編著.VHDL硬件描述語言與數(shù)字邏輯電路設(shè)計(jì)[M].西安電子科技大學(xué)出版社,1999.
[2]孫豐軍,余春暄.SPI串行總線接口的Verilog實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2005.
王維維(1980—),男,陜西人,2002年畢業(yè)于武漢大學(xué),主要從事電子信息方面工作。
馮碩(1984—),男,四川人,2007年畢業(yè)于電子科技大學(xué),主要從事電子信息方面工作。
昌暢(1987—),男,重慶人,2009年畢業(yè)于四川大學(xué),主要從事電子信息方面工作。