基于FPGA的串行外圍接口SPI設(shè)計(jì)與實(shí)現(xiàn)
摘要: SPI 總線是一個(gè)同步串行接口的數(shù)據(jù)總線,具有全雙工、信號(hào)線少、協(xié)議簡(jiǎn)單、傳輸速度快等特點(diǎn)。介紹了SPI 總線的結(jié)構(gòu)和工作原理,對(duì)4 種工作模式的異同進(jìn)行了比較,并著重分析了SPI 總線的工作時(shí)序。利用Verilog 硬件描述語言編寫出SPI 總線的主機(jī)模塊,經(jīng)ModelSim 仿真得出相應(yīng)的仿真波形。根據(jù)仿真波形分析,所設(shè)計(jì)的SPI 主機(jī)模塊的功能是正確的。最后在Xilinx ISE 中對(duì)該模塊進(jìn)行綜合與實(shí)現(xiàn),并在FPGA 上完成了下載與驗(yàn)證。
引言
SPI(串行外圍接口)總線,是一個(gè)同步串行接口的數(shù)據(jù)總線,它具有全雙工、信號(hào)線少、協(xié)議簡(jiǎn)單、傳輸速度快等優(yōu)點(diǎn)。由于串行總線的信號(hào)線比并行總線更少、更簡(jiǎn)單,越來越多的系統(tǒng)放棄使用并行總線而采用串行總線。在眾多串行總線中,SPI 總線與I2C 總線、CAN 總線、USB 等其他常用總線相比有很大優(yōu)勢(shì),如SPI 總線的數(shù)據(jù)傳輸速度可達(dá)若干Mbps, 比I2C 總線快很多。SPI 總線最典型的應(yīng)用就是主機(jī)與外圍設(shè)備(如EEPROM、Flash RAM、A/D 轉(zhuǎn)換器、LED 顯示器、實(shí)時(shí)時(shí)鐘等)之間的通信。
FPGA(現(xiàn)場(chǎng)可編程門陣列)是在PAL、GAL、PLD 等可編程器件的基礎(chǔ)上進(jìn)一步發(fā)展的產(chǎn)物,具有設(shè)計(jì)周期短、可重復(fù)編程、靈活性強(qiáng)等特點(diǎn)。用FPGA 設(shè)計(jì)的SPI 總線具有可擴(kuò)展性強(qiáng)、便于修改等優(yōu)點(diǎn)。只要對(duì)設(shè)計(jì)做簡(jiǎn)單的改動(dòng),即可對(duì)SPI 總線的數(shù)據(jù)位數(shù)、工作模式等進(jìn)行擴(kuò)展,充分發(fā)揮了FPGA 的優(yōu)勢(shì)。
1 SPI 總線的結(jié)構(gòu)和工作原理
SPI 總線區(qū)分主機(jī)(Master)和從機(jī)(Slave)兩部分,它的結(jié)構(gòu)框圖如圖1 所示。
圖1 SPI 總線結(jié)構(gòu)框圖
主機(jī)和從機(jī)之間通過4 根信號(hào)線連接,分別是SCK、MOSI、MISO、CS,它們的定義如下。
SCK:同步時(shí)鐘信號(hào),用來同步主機(jī)和從機(jī)的數(shù)據(jù)傳輸,由主機(jī)控制輸出,從機(jī)在SCK 的邊沿接收和發(fā)送數(shù)據(jù);MOSI:主機(jī)輸出、從機(jī)輸入信號(hào),主機(jī)在上升沿(或下降沿)通過該信號(hào)線發(fā)送數(shù)據(jù)給從機(jī),從機(jī)在下降沿(或上升沿)通過該信號(hào)線接收該數(shù)據(jù);MISO:主機(jī)輸入、從機(jī)輸出信號(hào),從機(jī)在上升沿(或下降沿)通過該信號(hào)線發(fā)送數(shù)據(jù)給主機(jī),主機(jī)在下降沿(或上升沿)通過該信號(hào)線接收該數(shù)據(jù);CS:從機(jī)片選信號(hào),由主機(jī)控制輸出。
其工作原理是: 當(dāng)沒有數(shù)據(jù)需要在主機(jī)和從機(jī)之間傳輸時(shí),主機(jī)控制SCK 輸出空閑電平,CS 輸出無效電平,SPI 總線處于空閑狀態(tài);當(dāng)有數(shù)據(jù)需要傳輸時(shí),主機(jī)控制CS 輸出有效電平,SCK輸出時(shí)鐘信號(hào),SPI 總線處于工作狀態(tài);在某個(gè)時(shí)鐘邊沿,主機(jī)和從機(jī)同時(shí)發(fā)送數(shù)據(jù),將數(shù)據(jù)分別傳輸?shù)組OSI 和MISO 上;在下一個(gè)時(shí)鐘邊沿,主機(jī)和從機(jī)同時(shí)接收數(shù)據(jù),分別將MISO 和MOSI上的數(shù)據(jù)接收并存儲(chǔ);當(dāng)數(shù)據(jù)全部傳輸完畢時(shí),主機(jī)控制SCK 輸出空閑電平,CS 輸出無效電平,SPI 總線重新回到空閑狀態(tài)。至此,一個(gè)完整的SPI 總線數(shù)據(jù)傳輸過程完成。
SPI 總線有兩個(gè)控制位:CPOL 和CPHA.將SCK 的空閑電平用IDLE 表示,非空閑電平用ACTIVE 表示。CPOL 用來選擇IDLE 的電平值。當(dāng)CPOL=0 時(shí),IDLE=0;當(dāng)CPOL=1 時(shí),IDLE=1.
CPHA 用來選擇接收數(shù)據(jù)的時(shí)刻。當(dāng)CPHA=0 時(shí), 接收時(shí)刻是IDLE-ACTIVE 邊沿;當(dāng)CPHA=1 時(shí),接收時(shí)刻是ACTIVE-IDLE邊沿。根據(jù)CPOL 和CPHA 的取值情況,SPI 總線共有4 種不同的工作模式。圖2 給出了SPI 總線在不同工作模式下的工作時(shí)序。
圖2 SPI 總線的工作時(shí)序
當(dāng)CPHA=0 時(shí),MOSI 和MISO 的時(shí)序有所不同,主要是第一個(gè)數(shù)據(jù)位MSB 的發(fā)送時(shí)刻不同。MOSI 的MSB 在SCK 的第一個(gè)IDLE-ACTIVE 邊沿的前半個(gè)周期由主機(jī)發(fā)送到MOSI 上;而MISO 的MSB 則在CS 信號(hào)的下降沿由從機(jī)發(fā)送到MISO 上。當(dāng)CPHA=1 時(shí),MOSI 和MISO 的時(shí)序完全相同。
2 SPI 主機(jī)模塊的設(shè)計(jì)
本文設(shè)計(jì)的SPI 主機(jī)模塊主要完成以下工作:
(1) 將主機(jī)收到的8 位并行數(shù)據(jù)轉(zhuǎn)換為串行數(shù)據(jù),并發(fā)送給從機(jī);(2) 接收來自從機(jī)的串行數(shù)據(jù),將其轉(zhuǎn)換為并行數(shù)據(jù),通過并行端口輸出;(3) 輸出從機(jī)所需要的輸入信號(hào)、時(shí)鐘信號(hào)SCK 和片選信號(hào)CS。
在數(shù)據(jù)串并轉(zhuǎn)換的過程中, 必須用到寄存器來存放臨時(shí)數(shù)據(jù)。一般情況下,發(fā)送數(shù)據(jù)需要1 個(gè)發(fā)送寄存器,接收數(shù)據(jù)需要1個(gè)接收寄存器,則至少需要2 個(gè)寄存器。在SPI 總線中,每發(fā)送1個(gè)數(shù)據(jù)位則發(fā)送寄存器多出1 個(gè)空閑位, 正好可以在半個(gè)周期后用來接收1 個(gè)數(shù)據(jù)位。為了減少資源消耗,可以用1 個(gè)移位寄存器來代替2 個(gè)獨(dú)立的接收寄存器和發(fā)送寄存器。圖3 所示為SPI 總線的硬件結(jié)構(gòu)框圖,其中MaSTer 和Slave 各使用1 個(gè)移位寄存器接收和發(fā)送數(shù)據(jù)。
圖3 SPI 總線的硬件結(jié)構(gòu)
為了實(shí)現(xiàn)對(duì)模塊的控制,除了clk、cs、sck、miso、mosi 這些信號(hào)之外,還需要一些其他信號(hào)。其中,rst 是復(fù)位信號(hào),用于SPI 模塊的初始化。en 是模塊的使能信號(hào),當(dāng)en=1 時(shí)模塊開始工作。
data_i 是待發(fā)送數(shù)據(jù)的8 位并行輸入端。data_o 是用于接收和發(fā)送數(shù)據(jù)的移位寄存器, 也是數(shù)據(jù)傳輸完成時(shí)已接收數(shù)據(jù)的8位并行輸出端,圖4 是所設(shè)計(jì)的SPI 主機(jī)模塊的框圖。
圖4 SPI 模塊框圖
[!--empirenews.page--]
下面是用Verilog HDL 設(shè)計(jì)的SPI 主機(jī)模塊(CPOL =0,CPHA=1)的主要程序,程序中省去了變量的聲明,并在注釋中對(duì)這些變量作了說明。
[!--empirenews.page--]
3 設(shè)計(jì)的仿真、綜合與實(shí)現(xiàn)
通過編寫測(cè)試平臺(tái),并使用Mentor Graphics 公司的仿真工具M(jìn)odelSim SE PLUS 6.1f 對(duì)該SPI 模塊進(jìn)行仿真,得到的仿真波形如圖5 所示。
圖5 SPI 模塊的仿真波形
從圖中可以看出,sck 的空閑電平IDLE=0,接收數(shù)據(jù)時(shí)刻是下降沿即ACTIVE-IDLE 邊沿, 故該SPI 模塊的工作模式是CPOL=0,CPHA=1,與設(shè)計(jì)一致。當(dāng)en=0 時(shí),cs=1,SPI 總線處于空閑狀態(tài)。當(dāng)en=1 時(shí),在下降沿cs=0,sck 輸出時(shí)鐘信號(hào),總線數(shù)據(jù)傳輸開始。同時(shí),data_o=data_i, 移位寄存器存入待發(fā)送數(shù)據(jù)11010111.在第1 個(gè)周期上升沿,主機(jī)通過mosi 發(fā)送data_o 最高位1 至從機(jī)。在第1 個(gè)周期下降沿,data_o 左移一位,多出一個(gè)空閑位data_o[0],主機(jī)通過miso 接收從機(jī)發(fā)送的數(shù)據(jù)最高位1,并將其存入data_o[0],data_o=10101111.依此類推,后面7 個(gè)周期的數(shù)據(jù)傳輸過程與第1 個(gè)周期類似。8 位數(shù)據(jù)全部傳輸完成之后,cs=1,一個(gè)完整的SPI 總線傳輸過程結(jié)束??梢园l(fā)現(xiàn),data_o中的數(shù)據(jù)被一個(gè)一個(gè)從主機(jī)發(fā)送到從機(jī),同時(shí)data_o 也被用來存儲(chǔ)從機(jī)發(fā)送的數(shù)據(jù)。8 個(gè)周期完成之后,data_o 中存儲(chǔ)的數(shù)據(jù)正是從機(jī)發(fā)送的數(shù)據(jù)10101101.綜合以上分析,該SPI 模塊的功能是正確的。
[!--empirenews.page--]
通過實(shí)驗(yàn),在Xilinx ISE 9.1i 中完成了對(duì)該模塊的綜合與實(shí)現(xiàn),并下載到Digilent 公司的FPGA 開發(fā)板Spartan-3E Starter 上進(jìn)行驗(yàn)證,實(shí)驗(yàn)結(jié)果正確。綜合工具使用ISE 自帶的XST,下載工具使用ISE 自帶的iMPACT.
4 結(jié)語
本文用Verilog 硬件描述語言設(shè)計(jì)了一個(gè)符合SPI 總線規(guī)范的SPI 主機(jī)模塊,使用仿真工具M(jìn)odelSim 對(duì)其進(jìn)行仿真并給出了仿真波形。在Xilinx ISE 中對(duì)該模塊進(jìn)行綜合與實(shí)現(xiàn),并在FPGA 上完成了下載與驗(yàn)證。該SPI 主機(jī)模塊的功能正確,工作穩(wěn)定,可擴(kuò)展性強(qiáng)。由于SPI 總線應(yīng)用范圍很廣,利用FPGA 可重復(fù)配置的優(yōu)點(diǎn),該模塊可以很方便地應(yīng)用于各種場(chǎng)合。本文作者創(chuàng)新點(diǎn):根據(jù)SPI 總線規(guī)范,用Verilog HDL 設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)帶有移位寄存器的SPI 總線模塊,具有簡(jiǎn)潔高效、便于修改、可擴(kuò)展性強(qiáng)等特點(diǎn)。