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