spi slaver接口的fpga实现

前言

spi从机接口程序,数据位8bit,sck空闲时低电平,工作时第一个沿数据传输。只有一个从机,cs低电平片选,slaver开始工作。

流程:

接口定义:

编码实现:(版权所有,请勿用于商业用途,仅供学习使用)

  1 //************************************************
  2 //  Filename      : spi_sm.v
  3 //  Author        : Kingstacker
  4 //  Company       : School
  5 //  Email         : [email protected]
  6 //  Device        : Altera cyclone4 ep4ce6f17c8
  7 //  Description   : spi slaver module,mode is 0 ;data 8bit;
  8 //************************************************
  9 module  spi_sm #(parameter WIDTH = 8)(
 10     //input;
 11     input    wire    clk,
 12     input    wire    rst_n,
 13     input    wire    cs,  //slave select;
 14     input    wire    sck, //data exchange clock;
 15     input    wire    [WIDTH-1:0]    slaver_din, //the data you want send;
 16     input    wire    mosi, //the data form master;
 17     //output;
 18     output   reg     miso, //slaver out;
 19     output   reg     [WIDTH-1:0]    slaver_dout  //the data you received;
 20 );
 21 localparam MISO_CNT_MAX = 3‘d7;
 22 reg cs_reg1;
 23 reg cs_reg2;
 24 reg sck_reg1;
 25 reg sck_reg2;
 26 wire cs_p;  //posedge cs;
 27 wire cs_n;  //negedge cs;
 28 wire sck_p; //posedge sck;
 29 wire sck_n; //negedge sck;
 30 reg [WIDTH-1:0] slaver_din_reg;
 31 reg [WIDTH-1:0] slaver_dout_reg;
 32 reg [2:0] miso_cnt;
 33 //produce cs_p and cs_n;
 34 always @(posedge clk or negedge rst_n) begin
 35     if (~rst_n) begin
 36         cs_reg1 <= 1‘b0;
 37         cs_reg2 <= 1‘b0;
 38     end //if
 39     else begin
 40         cs_reg1 <= cs;
 41         cs_reg2 <= cs_reg1;
 42     end //else
 43 end //always
 44 assign cs_p = (cs_reg1 & (~cs_reg2)); //cs posedge;
 45 assign cs_n = ((~cs_reg1) & cs_reg2); //cs negedge;
 46 //produce sck_p and sck_n;
 47 always @(posedge clk or negedge rst_n) begin
 48     if (~rst_n) begin
 49         sck_reg1 <= 1‘b0;
 50         sck_reg2 <= 1‘b0;
 51     end //if
 52     else begin
 53         sck_reg1 <= sck;
 54         sck_reg2 <= sck_reg1;
 55     end //else
 56 end //always
 57 assign sck_p = (sck_reg1 & (~sck_reg2)); //sck posedge;
 58 assign sck_n = ((~sck_reg1) & sck_reg2); //sck negedge;
 59 //you want send data registed;
 60 always @(posedge clk or negedge rst_n) begin
 61     if (~rst_n) begin
 62         slaver_din_reg <= 0;
 63     end //if
 64     else begin
 65         slaver_din_reg <= (cs_n) ? slaver_din :slaver_din_reg;
 66     end //else
 67 end //always
 68 //recieved data ;
 69 always @(posedge clk or negedge rst_n) begin
 70     if (~rst_n) begin
 71         slaver_dout <= 0;
 72     end //if
 73     else begin
 74         slaver_dout <= (cs_p) ? slaver_dout_reg : slaver_dout;
 75     end //else
 76 end //always
 77 //sck negedge sample mosi;
 78 always @(posedge clk or negedge rst_n) begin
 79     if (~rst_n) begin
 80         slaver_dout_reg <= 0;
 81     end //if
 82     else begin
 83         slaver_dout_reg <= (sck_n) ? {slaver_dout_reg[6:0],mosi} : slaver_dout_reg;
 84     end //else
 85 end //always
 86 //miso cnt;
 87 always @(posedge clk or negedge rst_n) begin
 88     if (~rst_n) begin
 89         miso_cnt <= 0;
 90     end
 91     else begin
 92         if (sck_p) begin
 93             if (miso_cnt == MISO_CNT_MAX) begin
 94                 miso_cnt <= 0;
 95             end
 96             else begin
 97                 miso_cnt <= miso_cnt + 1‘b1;
 98             end
 99         end
100         else begin
101             miso_cnt <= miso_cnt;
102         end
103     end
104 end
105 //sck posedge output the miso;
106 always @(posedge clk or negedge rst_n) begin
107     if (~rst_n) begin
108         miso <= 0;
109     end //if
110     else begin
111         miso <= (sck_p) ? slaver_din_reg[MISO_CNT_MAX-miso_cnt] : miso;
112     end //else
113 end //always
114
115 endmodule

以上。

时间: 2025-01-11 21:19:42

spi slaver接口的fpga实现的相关文章

spi master接口的fpga实现

前言 当你器件的引脚贼少的时候,需要主机和从机通信,spi就派上了用场,它可以一对多,但只是片选到的从机能和主机通信,其他的挂机. spi:serial peripheral interface 串行外围接口 大致了解: spi是个同步协议,数据在master和slaver间交换通过时钟sck,由于它是同步协议,时钟速率就可以各种变换. sck:主机提供,从机不能操控,从器件由主机产生的时钟控制.数据只有在sck来了的上升沿或者下降沿才传输. 高级一点的spi芯片有配置寄存器,高级一点的工作有四

SPI通信实验---verilog(FPGA作为从机,使用可读可写)

本实验讲究实用性,故设计思想为:主机先向从机发送地址,若是向从机写入数据,则向从机发送数据,若是读取从机数据,则向从机发送时钟,然后在时钟下降沿读取数据即可.cs信号上升沿作为SPI通信的结束信号.rom程序只是做测试使用. 每次发送16个时钟信号,前八个是地址和命令,后八个是数据.其中:前8个时钟接受的数据的最高位决定着这次通信是读取数据还是写入数据,最高位为1,则是读取数据,为0则是写入数据. 程序: /********************************Copyright***

Linux SPI总线和设备驱动架构之二:SPI通用接口层

通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了相应的数据结构,这些数据结构一部分是SPI设备.SPI协议驱动和SPI控制器的数据抽象,一部分是为了协助数据传输而定义的数据结构.另外,通用接口层还负责SPI系统与Linux设备模型相关的初始化工作.本章的我们就通过这些数据结构和API的讨论来对整个通用接口层进行深入的了解. /**********

BMP280 driver对接单片机I2C或者SPI总线接口

1:登录github网站搜BMP280,找到 BoschSensortec/BMP280_driver 2:gitclone或者download zip都可以,把驱动下载到本地,记得fork哦! 3:阅读驱动的readme文件 4:readme前面分别是目录.概要.和版本介绍,略过 5:我们关注的焦点也是重点是:传感器初始化即:Initializing the sensor,以I2C为例讲解如下: 咱们按照要求先定义一个结构体 struct bmp280_dev bmp; 这个结构体最重要的是实

SPI、I2C、UART三种串行总线协议的区别和SPI接口介绍(转)

SPI.I2C.UART三种串行总线协议的区别 第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART(Universal Asynchronous Receiver Transmitter:通用异步收发器) 第二,区别在电气信号线上: SPI总线由三条信号线组成:串行时钟(SCLK).串行数据输出(SDO).串行数据输入(SDI).SPI总线可以实现多个SPI设备互相连接.提供SPI串行时钟的SPI

136-KC705E 增强版 基于FMC接口的Xilinx Kintex-7 FPGA K7 XC7K325T PCIeX8 接口卡

KC705E 增强版 基于FMC接口的Xilinx Kintex-7 FPGA K7 XC7K325T PCIeX8 接口卡 一.板卡概述 本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8.64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持各种接口输入,软件支持windows,Linux驱动. 二.功能和技术指标:   支持1路PCIe X8 支持PCI Expres

无限可能!为MT7620添加N个SPI接口

前言 我的上一篇文章中谈到,如何使能mt7620的第二个spi接口.既然第二个spi接口已经开放成功,那么,可否接着添加第三个.第四个spi接口呢?熟悉mt7620硬件的朋友一定会第一时间站出来反对我:怎么可能!?mt7620总共才两个spi接口,怎么可能添加更多呢?除非在硬件上想办法.然而我总是善于将不可能变为可能^_^,今天我就要和大家分享一下,如何不改动任何硬件,通过修改驱动的方法,实现多个spi接口.注意,我这里实现的spi,并非用gpio口模拟的bitbang伪spi,而是基于硬件sp

总线接口与计算机通信(二)SPI总线

[SPI基础知识简介] SPI总线是Motorola公司推出的三线同步接口,用于 CPU与各种外围器件进行全双工.同步串行通讯. 同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO; SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等. SPI总线有四种工作方式(SP0, SP1, SP2, SP3),其中使用的最为广泛的是SPI0和SPI3方式. ? ? 源文档 <htt

STM32与FPGA进行SPI通信

一.器件 32单片机:STM32F407ZG FPGA     :EP4CE6E22C8N 二.通信方式 STM32作为主机(软件); FPGA作为从机; SPI通信方式为0; 三.STM32源代码 1 #include "delay.h" 2 #include "stm32f4xx.h" 3 4 #ifndef __SPI_H 5 #define __SPI_H 6 7 #define SPI1_SCK PBout(2) 8 #define SPI1_MOSI P