试图实现SPI接口的VHDL

试图实现SPI接口的VHDL,vhdl,spi,Vhdl,Spi,我正在尝试实现一个SPI接口。我有两个问题,这是第一个。(我决定逐一提问,以简化问题 似乎什么都不起作用,所以我将我的设计精简为一个移位寄存器,在这里,时钟输入的数据应该返回到SPI主设备 这是我目前的情况 library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity interface is port ( -- SPI SPI_MOSI: in std_logic; SPI_MISO: out std_logic;

我正在尝试实现一个SPI接口。我有两个问题,这是第一个。(我决定逐一提问,以简化问题

似乎什么都不起作用,所以我将我的设计精简为一个移位寄存器,在这里,时钟输入的数据应该返回到SPI主设备

这是我目前的情况

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;


entity interface is

port
(
     -- SPI
    SPI_MOSI: in std_logic;
    SPI_MISO: out std_logic;
    SPI_CLK: in std_logic;
);

end interface;

architecture Behavioral of interface is

-- SPI
signal SPI_REG: std_logic_vector(7 downto 0) := (others => '0');

-- SPI interface
process(SPI_CLK)

begin

    if rising_edge(SPI_CLK) then

        SPI_MISO <= SPI_REG(7);
        SPI_REG <= SPI_REG(6 downto 0) & SPI_MOSI; -- Concatenate bits

    end if;

end process;

end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体接口是
港口
(
--SPI
SPI_MOSI:标准逻辑中;
SPI_MISO:输出标准逻辑;
SPI_CLK:标准逻辑中;
);
终端接口;
行为接口的体系结构是
--SPI
信号SPI_REG:std_逻辑_向量(7到0):=(其他=>'0');
--SPI接口
过程(SPI_CLK)
开始
如果上升沿(SPI_CLK),则
味噌快速回答
第一个时钟位在输出端出现需要9个时钟周期

核查方法 我将代码更改为以下内容,并注意到与连接MOSI和MISO的直线相比,输出延迟了1位。(短接这2个引脚,没有延迟,正如预期的那样,但是以下代码产生了1位延迟。)

注意,对于熟悉VHDL的人来说,这应该是非常明显的

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity interface is

port
(
     -- SPI
    SPI_MOSI: in std_logic;
    SPI_MISO: out std_logic;
    SPI_CLK: in std_logic;
);
    
end interface;

architecture Behavioral of interface is

-- SPI
signal SPI_REG: std_logic_vector(7 downto 0) := (others => '0');

-- SPI interface
process(SPI_CLK)
        
begin

    if rising_edge(SPI_CLK) then
        
        SPI_MISO <= SPI_MOSI;
            
    end if;
    
end process;

end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体接口是
港口
(
--SPI
SPI_MOSI:标准逻辑中;
SPI_MISO:输出标准逻辑;
SPI_CLK:标准逻辑中;
);
终端接口;
行为接口的体系结构是
--SPI
信号SPI_REG:std_逻辑_向量(7到0):=(其他=>'0');
--SPI接口
过程(SPI_CLK)
开始
如果上升沿(SPI_CLK),则

SPI_MISO在不理解Raspbian的情况下,似乎每个数组值都有16位。设备0听起来像是一个具有两字节传输序列的特定设备,您似乎混合了物理层传输和协议层与设备对话之间的隐喻。(指令/地址以一个字节表示,数据以第二个字节表示)。设备的前两个字节配置(假设它们是前两个字节)。这意味着您的VHDL模型运行正常。请参阅2 SPI通信流,PDF第8-10页,见图3。您的VHDL看起来不错。我同意David的说法,发射机存在一些误解。您可以将示波器探头放在MOSI和MISO上吗?@DavidKoontz我应该看什么?Russell我可以,但我不会看在500 kHz的频率下,任何东西都可以……很好的实验性。我看到了第9位,并将其作为原因进行了打折。推理是这样的:只有一个主控,他是驱动时钟的人。根据理论,没有其他人在同一时间进行对话,也没有主控仲裁。司机在车上留下了它不明白这似乎是一个实现上的缺陷。然后你又会很难找到一个发布的“标准”。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity interface is

port
(
     -- SPI
    SPI_MOSI: in std_logic;
    SPI_MISO: out std_logic;
    SPI_CLK: in std_logic;
);
    
end interface;

architecture Behavioral of interface is

-- SPI
signal SPI_REG: std_logic_vector(7 downto 0) := (others => '0');

-- SPI interface
process(SPI_CLK)
        
begin

    if rising_edge(SPI_CLK) then
        
        SPI_MISO <= SPI_MOSI;
            
    end if;
    
end process;

end Behavioral;
process(SPI_CLK)
        
begin

    SPI_MISO <= SPI_MOSI;

    if rising_edge(SPI_CLK) then
        
    end if;
    
end process;
port
(
     -- SPI
    SPI_MOSI: in std_logic;
    SPI_MISO: out std_logic;
    SPI_CLK: in std_logic;
);
    
end interface;

architecture Behavioral of interface is

-- SPI
signal SPI_REG: std_logic_vector(7 downto 0) := (others => '0');

-- SPI interface
process(SPI_CLK)
        
begin

    SPI_MISO <= SPI_REG(7);

    if rising_edge(SPI_CLK) then
        
        SPI_REG <= SPI_REG(6 downto 0) & SPI_MOSI; -- Concatenate bits
            
    end if;
    
end process;

end Behavioral;