日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FPGA学习之路—接口(3)—SPI详解及Verilog源码分析

發布時間:2023/12/19 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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、時鐘分頻模塊,將原始時鐘進行四分頻,過程較為簡單,不再詳述。

module clkdiv(clk,clkout); input clk; output clkout;reg [1:0]cnt=2'd0; reg clkout=1'b0;always @(posedge clk)beginif(cnt==2'd1)beginclkout<=1'b1;cnt<=cnt+2'd1;endelse if(cnt == 2'd3)beginclkout<=1'b0;cnt<=2'd0;endelse begincnt<=cnt+2'd1;end end endmodule

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一樣,其中部分數據過程重復,代碼中僅保留首尾數據的傳輸過程。在時鐘的下降沿進行數據的接收。

begincase (dstate)8'd0:beginspics <= 1'b0;spiclk <= 1'b1;dstate <= 8'd1;end8'd1:beginspics <= 1'b0;spiclk <= 1'b1;dstate <= 8'd2;end8'd2:beginspics <= 1'b0;spiclk <= 1'b0;dstate <= 8'd3;end8'd3:beginspics <= 1'b0;spiclk <= 1'b1; dstate <= 8'd4;end8'd4:beginspics <= 1'b0;spiclk <= 1'b0;dreceive[7] <= spidi;dstate <= 8'd5;end8'd5:beginspics <= 1'b0;spiclk <= 1'b1; dstate <= 8'd6;end……8'd18:beginspics <= 1'b0;spiclk <= 1'b0;dreceive[0] <= spidi;dstate <= 8'd19;end8'd19:beginspics <= 1'b0;spiclk <= 1'b1;dstate <= 8'd20;dataout <= dreceive;end8'd20:beginspics <= 1'b0;spiclk <= 1'b1;dstate <= 8'd0;spistate <= 2'b00;endendcaseend


由上圖分析看出,收到的數據與SPI傳輸的數據相對應,SPI接收數據部分得到正確驗證。

實驗項目框圖:

實驗心得
1、在給復位信號低電平時時間過短,分頻后時鐘上升沿還未到復位信號就拉高了,導致未進行有效復位。
2、進行發送/接收狀態檢測時設置的計數子過大,如下圖,每過40個時鐘周期進行一次檢測,當仿真時間過短時,容易看不到結果。

if(cnt == 8'd40)begincnt <= 8'd0;if((wr == 1'b0) && (rd == 1'b1))beginspistate <= send_data;dstate <= 8'd0;dsend <= datain;endelse if((wr == 1'b1) && (rd == 1'b0))beginspistate <= receive_data;dstate <= 8'd0;endendelsebegincnt <= cnt + 8'd1;end

3、若結果出現問題,將相關控制信號添加至窗口,觀察其狀態,分析程序存在的問題。

項目下載鏈接

參考資料:https://blog.csdn.net/weixin_42509369/article/details/83096349
《VERILOG HDL應用程序設計實例精講》

總結

以上是生活随笔為你收集整理的FPGA学习之路—接口(3)—SPI详解及Verilog源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。