前言

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

以上。

最新文章

  1. ZeroMQ接口函数之 :zmq_recv – 从一个socket上接收一个消息帧
  2. Interview Sort Function
  3. CCParticleSystem粒子系统
  4. An overview of the Spring MVC request flow
  5. 《C++ Primer Plus 第六版》读书笔记
  6. 处理MySQL服务器无法启动的问题
  7. Beta版本展示
  8. 解决SkyP2M工程常见问题所参考的博客汇总
  9. 转 Java操作PDF之iText详细入门
  10. Mybatis批量更新比较
  11. WPF应用程序内存泄漏的一些原因
  12. 移动端页面:viewport与分辨率的坑
  13. 使用uwsgi部署Django应用
  14. leetcode 链表类型题总结
  15. Tomcat提高并发
  16. testng多线程并行执行测试
  17. js中fn()和return fn()的区别
  18. POJ 3126 primepath bfs
  19. Portal for ArcGIS 10.2.2更改域名和导入自定义证书
  20. gcc 编译流程分析

热门文章

  1. html设置 hight100%问题
  2. Summer sell-off CodeForces - 810B (排序后贪心)
  3. Day1 初步认识Python
  4. Eclipse External Tool Configration Notepad++
  5. Mixing x86 with x64 code (混合编写x86和x64代码)
  6. python自动化常见问题汇总
  7. node path
  8. centos 6.5 查看时区和设置时区
  9. C# Note34: 异常机制相关小点
  10. webpack+vue 我的视角(持续更新)