本spi参数化通讯模块是一个支持SPI串行通信协议从协议的SPI从接口。
模块符号:
ParameterValueN8spisclkcsdata_Tx[n-1..0]mosiresetinstdata_Rx[n-1..0]misostate 端口说明:
名称 方向 sclk cs data_Tx data_Rx mosi miso state reset IN IN IN OUT IN OUT OUT IN 描述 SPI同步时钟,主设备提供 片选信号,低电平有效,主设备提供 待发送数据,N位_参数化 已接收数据,N位_参数化 从设备接收数据端 从设备发送数据端 模块状态。1:收发正常、设备空闲; 0:设备忙或通讯错误 模块复位,低电平复位 模块时序:
cs sclk miso mosi state MSB MSB-1 MSB-2 ..... ..... LSB+1LSB MSB .... LSB+1MSB-1 MSB-2 .LSB
注意:
非空闲时:CS保持高电平, SCLK保持低电平; 通信时:数据从MSB至LSB传送; mosi数据sclk上升沿前给定; 数据双向同时传输。
时序仿真图:
VHDL程序代码:
library ieee;
use ieee.std_logic_1164.all; entity spi is generic ( N : integer := 8 ); port ( sclk : in std_logic; cs : in std_logic; data_Tx : in std_logic_vector(N-1 downto 0); data_Rx: out std_logic_vector(N-1 downto 0); miso : out std_logic; mosi : in std_logic; reset : in std_logic; state : out std_logic ); end entity;
architecture rtl of spi is signal i: integer range 0 to N-1; signal j: std_logic; begin process (sclk) begin if reset='0' then data_Rx <= (others => '0'); j <= '1'; elsif (cs = '1') then i <= N-1; miso <= 'Z'; elsif (rising_edge(sclk)) then data_Rx(i) <= mosi; miso <= data_Tx(i); if i=0 then i <= N-1; j <='1'; else i <= i-1; j <='0'; end if; end if; end process; state <= cs and j; end rtl;
因篇幅问题不能全部显示,请点此查看更多更全内容