RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

spi master接口的fpga實現(xiàn)

FPGA之家 ? 來源:FPGA之家 ? 2024-11-16 10:35 ? 次閱讀

前言

當你器件的引腳賊少的時候,需要主機和從機通信,spi就派上了用場,它可以一對多,但只是片選到的從機能和主機通信,其他的掛機。

spi:serial peripheral interface 串行外圍接口

大致了解:

2b14bc48-9080-11ef-a511-92fbcf53809c.png

spi是個同步協(xié)議,數(shù)據(jù)在master和slaver間交換通過時鐘sck,由于它是同步協(xié)議,時鐘速率就可以各種變換。

sck:主機提供,從機不能操控,從器件由主機產(chǎn)生的時鐘控制。數(shù)據(jù)只有在sck來了的上升沿或者下降沿才傳輸。

高級一點的spi芯片有配置寄存器,高級一點的工作有四種模式,采樣相位和sck空閑電平可配置。

當然在這里我們主要實現(xiàn)簡單的spi協(xié)議:sck是系統(tǒng)時鐘的四分頻,wr請求信號有效時,主機開始工作,數(shù)據(jù)位8bit,sck空閑時低電平,工作時第一個沿數(shù)據(jù)傳輸。只有一個從機,cs低電平片選。

2b39f580-9080-11ef-a511-92fbcf53809c.png

看下結(jié)構(gòu):

2b573bcc-9080-11ef-a511-92fbcf53809c.png

接口定義:

2b743664-9080-11ef-a511-92fbcf53809c.png

編碼實現(xiàn):(版權(quán)所有,請勿用于商業(yè)用途,僅供學習使用)

2b8b6154-9080-11ef-a511-92fbcf53809c.jpg

  1 //************************************************
  2 //  Filename      : spi_ms_test1.v
  3 //  Author        : Kingstacker
  4 //  Company       : School
  5 //  Email         : kingstacker_work@163.com
  6 //  Device        : Altera cyclone4 ep4ce6f17c8
  7 //  Description   : spi master module;data 8bit;sck is 4 div of the clk;
  8 //************************************************
  9 module  spi_ms #(parameter WIDTH = 8)(
 10     //input;
 11     input    wire    clk,
 12     input    wire    rst_n,
 13     input    wire    wr, //send request;
 14     input    wire    [WIDTH-1:0]    master_din, //the data you want send;
 15     input    wire    miso, //the data form slave;
 16     //output;
 17     output   reg     cs, //slave select;
 18     output   reg     sck, //data exchange clock;
 19     output   reg     mosi,    //master out;
 20     output   reg     [WIDTH-1:0]    master_dout //the data you received;
 21 );
 22 localparam CLK_HZ = 50_000_000;  //clk frequency;
 23 localparam SCK_HZ = 12_500_000;  //sck frequency;
 24 localparam DIV_NUMBER = CLK_HZ / SCK_HZ;
 25 localparam CNT_MAX = (DIV_NUMBER >>1) - 1'b1;
 26 localparam DATA_CNT_MAX = 5'd31;
 27 localparam MOSI_CNT_MAX = 3'd7;
 28 localparam IDEL = 2'b00;
 29 localparam SEND = 2'b01;
 30 localparam FINISH = 2'b10;
 31 reg cnt; //sck cnt;
 32 reg sck_en; //enable sck;
 33 reg data_cnt_en;
 34 reg sck_reg1;
 35 reg sck_reg2;
 36 wire sck_p; //posedge sck;
 37 wire sck_n; //negedge sck;
 38 wire send_over;
 39 reg [1:0] cstate;
 40 reg [4:0] data_cnt; //cnt the send data;
 41 reg [2:0] mosi_cnt;
 42 reg [WIDTH-1:0] master_din_reg;
 43 reg [WIDTH-1:0] master_dout_reg;
 44 //produce sck;
 45 always @(posedge clk or negedge rst_n) begin
 46     if (~rst_n) begin
 47         cnt <= 0;
 48         sck <= 1'b0;
 49     end //if
 50     else begin
 51         if (sck_en == 1'b1) begin
 52             if (cnt == CNT_MAX) begin
 53                 cnt <= 0;
 54                 sck <= ~sck;
 55             end
 56             else begin
 57                 cnt <= cnt + 1'b1;
 58                 sck <= sck;
 59             end
 60         end
 61         else begin
 62             cnt <= 0;
 63             sck <= 1'b0;
 64         end
 65     end //else
 66 end //always
 67 //produce sck_p and sck_n;
 68 always @(posedge clk or negedge rst_n) begin
 69     if (~rst_n) begin
 70         sck_reg1 <= 1'b0;
 71         sck_reg2 <= 1'b0;
 72     end //if
 73     else begin
 74         sck_reg1 <= sck;
 75         sck_reg2 <= sck_reg1;
 76     end //else
 77 end //always
 78 assign sck_p = (sck_reg1 & (~sck_reg2)); //sck posedge;
 79 assign sck_n = ((~sck_reg1) & sck_reg2); //sck negedge;
 80 //fsm;hot code;
 81 always @(posedge clk or negedge rst_n) begin
 82     if (~rst_n) begin
 83         cstate <= IDEL;
 84     end
 85     else begin
 86         case (cstate)
 87             IDEL:    cstate <= (wr)? SEND : IDEL;
 88             SEND:    cstate <= (send_over) ? FINISH : SEND;
 89             FINISH:  cstate <= IDEL;
 90             default: cstate <= IDEL;
 91         endcase //case
 92     end
 93 end
 94 always @(posedge clk or negedge rst_n) begin
 95     if (~rst_n) begin
 96         cs <= 1'b1;
 97         data_cnt_en <= 1'b0;
 98         sck_en <= 1'b0;
 99         master_din_reg <= 0;
100         master_dout <= 0;
101     end
102     else begin
103         case (cstate)
104             IDEL: begin
105             data_cnt_en <= 1'b0;
106             master_din_reg <= (wr) ? master_din : master_din_reg; //load the data you want send to slaver;
107             end 
108             SEND: begin
109                 data_cnt_en <= 1'b1;
110                 cs <= 1'b0;
111                 sck_en <= 1'b1;
112                 master_dout <= (send_over) ? master_dout_reg : master_dout; //master receiverd data;
113             end
114             FINISH: begin                  //send and load ok;
115                 sck_en <= 1'b0;
116                 cs <= 1'b1;
117                 data_cnt_en <= 1'b0;
118             end
119             default: begin
120                 cs <= 1'b1;
121                 sck_en <= 1'b0;
122                 data_cnt_en <= 1'b0;
123             end
124         endcase //case
125     end
126 end
127 always @(posedge clk or negedge rst_n) begin
128     if (~rst_n) begin
129         data_cnt <= 0;
130     end
131     else begin
132         data_cnt <= (data_cnt_en) ? (data_cnt + 1'b1) : 5'd0; //4 div * 8bit = 32 cnt;
133     end
134 end
135 assign send_over = (data_cnt == DATA_CNT_MAX) ? 1'b1 : 1'b0;
136 //rising edge miso;
137 always @(posedge clk or negedge rst_n) begin
138     if (~rst_n) begin
139         master_dout_reg <= 0;
140     end
141     else begin
142         master_dout_reg <= (sck_p) ? {master_dout_reg[6:0],miso} : master_dout_reg;
143     end
144 end
145 //mosi;
146 always @(posedge clk or negedge rst_n) begin
147     if (~rst_n) begin
148         mosi_cnt <= 0;
149     end
150     else begin
151         if (sck_n) begin
152             if (mosi_cnt == MOSI_CNT_MAX) begin
153                 mosi_cnt <= 0;
154             end
155             else begin
156                 mosi_cnt <= mosi_cnt + 1'b1;
157             end
158         end
159         else begin
160             mosi_cnt <= mosi_cnt;
161         end
162     end
163 end
164 always @(posedge clk or negedge rst_n) begin
165     if (~rst_n) begin
166         mosi <= 1'b0;
167     end
168     else begin
169         mosi <= (sck_n) ? master_din_reg[MOSI_CNT_MAX-mosi_cnt] : mosi;
170     end
171 end
172 endmodule

2b8b6154-9080-11ef-a511-92fbcf53809c.jpg

仿真

2ba1fd60-9080-11ef-a511-92fbcf53809c.png

綜合資源使用:

2bbb251a-9080-11ef-a511-92fbcf53809c.png

Fmax:

2bc6c29e-9080-11ef-a511-92fbcf53809c.png

以上。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1629

    文章

    21729

    瀏覽量

    602977
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8575

    瀏覽量

    151014
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1706

    瀏覽量

    91501

原文標題:spi master接口的fpga實現(xiàn)

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    請問可以用FX3作為SPIMaster,通過GPIF II接口實現(xiàn)SPI通信嗎?

    你好,我有一塊 CYUSBKIT-003 電路板,我正在研究它。 1.為了學習GPIF II接口的使用,我想用FX3的GPIF II實現(xiàn)SPI通信。請問可以用FX3作為SPI
    發(fā)表于 05-29 07:46

    FPGA設(shè)計實例】基于FPGASPI接口應用

    可用于FPGA和其它芯片之間來實現(xiàn)簡單而有效的溝通。SPI的項目第1部分:什么是SPI?第2部分:一個簡單的實現(xiàn)第3部分:應用程序【
    發(fā)表于 03-26 15:47

    FPGA實現(xiàn)SPI接口(包括主機和從機程序)

    本帖最后由 eehome 于 2013-1-5 09:47 編輯 fpga實現(xiàn)spi接口FPGA
    發(fā)表于 08-11 18:07

    SPI接口初始化函數(shù)spi_master_init

    有誰知道SPI接口初始化函數(shù)spi_master_init 和 SPI接口數(shù)據(jù)傳送函數(shù)SPI_T
    發(fā)表于 04-03 09:16

    基于FPGASPI接口設(shè)計方法

    下得到了正確的結(jié)果。5、結(jié)束語隨著半導體技術(shù)的進步,FPGA 的價格越來越便宜, 工作頻率越來越高,使用FPGA 實現(xiàn)SPI 通信 接口是切
    發(fā)表于 05-28 05:00

    怎么使用FPGA實現(xiàn)SPI總線的通信接口?

    隨著現(xiàn)代技術(shù)的發(fā)展,SPI接口總線已經(jīng)成為了一種標準的接口,由于協(xié)議實現(xiàn)簡單,并且I/O資源占用少,為此SPI總線的應用十分廣泛。目前,
    發(fā)表于 08-09 08:14

    如何去實現(xiàn)spiMaster端呢

    目標:實現(xiàn)spiMaster端。這篇文章講的非常直觀易懂,看完就明白了。 1、首先配置口線,串口用來輸入和打印,四個io口用來模擬spi,原本準備在一個單片機上同時模擬主從,但貌似不
    發(fā)表于 01-24 07:29

    SPI-4.2接口FPGA實現(xiàn)

    去偏移和包重組是在FPGA實現(xiàn)SPI-4.2接口的核心難點,在分析偏移和包重組原理的基礎(chǔ)上,給出基于FPGA
    發(fā)表于 04-10 09:43 ?32次下載

    基于FPGASPI4.2接口設(shè)計

    本文介紹了一種FPGA和IPX2805之間的SPI4.2接口模塊設(shè)計的方法,對硬件設(shè)計進行了說明,著重闡述了FPGA內(nèi)部SPI4.2
    發(fā)表于 07-28 16:56 ?33次下載

    一種通用SPI接口FPGA設(shè)計與實現(xiàn)

    SPI 串行總線是一種常用的標準接口,其使用簡單方便而且占用系統(tǒng)資源少,應用相當廣泛。本文將介紹一種新的通用的SPI 總線的FPGA 實現(xiàn)
    發(fā)表于 09-09 11:58 ?67次下載
    一種通用<b class='flag-5'>SPI</b><b class='flag-5'>接口</b>的<b class='flag-5'>FPGA</b>設(shè)計與<b class='flag-5'>實現(xiàn)</b>

    基于FPGASPI Master Interface設(shè)計

    依據(jù)SPI同步串行接口的通信協(xié)議, 設(shè)計一個可配置的、高度靈活的SPI Master 模塊,以滿足正常、異常及強度測試要求。利用Verilog 語言
    的頭像 發(fā)表于 11-05 17:42 ?1.1w次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>SPI</b> <b class='flag-5'>Master</b> Interface設(shè)計

    如何在FPGA實現(xiàn)SPI4.2接口

    偏移和包重組是在FPGA實現(xiàn)SPI一4.2接口的核心難點,在分析偏移和包重組原理的基礎(chǔ)E,給出基于FPGA
    發(fā)表于 01-25 14:51 ?13次下載
    如何在<b class='flag-5'>FPGA</b>中<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>SPI</b>4.2<b class='flag-5'>接口</b>

    基于FPGASPI協(xié)議及設(shè)計實現(xiàn)

    基于FPGASPI協(xié)議及設(shè)計實現(xiàn)博主微信:flm13724054952,不懂的有疑惑的也可以加微信咨詢,歡迎大家前來投稿,謝謝!引言介紹在電子通信領(lǐng)域里采用的通信協(xié)議有IIC,SPI
    發(fā)表于 11-05 19:05 ?24次下載
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>SPI</b>協(xié)議及設(shè)計<b class='flag-5'>實現(xiàn)</b>

    Gowin SPI Master/Slave IP用戶指南

    Gowin SPI Master 和 Slave IP 用戶指南主要包括功能簡介、信號定義、 工作原理、GUI調(diào)用等,旨在幫助用戶快速了解Gowin SPI Master IP和Sl
    發(fā)表于 09-15 10:13 ?0次下載
    Gowin <b class='flag-5'>SPI</b> <b class='flag-5'>Master</b>/Slave IP用戶指南

    FPGA實現(xiàn)SPI

    FPGA實現(xiàn)SPI協(xié)議
    發(fā)表于 03-20 10:35 ?2次下載
    RM新时代网站-首页