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
    +关注

    关注

    1625

    文章

    21648

    浏览量

    601434
  • 接口
    +关注

    关注

    33

    文章

    8473

    浏览量

    150764
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1694

    浏览量

    91257

原文标题: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 0次下载