我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1326|回复: 1

[资料贡献] SPI 主

[复制链接]

该用户从未签到

29

主题

13

回帖

71

积分

一级逆天

积分
71

社区居民终身成就奖

QQ
发表于 2015-12-28 21:42:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
module spi_master(
  clk,    // global clock
  reset_n,  // global async low reset
  clk_div,  // spi clock divider
  wr,    // spi write
  wrdata,    // spi write data, 8bit  
  rddata,    // spi recieve data, 8bit, valid when ready assert  
  sck,    // spi master clock out
  sdi,    // spi master data in (MISO)
  sdo,    // spi master data out (MOSI)
  ready    // spi master ready (idle)
  );
input   clk;
input   reset_n;
input   [7:0]clk_div;
input   wr;
input   [7:0]wrdata;
output  [7:0]rddata;
output  sck;
output  sdo;
output  ready;
input   sdi;

parameter clock_polarity = 1;  // '0': mode 0, sck=0 when idle; '1': mode 3, sck=1 when idle

reg   [7:0]dat;
reg   rsck;
reg   [7:0]cnt;
reg   busy;
reg   [3:0]state;
reg   [7:0]rddata;

wire  sdo = dat[7];
wire  sck = busy? rsck:clock_polarity;
wire  sdi_tick = (cnt==clk_div>>1)/*synthesis keep*/;  
wire  sdo_tick = (cnt==clk_div)/*synthesis keep*/;
wire  ready = !(wr||busy);

always @(posedge clk or negedge reset_n)
if(!reset_n)
  cnt <= 0;
else if(cnt<clk_div && busy)
  cnt <= cnt + 1;
else
  cnt <= 1;

always @(posedge clk or negedge reset_n)
if(!reset_n)
  rsck  <= 0;
else if(sdi_tick)
  rsck  <= 1;
else if(sdo_tick)
  rsck  <= 0;

always @(posedge clk or negedge reset_n)
if(!reset_n)
  busy <= 0;
else if(wr && !busy)
  busy <= 1;
else if(state==8 && sdo_tick)
  busy <= 0;

always@(posedge clk or negedge reset_n)
if(!reset_n)
  state  <= 0;
else if(wr && !busy)
  state  <= 1;
else if(state==8 && sdo_tick)
  state  <= 0;
else if(sdo_tick)
  state  <= state + 1;  
  
always @(posedge clk or negedge reset_n)
if(!reset_n)
  dat  <= 0;
else if(wr && !busy)
  dat  <= wrdata;
else if(sdo_tick && busy && state!=8)
  dat  <= dat<<1;
  
always @(posedge clk or negedge reset_n)
if(!reset_n)
  rddata  <= 0;
else if(sdi_tick && busy)
  rddata  <= {rddata[6:0],sdi};

endmodule
回复

使用道具 举报

该用户从未签到

30

主题

529

回帖

1087

积分

二级逆天

积分
1087

社区居民忠实会员社区劳模原创达人终身成就奖

QQ
发表于 2016-1-6 05:40:10 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

每日签到,有金币领取。


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表