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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/19 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FPGA学习之路—接口(3)—SPI详解及Verilog源码分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

FPGA學(xué)習(xí)之路——SPI詳解及Verilog源碼分析

概述

SPI = Serial Peripheral Interface,是串行外圍設(shè)備接口,是一種高速,全雙工,同步的通信總線。

  • 優(yōu)點(diǎn)
    支持全雙工
    支持高速
    協(xié)議支持字長不限于8bit,可以根據(jù)應(yīng)用靈活選擇消息字長。
    硬件連接簡單
  • 缺點(diǎn)
    相比I2C多兩條線
    沒有尋址機(jī)制,只能靠片選選擇不同的設(shè)備
    沒有回應(yīng)ACK機(jī)制,主設(shè)備不知道消息發(fā)送是否成功
    典型應(yīng)用僅支持單主控

硬件結(jié)構(gòu)

  • 信號定義
    SCK:Serial Clock,時鐘信號,由主設(shè)備產(chǎn)生。
    MOSI:Master Output,Slave Input 主發(fā)從收信號。在片選信號有效時,數(shù)據(jù)由高位到低位,在時鐘的上升沿依次發(fā)送給從設(shè)備。
    MISO:Master Input,Slave Output 主收從發(fā)信號,在片選信號有效時,數(shù)據(jù)由高位到低位,在時鐘的上升沿依次發(fā)送給主設(shè)備。
    SS/CS:Slave Select 片選信號,低有效,由主設(shè)備控制。即只有片選信號為預(yù)先規(guī)定的使能信號時,對應(yīng)的芯片操作才有效,這使得在同一總線上連接多個SPI設(shè)備成為可能。
  • 電路連接
    單個主設(shè)備和單個從設(shè)備:

    單個主設(shè)備和多個從設(shè)備,通過用多個片選信號或者菊花鏈的形式完成。
  • 傳輸模式
    通過設(shè)置相關(guān)控制寄存器,SPI可以有四種傳輸模式。
    1、時鐘空閑時的電平為高或低。
    2、數(shù)據(jù)采樣發(fā)生在時鐘(SCK)的上/下邊沿。
    將以上兩種情況兩兩組合,即可得四種傳輸模式。
    數(shù)據(jù)在時鐘上升沿或下降沿時改變,在緊接著的下降沿或上升沿被讀取,完成一位數(shù)據(jù)傳輸,輸入與輸出原理相近。這樣通過至少8次時鐘信號的改變(上升沿和下降沿為一次),就可以完成8位數(shù)據(jù)的傳輸。如下圖所示。
  • 標(biāo)準(zhǔn)SPI讀

    片選→讀指令→地址→數(shù)據(jù)讀出
  • 標(biāo)準(zhǔn)SPI寫

    片選→寫指令→地址→數(shù)據(jù)寫入

Verilog代碼解析

本文以SPI Master控制器為例來對Verilog源碼進(jìn)行分析,參考資料為《VERILOG HDL應(yīng)用程序設(shè)計實(shí)例精講》,僅供學(xué)習(xí)參考,項(xiàng)目在文章末尾給出下載鏈接。
1、時鐘分頻模塊,將原始時鐘進(jìn)行四分頻,過程較為簡單,不再詳述。

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發(fā)送數(shù)據(jù)部分,在spiclk的上升沿完成數(shù)據(jù)的傳輸。spics為片選信號,低有效;spido為輸出的數(shù)據(jù);dstate為FSM變量。dsend為待傳送數(shù)據(jù),其中部分?jǐn)?shù)據(jù)過程重復(fù),代碼中僅保留首尾數(shù)據(jù)的傳輸過程。

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


可以看到當(dāng)片選信號spics為低有效時,數(shù)據(jù)在spiclk的上升沿按順序被發(fā)送至SPI總線上,數(shù)據(jù)信號spido與輸入數(shù)據(jù)相對應(yīng),SPI Master發(fā)送時序得到驗(yàn)證。
3、SPI接收數(shù)據(jù)部分,參數(shù)定義與2一樣,其中部分?jǐn)?shù)據(jù)過程重復(fù),代碼中僅保留首尾數(shù)據(jù)的傳輸過程。在時鐘的下降沿進(jìn)行數(shù)據(jù)的接收。

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


由上圖分析看出,收到的數(shù)據(jù)與SPI傳輸?shù)臄?shù)據(jù)相對應(yīng),SPI接收數(shù)據(jù)部分得到正確驗(yàn)證。

實(shí)驗(yàn)項(xiàng)目框圖:

實(shí)驗(yàn)心得
1、在給復(fù)位信號低電平時時間過短,分頻后時鐘上升沿還未到復(fù)位信號就拉高了,導(dǎo)致未進(jìn)行有效復(fù)位。
2、進(jìn)行發(fā)送/接收狀態(tài)檢測時設(shè)置的計數(shù)子過大,如下圖,每過40個時鐘周期進(jìn)行一次檢測,當(dāng)仿真時間過短時,容易看不到結(jié)果。

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、若結(jié)果出現(xiàn)問題,將相關(guān)控制信號添加至窗口,觀察其狀態(tài),分析程序存在的問題。

項(xiàng)目下載鏈接

參考資料:https://blog.csdn.net/weixin_42509369/article/details/83096349
《VERILOG HDL應(yīng)用程序設(shè)計實(shí)例精講》

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。