微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > SPI—slave模式,时序分析问题,急!求助!在线等!(刚发的那帖子貌似图挂了)

SPI—slave模式,时序分析问题,急!求助!在线等!(刚发的那帖子貌似图挂了)

时间:10-02 整理:3721RD 点击:
最近在弄一个SPI-Slave模块,写的比较简单。但跑仿真send data模式时序没问题,receive data模式问题却很奇怪。下图是receive data模式的代码

,写的比较简单,用一个2位的移位寄存器存放MOSI,然后在SCK上升沿把MOSI的高位顺次移位给到rx_fifo[7:0]的低位,当1个字节传完,byte_rcved标志位使能,把rx_fifo中数据输出给byte_data_rcved,完成一次receive data操作。
这个是testbench,


下面的问题就比较蛋疼了,看这张receive dat5a的波形图,

。如tb中,MOSI的输入数据 data[7:0] 赋值为35h,但显示到波形就变成了6Ah(也就是data[7:0]左移一位后的数值),反复试验多次都是这个问题(比如输入FF,显示为FE;输入55,显示为AA;输入77,显示为EE)。反复查看过模块代码和tb代码,还是没有头绪,蛋疼!然后MOSI信号线上输出的数据也不对(对的话应该是data[7]的从高位开始顺次输出),rx_fifo和byte_data_rcved的值也是时对时不对。
这是send data的波形图,是对的,各位可以比较

(上面一半是rx,是错的;下面一半是tx,是对的)
小弟反复研究还是没有发现关键问题所在,望各位大虾帮忙看看,在线等,急!

这是因为SCK有unknown状态,从unknown到0被仿真器识别成了一个negedge,data被左移了一位

   但MOSI的时候,是在posedge,有关系吗?而且如果像您说的,那MISO岂不也要受到影响?

2楼说的没错,tb中SCK提前翻转一次。
你的代码里面有些写法不合适,可综合模块中,一个寄存器不好在两个always赋值的;
即使是在tb中的always 时序逻辑,也避免用‘=’赋值。



   谢谢兄弟,确实是这个问题。另外就是$finish语句写在了always里面,所以只移位了一次,重写了一个initial,现在波形对了。



      谢谢兄弟,确实是这个问题。另外就是$finish语句写在了always里面,所以只移位了一次,重写了一个initial,现在波形对了。

最近也在学习SPI slave,是否可以给发一个slave的代码,万分感谢。
827597077@qq.com

小编 你好!我也是在学习SPI这块,却是一头雾水,不知道该怎么学习,能否把你的经验传授下。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top