📄 spi.vhd
字号:
---------------------------------------------------------------------------------------------------
--*************************************************************************************************
-- CreateDate : 2007-09-12
-- ModifData : 2007-09-12
-- Description : SPI Interface ( 93LC46B )
-- Author : Explorer01
-- Version : V1.0
--*************************************************************************************************
---------------------------------------------------------------------------------------------------
-- VHDL library Declarations
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- The Entity Declarations
ENTITY SPI IS
PORT
(
RESET: IN STD_LOGIC;
GCLK: IN STD_LOGIC;
CLK : IN STD_LOGIC;
MISO : IN STD_LOGIC;
MOSI : OUT STD_LOGIC;
SCLK : OUT STD_LOGIC;
SSEL : OUT STD_LOGIC;
SPI_CS : IN STD_LOGIC; -- '0': Enable
SPI_RW : IN STD_LOGIC; -- '0': Write , '1': Read
SPI_STRB : IN STD_LOGIC; -- Rising Edge
SPI_Address : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
SPI_Data : INOUT STD_LOGIC_VECTOR(15 DOWNTO 0)
);
END SPI;
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- The Architecture of Entity Declarations
ARCHITECTURE Behavioral OF SPI IS
--
SIGNAL Address : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL DataIN, DataOUT : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL Command : STD_LOGIC_VECTOR(26 DOWNTO 0);
--------------------------------------
SIGNAL Start : STD_LOGIC;
SIGNAL CLKEnable : STD_LOGIC;
BEGIN
-------------------------------------------------
-- The Flag of start
PROCESS( RESET, CLK, SPI_STRB, SPI_RW )
VARIABLE Temp : STD_LOGIC;
VARIABLE Count : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
IF( RESET='0' ) THEN
Temp := '0'; Count := "11";
ELSIF( SPI_STRB='1' ) THEN -- Write to
Count := "00";
IF( SPI_RW='0' ) THEN Temp := '1';
ELSE Temp := '0';
END IF;
ELSIF( Temp='1' ) THEN
IF( CLK'EVENT AND CLK='1' ) THEN
IF( Count<"11" ) THEN Count := Count + 1;
END IF;
END IF;
END IF;
IF( Count="10" ) THEN Start <= '1';
ELSE Start <= '0';
END IF;
END PROCESS;
-------------------------------------------------
-- The main interface
PROCESS( RESET, SPI_CS, SPI_STRB, SPI_RW, SPI_Address, SPI_Data, DataOUT, Address, DataIN )
BEGIN
IF( RESET='0' OR SPI_CS='1' ) THEN
SPI_Data <= (OTHERS=>'Z');
ELSE
IF( SPI_RW='0' ) THEN -- Write command
IF( SPI_STRB='1') THEN
Address <= SPI_Address;
DataIN <= SPI_Data;
END IF;
ELSE -- Read data
SPI_Data <= DataOUT;
END IF;
END IF;
Command <= '1' & Address & DataIN & "00";
END PROCESS;
-------------------------------------------------
-- The I2C interface : Write and Read
PROCESS( RESET, GCLK, Start, DataIN, Command, CLKEnable, MISO )
VARIABLE Count : INTEGER RANGE 0 TO 26; -- 25 CLK Cycles
BEGIN
IF( RESET='0' OR Start='1' ) THEN
Count := 26;
MOSI <= '0'; SSEL <= '0'; CLKEnable <= '0';
ELSIF( GCLK'EVENT AND GCLK='0' ) THEN -- Falling Edge
IF( Count>0 ) THEN
IF( Count>17 ) THEN
MOSI <= Command( Count ); -- Data Input
SSEL <= '1';
CLKEnable <= '1';
Count := Count - 1;
ELSE
IF( Command(25 DOWNTO 24)="00" OR Command(24 DOWNTO 23)="11") THEN
MOSI <= '0';
Count := 0;
SSEL <= '0';
CLKEnable <= '0';
ELSIF( Command(25 DOWNTO 24)="10" ) THEN -- Read
DataOUT( Count-1 ) <= MISO;
MOSI <= '0';
SSEL <= '1';
CLKEnable <= '1';
Count := Count - 1;
ELSE -- Write
MOSI <= Command( Count );
SSEL <= '1';
CLKEnable <= '1';
Count := Count - 1;
END IF;
END IF;
ELSE
SSEL <= '0';
CLKEnable <= '0';
END IF;
END IF;
IF( CLKEnable='1' ) THEN SCLK <= GCLK;
ELSE SCLK <= '0';
END IF;
END PROCESS;
-------------------------------------------------
--
END Behavioral;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -