⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.vhd

📁 以cyclone系列的EP2C5Q208为核心的实验板程序.包括流水灯,I2C存储器.SPI存储器,数码管,串口,LCD等
💻 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 + -