FPGA学习之路—接口(3)—SPI详解及Verilog源码分析
FPGA學習之路——SPI詳解及Verilog源碼分析
概述
SPI = Serial Peripheral Interface,是串行外圍設備接口,是一種高速,全雙工,同步的通信總線。
- 優點
支持全雙工
支持高速
協議支持字長不限于8bit,可以根據應用靈活選擇消息字長。
硬件連接簡單 - 缺點
相比I2C多兩條線
沒有尋址機制,只能靠片選選擇不同的設備
沒有回應ACK機制,主設備不知道消息發送是否成功
典型應用僅支持單主控
硬件結構
- 信號定義
SCK:Serial Clock,時鐘信號,由主設備產生。
MOSI:Master Output,Slave Input 主發從收信號。在片選信號有效時,數據由高位到低位,在時鐘的上升沿依次發送給從設備。
MISO:Master Input,Slave Output 主收從發信號,在片選信號有效時,數據由高位到低位,在時鐘的上升沿依次發送給主設備。
SS/CS:Slave Select 片選信號,低有效,由主設備控制。即只有片選信號為預先規定的使能信號時,對應的芯片操作才有效,這使得在同一總線上連接多個SPI設備成為可能。 - 電路連接
單個主設備和單個從設備:
單個主設備和多個從設備,通過用多個片選信號或者菊花鏈的形式完成。
- 傳輸模式
通過設置相關控制寄存器,SPI可以有四種傳輸模式。
1、時鐘空閑時的電平為高或低。
2、數據采樣發生在時鐘(SCK)的上/下邊沿。
將以上兩種情況兩兩組合,即可得四種傳輸模式。
數據在時鐘上升沿或下降沿時改變,在緊接著的下降沿或上升沿被讀取,完成一位數據傳輸,輸入與輸出原理相近。這樣通過至少8次時鐘信號的改變(上升沿和下降沿為一次),就可以完成8位數據的傳輸。如下圖所示。
- 標準SPI讀
片選→讀指令→地址→數據讀出 - 標準SPI寫
片選→寫指令→地址→數據寫入
Verilog代碼解析
本文以SPI Master控制器為例來對Verilog源碼進行分析,參考資料為《VERILOG HDL應用程序設計實例精講》,僅供學習參考,項目在文章末尾給出下載鏈接。
1、時鐘分頻模塊,將原始時鐘進行四分頻,過程較為簡單,不再詳述。
2、SPI發送數據部分,在spiclk的上升沿完成數據的傳輸。spics為片選信號,低有效;spido為輸出的數據;dstate為FSM變量。dsend為待傳送數據,其中部分數據過程重復,代碼中僅保留首尾數據的傳輸過程。
begincase (dstate)8'd0:beginspics <= 1'b0;spiclk <= 1'b1;spido <= 1'b1;dstate <= 8'd1;end8'd1:beginspics <= 1'b0;spiclk <= 1'b1;spido <= 1'b1;dstate <= 8'd2;end8'd2:beginspics <= 1'b0;spiclk <= 1'b0;spido <= 1'b1;dstate <= 8'd3;end8'd3:beginspics <= 1'b0;spiclk <= 1'b1;spido <= dsend[7];dstate <= 8'd4;end8'd4:beginspics <= 1'b0;spiclk <= 1'b0;spido <= dsend[7];dstate <= 8'd5;end……8'd17:beginspics <= 1'b0;spiclk <= 1'b1;spido <= dsend[0];dstate <= 8'd18;end8'd18:beginspics <= 1'b0;spiclk <= 1'b0;spido <= dsend[0];dstate <= 8'd19;end8'd19:beginspics <= 1'b0;spiclk <= 1'b1;spido <= 1'b1;dstate <= 8'd20;end8'd20:beginspics <= 1'b0;spiclk <= 1'b1;spido <= 1'b1;dstate <= 8'd0;spistate <= idle;endendcaseenddefault:beginspics <= 1'b1;spiclk <= 1'b1;spido <= 1'b1;spistate <= 2'b00;endendcaseend
可以看到當片選信號spics為低有效時,數據在spiclk的上升沿按順序被發送至SPI總線上,數據信號spido與輸入數據相對應,SPI Master發送時序得到驗證。
3、SPI接收數據部分,參數定義與2一樣,其中部分數據過程重復,代碼中僅保留首尾數據的傳輸過程。在時鐘的下降沿進行數據的接收。
由上圖分析看出,收到的數據與SPI傳輸的數據相對應,SPI接收數據部分得到正確驗證。
實驗項目框圖:
實驗心得:
1、在給復位信號低電平時時間過短,分頻后時鐘上升沿還未到復位信號就拉高了,導致未進行有效復位。
2、進行發送/接收狀態檢測時設置的計數子過大,如下圖,每過40個時鐘周期進行一次檢測,當仿真時間過短時,容易看不到結果。
3、若結果出現問題,將相關控制信號添加至窗口,觀察其狀態,分析程序存在的問題。
項目下載鏈接
參考資料:https://blog.csdn.net/weixin_42509369/article/details/83096349
《VERILOG HDL應用程序設計實例精講》
總結
以上是生活随笔為你收集整理的FPGA学习之路—接口(3)—SPI详解及Verilog源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdoj-2028-Lowest com
- 下一篇: FPGA学习之路—应用程序—基于Veri