spi slaver接口的fpga实现
前言
spi从机接口程序,数据位8bit,sck空闲时低电平,工作时第一个沿数据传输。只有一个从机,cs低电平片选,slaver开始工作。
流程:
接口定义:

编码实现:(版权所有,请勿用于商业用途,仅供学习使用)
//************************************************
// Filename : spi_sm.v
// Author : Kingstacker
// Company : School
// Email : kingstacker_work@163.com
// Device : Altera cyclone4 ep4ce6f17c8
// Description : spi slaver module,mode is 0 ;data 8bit;
//************************************************
module spi_sm #(parameter WIDTH = )(
//input;
input wire clk,
input wire rst_n,
input wire cs, //slave select;
input wire sck, //data exchange clock;
input wire [WIDTH-:] slaver_din, //the data you want send;
input wire mosi, //the data form master;
//output;
output reg miso, //slaver out;
output reg [WIDTH-:] slaver_dout //the data you received;
);
localparam MISO_CNT_MAX = 'd7;
reg cs_reg1;
reg cs_reg2;
reg sck_reg1;
reg sck_reg2;
wire cs_p; //posedge cs;
wire cs_n; //negedge cs;
wire sck_p; //posedge sck;
wire sck_n; //negedge sck;
reg [WIDTH-:] slaver_din_reg;
reg [WIDTH-:] slaver_dout_reg;
reg [:] miso_cnt;
//produce cs_p and cs_n;
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
cs_reg1 <= 'b0;
cs_reg2 <= 'b0;
end //if
else begin
cs_reg1 <= cs;
cs_reg2 <= cs_reg1;
end //else
end //always
assign cs_p = (cs_reg1 & (~cs_reg2)); //cs posedge;
assign cs_n = ((~cs_reg1) & cs_reg2); //cs negedge;
//produce sck_p and sck_n;
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
sck_reg1 <= 'b0;
sck_reg2 <= 'b0;
end //if
else begin
sck_reg1 <= sck;
sck_reg2 <= sck_reg1;
end //else
end //always
assign sck_p = (sck_reg1 & (~sck_reg2)); //sck posedge;
assign sck_n = ((~sck_reg1) & sck_reg2); //sck negedge;
//you want send data registed;
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
slaver_din_reg <= ;
end //if
else begin
slaver_din_reg <= (cs_n) ? slaver_din :slaver_din_reg;
end //else
end //always
//recieved data ;
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
slaver_dout <= ;
end //if
else begin
slaver_dout <= (cs_p) ? slaver_dout_reg : slaver_dout;
end //else
end //always
//sck negedge sample mosi;
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
slaver_dout_reg <= ;
end //if
else begin
slaver_dout_reg <= (sck_n) ? {slaver_dout_reg[:],mosi} : slaver_dout_reg;
end //else
end //always
//miso cnt;
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
miso_cnt <= ;
end
else begin
if (sck_p) begin
if (miso_cnt == MISO_CNT_MAX) begin
miso_cnt <= ;
end
else begin
miso_cnt <= miso_cnt + 'b1;
end
end
else begin
miso_cnt <= miso_cnt;
end
end
end
//sck posedge output the miso;
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
miso <= ;
end //if
else begin
miso <= (sck_p) ? slaver_din_reg[MISO_CNT_MAX-miso_cnt] : miso;
end //else
end //always endmodule
以上。
spi slaver接口的fpga实现的更多相关文章
- spi master接口的fpga实现
前言 当你器件的引脚贼少的时候,需要主机和从机通信,spi就派上了用场,它可以一对多,但只是片选到的从机能和主机通信,其他的挂机. spi:serial peripheral interface 串行 ...
- SPI通信实验---verilog(FPGA作为从机,使用可读可写)
本实验讲究实用性,故设计思想为:主机先向从机发送地址,若是向从机写入数据,则向从机发送数据,若是读取从机数据,则向从机发送时钟,然后在时钟下降沿读取数据即可.cs信号上升沿作为SPI通信的结束信号.r ...
- EMIF接口与FPGA的互联(转)
reference: https://blog.csdn.net/ruby97/article/details/7539151 DSP6455的EMIFA模块 之前介绍了DSP6455的GPIO和中断 ...
- Linux SPI总线和设备驱动架构之二:SPI通用接口层
通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...
- [转载]Linux驱动-SPI驱动 之二:SPI通用接口层
通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...
- 【iCore4 双核心板_FPGA】例程十三:基于SPI的ARM与FPGA通信实验
实验现象: 1.先烧写ARM程序,然后烧写FPGA程序. 2.打开串口精灵,通过串口精灵给ARM发送数据从而给FPGA发送数据 ,会接收到字符HELLO. 3.通过串口精灵发送命令可以控制ARM·LE ...
- AM5728通过GPMC接口与FPGA高速数据通信实现
硬件:AM5728开发板:Artix-7开发板软件:Linux am57xx-evm 4.4.19:Vivado 2015.2作者:杭州矢志信息科技有限公司邮箱:admin@sysjoint.com ...
- DM8168通过GPMC接口与FPGA高速数据通信实现
硬件:TI达芬奇TMS320DM8168(以下简称DSP).EP4CE6E22C8N(以下简称FPGA) 软件:linux-2.6.37 转载请注明出处- http://www.cnblogs.com ...
- VC709E 基于FMC接口的FPGA XC7VX690T PCIeX8 接口卡
一.板卡概述 本板卡基于Xilinx公司的FPGA XC7VX690T-FFG1761 芯片,支持PCIeX8.两组 64bit DDR3容量8GByte,HPC的FMC连接器,板卡支持各种FMC子卡 ...
随机推荐
- 使用 OpenSSL 创建私有 CA:3 用户证书
OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 在前文&l ...
- Appium-实现手势密码登陆
前言: 前几天有人问我,手势登陆如何做?于是我找了一个APP试了试,所以本文来总结使用Python+Appium来实现手势密码登陆APP. 环境: MacOS:10.13.4 Appium-deskt ...
- H5 67-清除浮动方式三
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- iptables的增删改查
iptables是linux系统自带的防火墙,功能强大,学习起来需要一段时间,下面是一些习iptables的时候的记录.如果iptables不熟悉的话可以用apf,是一款基于iptables的防火墙, ...
- 用HttpClient和用HttpURLConnection做爬虫发现爬取的代码少了的问题
最近在学习用java来做爬虫但是发现不管用那种方式都是爬取的代码比网页的源码少了很多在网上查了很多都说是inputStream的缓冲区太小而爬取的网页太大导致读取出来的网页代码不完整,但是后面发现并不 ...
- MariaDB 和 MySQL 比较
MariaDB.org - Supporting continuity and open collaborationhttps://mariadb.org/ MariaDB 和 MySQL 比较 - ...
- jmeter压测参数设定(转)
jmeter压测参数设定 一.基本公式 线程数 = QPS * time: 注:QPS--每秒完成请求的个数:time--每个请求响应完成平均需要时间: 故QPS * time就是所有请求完成响应所需 ...
- tomcat启动的时候报错Failed to start component
在idea中运行tomcat时,遇到异常,异常信息如下: 16-Jan-2018 16:33:37.325 信息 [localhost-startStop-1] org.apache.catalina ...
- 下拉框、下拉控件之Select2
一.Select2的功能简介 select2插件给我们带来了更加友好的交互方式,比如查询控件展开后可通过关键字进行检索 例如: Select2也可以选择带查询控件的选择框... Select2也可以选 ...
- SQL年月日格式化
Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16