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子卡 ...
随机推荐
- H5 id选择器
09-id选择器 迟到毁一生 早退穷三代 按时上下班 必成高富帅 <!DOCTYPE html> <html lang="en"> <head> ...
- hibernate添加数据时Exception in thread "main" org.hibernate.PropertyValueException: not-null property references a null or transient value: com.javakc.hibernate.test.entity.TestEntity.testName
意思是,一个非null属性引用了一个null或瞬态值.就是在对应实体类配置文件hbm.xml中该属性配置了not-null="true",将其去掉即可.
- c#中用sql存储过程
string connstr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionStri ...
- ubuntu中更改apache默认目录的方法
如上,在这两个文件中,我都改为/home/www 及/home/www/html
- 使用队列queue实现一个简单的生产者消费者模型
一.生产者消费者模型 我们去超市商店等地购买商品时,我们大部分人都会说自己是消费者,而超市的各大供货商.工厂等,自然而然地也就成了我们的生产者.如此一来,生产者有了,消费者也有了,那么将二者联系起来的 ...
- linux之常见错误
在日常开发中,尤其是在Linux中进行操作的时候,经常会碰到各种各样的错误.记录一下,熟能生巧,慢慢参透linux的奥秘 1) 在安装ssl证书的时候,发生certbot命令无法使用的情况 解决方案: ...
- h5-canvas(其他api)
###1.使用图片(需要image对象) drawImage(image,x,y,width,height) 其中image是image或者canvas对象,x和y 是其在目标canvas的起始坐标 ...
- C# 往Datatable中添加新行的步骤
以一个实例说明 //录入年份绑定 public void YearList(FineUIPro.DropDownList ddlYear) { //年份从15年到当前年//起止年份 ; int yea ...
- IdentityServer4【Topic】之定义资源
Defining Resources 定义资源 你在系统中通常定义的第一件事是你想要保护的资源.这可能是你的用户的身份信息,比如个人资料数据或电子邮件地址,或者访问api. 你可以通过C#对象模型(内 ...
- jquery 设置cookie、删除cookie、获取cookie
1.引入jquery.js <script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script> ...