色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

spi master接口的fpga實現

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

前言

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

spi:serial peripheral interface 串行外圍接口

大致了解:

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

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

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

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

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

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

看下結構:

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

接口定義:

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

編碼實現:(版權所有,請勿用于商業用途,僅供學習使用)

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

以上。

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

    關注

    1629

    文章

    21729

    瀏覽量

    602986
  • 接口
    +關注

    關注

    33

    文章

    8575

    瀏覽量

    151015
  • SPI
    SPI
    +關注

    關注

    17

    文章

    1706

    瀏覽量

    91502

原文標題:spi master接口的fpga實現

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

收藏 人收藏

    評論

    相關推薦

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

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

    FPGA設計實例】基于FPGASPI接口應用

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

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

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

    SPI接口初始化函數spi_master_init

    有誰知道SPI接口初始化函數spi_master_init 和 SPI接口數據傳送函數SPI_T
    發表于 04-03 09:16

    基于FPGASPI接口設計方法

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

    怎么使用FPGA實現SPI總線的通信接口?

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

    如何去實現spiMaster端呢

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

    SPI-4.2接口FPGA實現

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

    基于FPGASPI4.2接口設計

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

    一種通用SPI接口FPGA設計與實現

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

    基于FPGASPI Master Interface設計

    依據SPI同步串行接口的通信協議, 設計一個可配置的、高度靈活的SPI Master 模塊,以滿足正常、異常及強度測試要求。利用Verilog 語言
    的頭像 發表于 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設計

    如何在FPGA實現SPI4.2接口

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

    基于FPGASPI協議及設計實現

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

    Gowin SPI Master/Slave IP用戶指南

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

    FPGA實現SPI

    FPGA實現SPI協議
    發表于 03-20 10:35 ?2次下載
    主站蜘蛛池模板: 亚洲国产系列一区二区三区| 国产成人免费高清视频| 午夜深情在线观看免费| 美女脱三角裤| 国产在线精品亚洲第1页| avtt一区| 最新国自产拍天天更新| 新新电影理论中文字幕| 青青草视频在线ac| 蜜桃久久久亚洲精品成人| 国产亚洲日韩另类在线观看| 儿子操妈妈| 被公疯狂玩弄的漂亮人妻| 97久久久久| 中国老女人xxhd69| 在线自拍综合亚洲欧美| 亚洲免费在线观看视频| 亚洲国产精品日本无码网站| 受被三个攻各种道具PLAY| 欧美AAAAAA级午夜福利视频| 美女扒开腿让男生桶爽免费APP| 精品免费视在线视频观看| 健身房被教练啪到腿软H| 好看AV中文字幕在线观看| 国产亚洲视频中文字幕| 国产精品无码无卡毛片不卡视| 国产高潮国产高潮久久久久久| 第一福利视频网站在线| 纯肉合集(高H)| 国产精品久久久久久免费播放| 国产69精品久久久熟女| 国产AV精品无码免费看| 国产小伙和50岁熟女23p| 国产精品第100页| 国产一区二区高清| 国产极品白嫩超清在线观看| 国产精品成人影院| 久久高清免费视频| 女厕所边摸边吃奶边做爽视频| 日本午夜视频在线| 亚洲国产精品久久人人爱|