FPGA与单片机SPI通信问题

2019-07-16 02:07发布

tica, SimSun, sans-serif">小弟,用单片机做主机给FPGA发一个字节数据,然后FPGA发送回来。但是发现在FPGA里MISO延迟一个周期导致单片机接受的数据少了一位。想请教大神们怎么解决啊?下图为仿真图FPGA,上升沿接受数据,下降沿发送数据,程序也如下
LIBRARY ieee;
USE                ieee.std_logic_1164.all;
USE                ieee.std_logic_unsigned.all;

ENTITY spi_fpga is
PORT (SCK:        IN        std_logic;
          MOSI:        IN        std_logic;
          CS  :        IN  std_logic;
          MISO:        OUT        std_logic);
END        spi_fpga;

ARCHITECTURE        one of spi_fpga is
SIGNAL MOSI_IN:        std_logic;
BEGIN
        PROCESS        (CS,SCK)
                BEGIN
                IF (CS='1')        THEN
                        NULL;
                ELSIF rising_edge(SCK)        THEN
                        MOSI_IN <= MOSI;
                END IF;
        END PROCESS;
        
        PROCESS (SCK)
                BEGIN
                IF        falling_edge (SCK)        THEN
                        MISO <= MOSI_IN;
                END IF;
        END PROCESS;
END one;
QQ截图20120902145935.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
youzizhile
1楼-- · 2019-07-16 02:18
PROCESS        (CS,SCK)
                BEGIN
                IF (CS='1')        THEN
                        NULL;
                ELSIF rising_edge(SCK)        THEN
                        MOSI_IN <= MOSI;
                END IF;
        END PROCESS;
        
        PROCESS (SCK)
                BEGIN
                IF        falling_edge (SCK)        THEN
                        MISO <= MOSI_IN;
                END IF;
        END PROCESS;
END one;
使用同一个时钟的上升沿和下降沿操作数据是不能满足数据的建立时间和保持时间的,建议采用更快的时钟来处理这两个操作。
你说的附图有没有看到?
dingnengshenghu
2楼-- · 2019-07-16 02:20
你的图我也没有看到。
不过,从你的程序来看,单片机的确只能收到发送的8个bit中的7个比特。
1)你的单片机程序一定是边向FPGA发送数据,边从FPGA接收数据。举例来说:当单片机发送出第1个bit的数据后,单片机要再将这个bit的数据接收回来,肯定是在第二个sck处。这样算下来,单片机,只能接收到7个bit。除非,有两种情况下可以:a)假设数据在FPGA以及线路上的传输耗费小于半个sclk,而且,单片机接收数据时是下降沿采样数据,发送时是上升沿发送数据。b)一个SPI操作器件有9个sclk。其中,前八个用于发送数据,后8个用于接收数据。不论对于a或b来说,不会有人设计这样变态的SPI协议吧?
2)首先你的FPGA程序在写的时候,是否已经明白了单片接收数据是在SCLK的上升沿采样数据?如果是在上升沿采样数据,那么,在SPI空闲时,SCLK是高电平还是低电平,这个你也要清楚。若SCLK在SPI空闲时(CS=1),为高电平,则你用SCLK的下降沿送出数据是可行的。但是,就我前述1)来看,不论单片机是在上升沿还是下降沿采样数据,都只能收到8bit,除非满足1)的b条件。
3)按正常的设计,应该是FPGA接收到一帧SPI数据后,缓存一下,然后再把这一帧数据由单片机回读回去。
4)好好用笔画下波形,就什么都清楚了。
dingnengshenghu
3楼-- · 2019-07-16 08:18
 精彩回答 2  元偷偷看……
dingnengshenghu
4楼-- · 2019-07-16 13:34
1)楼主没有好好理解单片机的SPI时序。
2)从的FPGA代码看,单片机是边发送数据边回读数据,这样算来,单片机确实只能收到7bit。除非单片机的一字节操作中,有9个sclk。其中前8个用于发送,后8个用于接收。
3)正常的FPGA代码设计应该是先把接收的数据缓存一下,然后在逐个bit被回读回去。
4)用同一个时钟的上升沿采样数据,下降沿发送数据是可以的。只要时序关系满足,就是可以的。
纯情_ultrakill
5楼-- · 2019-07-16 19:30
youzizhile 发表于 2014-4-30 15:06
使用同一个时钟的上升沿和下降沿操作数据是不能满足数据的建立时间和保持时间的,建议采用更快的时钟来处理 ...

多谢回复。时间久了。
3008202060
6楼-- · 2019-07-16 23:04
大神 有没有verilog版的程序呢

一周热门 更多>