在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 8545|回复: 11

[求助] Verilog设计SPI slave 一些问题

[复制链接]
发表于 2015-4-22 19:34:50 | 显示全部楼层 |阅读模式

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

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

x

这个是SPI读写操作

这个是SPI读写操作

这个是首字节的定义

这个是首字节的定义



请问如何按照这个要求用verilog来设计该SPI slave,网上有关基本找不到相关的SPI slave参考代码
主要存在这几个疑问:1、SPI从机除了主机发过来的同步时钟SCLK外,是否还需要另外一个输入时钟?我看见网上有关的从机代码都增加了clk,而且是用这个clk来检测SCLK的上升沿和下降沿,我的疑问是从机不就是直接用posedge SCLK就可以是实现检测到上升沿了吗?
代码如下:



  1. module SPI_Slave(
  2.                  clk,   //system clock 50MHz
  3.                  SCK, SSEL, MOSI,MISO//SPI communication pin   
  4.                  );
  5. input SCK, SSEL, MOSI;
  6. output MISO;

  7. // sync SCK to the FPGA clock using a 3-bits shift register
  8. reg [2:0] SCKr;
  9. always @(posedge clk) SCKr <= {SCKr[1:0], SCK};
  10. wire SCK_risingedge = (SCKr[2:1]==2'b01);  // now we can detect SCK rising edges
  11. wire SCK_fallingedge = (SCKr[2:1]==2'b10);  // and falling edges
  12. // same thing for SSEL
  13. reg [2:0] SSELr;
  14. always @(posedge clk) SSELr <= {SSELr[1:0], SSEL};
  15. wire SSEL_active = ~SSELr[1];  // SSEL is active low
  16. wire SSEL_startmessage = (SSELr[2:1]==2'b10);  // message starts at falling edge
  17. wire SSEL_endmessage = (SSELr[2:1]==2'b01);  // message stops at rising edge
  18. // and for MOSI
  19. reg [1:0] MOSIr;
  20. always @(posedge clk) MOSIr <= {MOSIr[0], MOSI};
  21. wire MOSI_data = MOSIr[1];
  22. reg [2:0] bitcnt;  // we handle SPI in 8-bits format, so we need a 3 bits counter to count the bits as they come in
  23. //-------------------receive data-------------------------------------------------
  24. reg byte_received;  // high when a byte has been received
  25. reg [7:0] byte_data_received,rev_data;
  26. reg [7:0] byte_data_sent,sent_data;
  27.   always @(posedge clk)
  28.   begin
  29.    if( SSEL_active )
  30.    begin
  31.     if(SSEL_startmessage)
  32.      byte_data_sent <= sent_data;
  33.    end  
  34.     if(~SSEL_active)
  35.    begin
  36.     bitcnt <= 3'b000;
  37.     byte_data_sent <= 8'h00;  // after that, we send 0s///////////
  38.    end
  39.     else
  40.    if(SCK_risingedge)
  41.      begin
  42.     bitcnt <= bitcnt + 3'b001;
  43.     byte_data_received <= {byte_data_received[6:0], MOSI_data};  // implement a shift-left
  44.                                                   //register (since we receive the data MSB first)
  45.     byte_data_sent <= {byte_data_sent[6:0], 1'b0};///////////
  46.      end
  47.   end
  48. always @(posedge clk) byte_received <= SSEL_active && SCK_risingedge && (bitcnt==3'b111);
  49. //-----------------------receive data---------------------
  50. always @(posedge clk)
  51.    if(byte_received)
  52.    begin
  53.      rev_data <= byte_data_received;
  54.    end
  55. //-----------------------send data----------------------
  56. assign MISO = byte_data_sent[7];  // send MSB first
  57. endmodule


复制代码

2、怎么区分接收的是数据还是地址?
3、由于首字节定义了通信模式和地址,刚开始时是怎么检测读写使能及地址的,是接收一位用一个状态机吗,然后用八个状态,还是用计数器来检测?
4、当接收完地址0时时怎么转换到读数据或者写数据操作,如果在片选信号一直使能的情况下这个转换状态肯定要用到一个时钟沿,那么这时数据传输的连贯性不就会被破坏了吗?
实在搞不懂,望同行们提供一些宝贵意见,万分感谢!
发表于 2015-4-22 22:52:39 | 显示全部楼层
SPI指负责每个SCLK传one bit data,什么时候发有效数据,有效数据的含义都是自己定的,一般MASTER是别人提供的,肯定是软件来操作的,写软件的时候,看怎么安排有效数据,slave是你自己的,软件怎么安排数据,你就怎么检查,恢复有效数据。
 楼主| 发表于 2015-4-23 10:23:31 | 显示全部楼层
回复 2# qmdong

那也就是说slave 这边要实现读写使能检测、寻址的操作吗?但是我看见的SPI 接口Verilog代码,不管是master或者slave,好像读写使能是直接外部输入的,而且也没有寻址这个功能,只是使用两个八位移位寄存器简单实现数据的交换,所以看到这个技术手册就无从下手了,请问您有什么好的思路吗
发表于 2015-4-24 08:53:38 | 显示全部楼层
这个很简单
串并转换+译码器就可以搞定了
发表于 2015-4-25 22:16:00 | 显示全部楼层
回复 3# lsp22关键是看你用SPI来做什么,传数据,还是读写总线?
发表于 2015-4-26 01:09:10 | 显示全部楼层
回复 1# lsp22


   第一个问题,通信时钟和系统时钟不一致,也就是双时钟情况下,为了避免异步时钟的问题,一般都用系统始终去采集信号时钟。尤其是一般的接口信号,时钟频率都很低,所以更是建议如此。  再说详细点,时钟是一个扇出的信号,需要接很多的寄存器,所以布局布线需要单独处理时钟。所以设计中尽量采用单一时钟,可以简化后续工作,稳定整个系统。

地址和数据的判断就是一个状态机。每接收8位,进行一次判断。状态机一开始是地址接收,根据读写位来判断下个状态是读还是写。状态机写好,基本上你所有的问题就都解决了。
 楼主| 发表于 2015-4-26 10:25:05 | 显示全部楼层
回复 5# qmdong


   用来读写数据的,也就是和MCU通讯。
发表于 2018-11-20 12:08:26 | 显示全部楼层
回复 1# lsp22

学习中
发表于 2019-1-8 10:19:51 | 显示全部楼层
学习了
发表于 2019-3-1 09:28:53 | 显示全部楼层
是否需要额外的时钟,都是可以的,看设计需求
楼主的这个文档哪来的,分享下呗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-19 22:30 , Processed in 0.048139 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表