楊梓鶴,彭秋雨,李湛藝,程曉迪
(航天工程大學指揮學院,北京 101416)
串行接口具有全雙工通信方式、信號線較少、協(xié)議簡單、傳輸速度快等優(yōu)點,使其成為傳輸接口發(fā)展比較常用的一種通信方式。在系統(tǒng)與各種外圍設備電路的通信接口中,由于SPI總線接口協(xié)議在數(shù)據(jù)傳輸速度可達幾兆比特每秒,其傳輸速率遠遠高于其他的串行接口,SPI總線接口協(xié)議較其他常用串行接口有很大優(yōu)勢。SPI總線被廣泛應用在串口接口中,其中最典型的應用是微處理器與外設之間的通信,比如在微處理器與存儲器、FLASH、時鐘、模數(shù)轉換器及各種傳感器等[1-5]。采用FPGA硬件方式來實現(xiàn)SPI接口,既簡單,速度又很快,可以實現(xiàn)主從設備之間的高速串行通信。按照總線的電氣特性,本設計基于FPGA設計并實現(xiàn)了SPI總線接口,該總線接口具有數(shù)據(jù)傳輸快、易調試、配置靈活性好等優(yōu)點[6-7]。
SPI接口是一種全雙工、三線通信的系統(tǒng),是常用的工業(yè)標準同步串行接口,它允許主機處理器與各種外圍設備之間的通信方式是串行通信。在SPI接口中,主/從機之間數(shù)據(jù)的傳輸需要1個時鐘信號和2條數(shù)據(jù)線,所以SPI總線區(qū)分主機(Master)和從機(Slave)2部分,結構框圖如圖1所示。
圖1 SPI總線結構框圖
主機和從機之間SPI總線由4根線構成:①SCK。串行同步時鐘信號,用來同步主機和從機的數(shù)據(jù)傳輸,由主機控制輸出,從機在SCK的邊沿接收或發(fā)送數(shù)據(jù)。②MOSI。主機輸出/從機輸入線,主機在上升沿(或下降沿)通過該信號線發(fā)送數(shù)據(jù)給從機,從機在下降沿(或上升沿)通過該信號線接收該數(shù)據(jù)。③MISO。主機輸入/從機輸出線,從機在上升沿(或下降沿)通過該信號線發(fā)送數(shù)據(jù)給主機,主機在下降沿(或上升沿)通過該信號線接收該數(shù)據(jù)。④SS。從機片選信號線,它同樣是由主機控制輸出[8-9]。
當沒有數(shù)據(jù)需要在主機和從機之間傳輸時,主機控制SCK輸出空閑電平,片選信號SS輸出無效電平,SPI總線處于空閑狀態(tài);當有數(shù)據(jù)需要傳輸時,主機控制SS輸出有效電平,SCK輸出時鐘信號,SPI總線處于工作狀態(tài);在某個時鐘邊沿,主機和從機同時發(fā)送數(shù)據(jù),將數(shù)據(jù)分別傳輸?shù)組OSI和MISO上;在下一個時鐘邊沿,主機和從機同時接收數(shù)據(jù),分別將MISO和MOSI上的數(shù)據(jù)接收并存儲;當數(shù)據(jù)全部傳輸完畢時,主機控制SCK輸出空閑電平,片選信號SS輸出無效電平,SPI總線重新回到空閑狀態(tài)。
SPI總線中所有的數(shù)據(jù)傳輸由串行時鐘SCK來進行同步,每個時鐘脈沖傳送1比特數(shù)據(jù)。SCK由主機產(chǎn)生,是從機的一個輸入。時鐘的相位(CPHA)與極性(CPOL)可以用來控制數(shù)據(jù)的傳輸。CPOL是用來決定SCK時鐘信號空閑時的電平。CPOL為0時,空閑電平為低;CPOL為1時,空閑電平為高。時鐘相位(CPHA)用來決定采樣時刻,即可以用來選擇2種不同的數(shù)據(jù)傳輸模式,當CPHA為0時,數(shù)據(jù)在片選信號SS有效后的第一個SCK邊沿有效;而當CPHA為1時,數(shù)據(jù)在片選信號SS有效后的第二個SCK邊沿才有效,因此,主機與從機中總線設備的時鐘相位和極性必須要一致,主/從機之間才能進行通信。圖2和圖3分別為不同相位(CPHA)與極性(CPOL)的時鐘控制下的數(shù)據(jù)傳輸模式時序圖。
圖2 CPHA=0時SPI總線數(shù)據(jù)傳輸時序
圖3 CPHA=1時SPI總線數(shù)據(jù)傳輸時序
設計使用Verilog HDL硬件描述語言描述SPI總線接口模塊,基于FPGA器件來實現(xiàn)[10-14]。
設計的SPI總線接口完成工作有:①將主機收到的16位并行數(shù)據(jù)轉換為串行數(shù)據(jù),并發(fā)送給從機;②接收來自從機的串行數(shù)據(jù),將其轉換為并行數(shù)據(jù),通過并行端口輸出;③輸出從機所需要的輸入信號、時鐘信號SCK和片選信號SS。
本文設計的SPI總線接口主機模塊,為了對SPI接口模塊的控制,除了SS、SCK、MISO、MOSI這些基本信號之外,還需要控制使能信號。其中,clk為外部時鐘信號,rst_n為復位信號,data_wr為待發(fā)送數(shù)據(jù)的16位并行輸入端,data_rd為用于接收和發(fā)送數(shù)據(jù)的移位寄存器,CPHA為SPI工作在不同時序模式選擇,send_req為發(fā)送請求信號,send_ack為發(fā)送應答信號,recv_req為接收請求信號,recv_ack為接收應答信號。SPI模塊框圖如圖4所示。
圖4 SPI模塊框圖
本設計采用TOP-DOWN設計方法,把系統(tǒng)劃分為幾個子模塊,包括通信模塊、控制模塊、FIFO模塊及數(shù)據(jù)收發(fā)模塊等。
2.3.1 通信模塊
通信模塊實現(xiàn)與微處理器之間的通信,接收微處理器的數(shù)據(jù)和指令,通過指令解析,發(fā)出控制信號。該模塊定義的寄存器包括:①發(fā)送數(shù)據(jù)寄存器。接收微處理器發(fā)送的數(shù)據(jù),而后暫存在緩沖存儲器中。②接收數(shù)據(jù)寄存器。當收到“讀數(shù)據(jù)”指令時,該寄存器將從緩沖寄存器中讀入數(shù)據(jù)且通過數(shù)據(jù)總線發(fā)送至微處理器。③指令寄存器。接收微處理器的指令,通過指令解析后,往其他模塊發(fā)出相應的控制信號,包括發(fā)送數(shù)據(jù)指令、讀數(shù)據(jù)指令、復位指令。④狀態(tài)寄存器??刂颇K將狀態(tài)機狀態(tài)寫入該寄存器,供主機查詢SPI總線工作狀態(tài)。
2.3.2 控制模塊
控制模塊是設計的核心。與其他設計方案相比,狀態(tài)機有很大的優(yōu)越性,比如設計結構簡單、程序層次分明、運行速度較快和可靠性高,因此控制模塊采用狀態(tài)機來實現(xiàn)。根據(jù)SPI總線的工作原理,可將總線分為4種狀態(tài),各狀態(tài)之間的關系如圖5所示。
圖5 SPI控制模塊示意圖
2.3.3 FIFO模塊
由于微處理器的數(shù)據(jù)速率遠大于串口輸出速率,所以必須先將數(shù)據(jù)保存于緩沖區(qū),F(xiàn)IFO模塊的設計中,容量應根據(jù)通信數(shù)據(jù)量的大小來確定。設計中,通信數(shù)據(jù)量不大,設計為保證速度與功耗的最優(yōu),縮短開發(fā)周期,可通過調用的Altera的FIFO IP核來實現(xiàn)。設置FIFO參數(shù):存儲的數(shù)據(jù)寬度、數(shù)據(jù)深度。FIFO模塊包括基準時鐘線、數(shù)據(jù)總線、標志信號線。
2.3.4 數(shù)據(jù)收發(fā)模塊
該子模塊實現(xiàn)與從設備之間數(shù)據(jù)通信。在主機模式下,將從微處理器的信號經(jīng)過data_wr讀到并行數(shù)據(jù)進行并串變換處理,存入FIFO中,并發(fā)出驅動時鐘和片選控制信號,然后通過MOSI端口從機輸出數(shù)據(jù)。在從機模式下將串行輸入的數(shù)據(jù)接收,并對數(shù)據(jù)進行串并變換處理后寫入FIFO模塊中。
設計的SPI通過Quartus II軟件編譯后,編寫設計測試代碼,并使用仿真工具Modelsim SE-64 10.2c對所設計的SPI接口模塊進行仿真測試,CPHA=0、CPHA=1收發(fā)16位數(shù)據(jù)的仿真結果如圖6、7所示。
圖6 SPI模塊CPHA=0仿真波形
如圖6所示,SPI模塊的工作模式是CPOL=1,CPHA=0。當rst_n為0時,總線處于空閑狀態(tài),總線處于復位狀態(tài)。當rst_n為1時,主機發(fā)出發(fā)送請求信號send_req后,等待發(fā)送數(shù)據(jù),從機等到接收應答信號recv_ack狀態(tài)由0變?yōu)?,并做好接收數(shù)據(jù)準備,發(fā)出SCK輸出時鐘信號,總線數(shù)據(jù)傳輸開始發(fā)送數(shù)據(jù)。將待發(fā)送的數(shù)據(jù)存放在寄存器里,寄存器里存入待發(fā)送數(shù)據(jù)為1010 0110 1100 0101,在第1個周期下升邊沿時刻,主機通過MOSI端口發(fā)送寄存器里最高位1至從機。在第1個周期上升邊沿時刻,總線讀到的數(shù)據(jù)data_rd左移一位,此刻多出一個空閑位,即data_rd[0],同理,后續(xù)的15個數(shù)據(jù)傳輸過程與此類似。待16位數(shù)據(jù)全部傳輸完成之后,完整的總線傳輸過程便結束。可以看出,data_wr中的數(shù)據(jù)被按bit的方式一位一位從主機發(fā)送到從機,待16個周期完成之后,data_rd中存儲的數(shù)據(jù)正是從機發(fā)送的數(shù)據(jù)1010 0110 1100 0101??偩€工作在CPHA=1模式下,如圖7所示,發(fā)送16位的數(shù)據(jù)為0101 0110 1011 1100,待16位數(shù)據(jù)全部傳輸完成之后,總線傳輸過程結束??梢园l(fā)現(xiàn),data_wr中的數(shù)據(jù)按bit的方式一位一位從主機發(fā)送到從機,待16個數(shù)據(jù)發(fā)送完成后,data_rd中存儲的數(shù)據(jù)正是從機發(fā)送的數(shù)據(jù)0101 0110 1011 1100。由仿真結果可以得出該設計SPI串口模塊的功能是正確的。
圖7 SPI模塊CPHA=1仿真波形
本文設計運用Verilog HDL硬件描述語言設計了一個符合SPI總線規(guī)范的總線接口,并使用仿真工具Modelsim SE-64 10.2c對其進行仿真驗證并給出仿真圖。在Quartus II 13.0中對該模塊進行編譯和實現(xiàn),并在FPGA開發(fā)板上完成了下載與驗證,該總線接口功能正確,工作穩(wěn)定可靠,抗干擾強,可擴展性好。