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

📄 operation.vhd

📁 有關於EP2C的一些程序(EX:I2C,FLASH,IRDA,MUSIC,LED,LIGHT,SRAM,UART,PS2,SPI )
💻 VHD
📖 第 1 页 / 共 2 页
字号:
---------------------------------------------------------------------------------------------------
--*************************************************************************************************
--  CreateDate  :  2007-08-20 
--  ModifData   :  2007-08-20 
--  Description :  Operation 
--  Author      :  Explorer01 
--  Version     :  V1.0  
--*************************************************************************************************
---------------------------------------------------------------------------------------------------

-- VHDL library Declarations 
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;

---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- The Entity Declarations 
ENTITY Operation IS
	PORT 
	(
		RESET	: IN STD_LOGIC;
		GCLK	: IN STD_LOGIC; 
		
		CLK1	: IN STD_LOGIC; 
		CLK2	: IN STD_LOGIC; 
		CLK3	: IN STD_LOGIC; 
		
		-------------------------------------
		-- Switch 
		SW		: IN STD_LOGIC_VECTOR(5 DOWNTO 0); 
		
		-------------------------------------
		-- Keyboard 4*4 
		KeyValid: IN STD_LOGIC;
		KeyCode	: IN STD_LOGIC_VECTOR(3 DOWNTO 0); 
		
		-------------------------------------
		-- PS2 
		PS2Valid: IN STD_LOGIC;
		PS2Code	: IN STD_LOGIC_VECTOR(7 DOWNTO 0); 
		
		-------------------------------------
		-- Temperation ( DS18B20 ) 
		TempValid: IN STD_LOGIC;
		TempCode : IN STD_LOGIC_VECTOR(7 DOWNTO 0); 
		
		-------------------------------------
		-- RS232 ( UART ) 
		UARTValid: IN STD_LOGIC;
		UARTCode : IN STD_LOGIC_VECTOR(7 DOWNTO 0); 
		
		-------------------------------------
		-- irDA 
		irDAValid: IN STD_LOGIC;
		irDACodeL: IN STD_LOGIC_VECTOR(7 DOWNTO 0); 
		irDACodeM: IN STD_LOGIC_VECTOR(7 DOWNTO 0); 
		irDACodeU: IN STD_LOGIC_VECTOR(7 DOWNTO 0); 
		
		--===================================
		-------------------------------------
		-- LED8 & Light 
		LEDValue   : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); 
		DigitValue : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); 
--		LightValue : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); 
		
		-------------------------------------
		-- LCD1602 
		LCDFresh: OUT STD_LOGIC;
		CharAdd	: IN  STD_LOGIC_VECTOR(5 DOWNTO 0); 
		LCDValue: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
		
		-------------------------------------
		-- Music 
		MusicEnable : OUT STD_LOGIC;
		Speak		: OUT STD_LOGIC;
		
		-------------------------------------
		-- SPI 
		SPI_CS 		: OUT STD_LOGIC;
		SPI_RW 		: OUT STD_LOGIC;
		SPI_STRB 	: OUT STD_LOGIC;
		SPI_Address : OUT STD_LOGIC_VECTOR(7  DOWNTO 0); 
		SPI_Data 	: INOUT STD_LOGIC_VECTOR(15 DOWNTO 0); 
		
		-------------------------------------
		-- I2C 
		I2C_CS 		: OUT STD_LOGIC;
		I2C_RW 		: OUT STD_LOGIC;
		I2C_STRB 	: OUT STD_LOGIC;
		
		I2C_Address : OUT 	STD_LOGIC_VECTOR(1 DOWNTO 0); 
		I2C_Data 	: INOUT STD_LOGIC_VECTOR(7 DOWNTO 0)
		
		-------------------------------------
		-- 
		
	);
END Operation;

---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- The Architecture of Entity Declarations 
ARCHITECTURE Behavioral OF Operation IS
	------------------------------------------------
	-- SPI Memory : 93LC46B 
	SIGNAL SPIDataR, SPIDataW : STD_LOGIC_VECTOR(15 DOWNTO 0); 
	SIGNAL DataIN, DataOUT : STD_LOGIC_VECTOR(15 DOWNTO 0); 
	
	SIGNAL KeyFlag, KeyFlagValid1, KeyFlagValid2, KeyFlagRefresh : STD_LOGIC; 
	SIGNAL CS, RW, STRB : STD_LOGIC; 
	
	SIGNAL CountFilter : STD_LOGIC_VECTOR(6 DOWNTO 0); 
	SIGNAL CountSTEP : INTEGER RANGE 0 TO 7; 
	
	------------------------------------------------
	-- I2C 
	SIGNAL I2CDataR, I2CDataW : STD_LOGIC_VECTOR(7 DOWNTO 0);
	SIGNAL DataINI, DataOUTI  : STD_LOGIC_VECTOR(7 DOWNTO 0);
	
	SIGNAL KeyFlagValidIIC1 : STD_LOGIC; 
	SIGNAL CSI, RWI, STRBI : STD_LOGIC; 
	
	------------------------------------------------
	-- LED 
	TYPE LEDRAM IS ARRAY( 0 TO 7 ) OF STD_LOGIC_VECTOR(3 DOWNTO 0);
	SIGNAL LED_ARRAY : LEDRAM; 
	
	SIGNAL Refresh: STD_LOGIC_VECTOR(2 DOWNTO 0);
	
	------------------------------------------------
	-- LCD1602 
	TYPE LCDRAM IS ARRAY( 0 TO 31 ) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
	SIGNAL LCD_ARRAY : LCDRAM; 
	
	SIGNAL Fresh, CLK2P : STD_LOGIC; 
	------------------------------------------------
	-- irDA 
	
	
	---------------------------------------------------------------------------------------------------
	FUNCTION Char_To_Integer ( indata :character) return integer is 
	VARIABLE result : INTEGER RANGE 0 TO 16#7F#;
	BEGIN
		CASE indata IS 
		WHEN ' ' =>		result := 32;
		WHEN '!' =>		result := 33;
		WHEN '"' =>		result := 34;
		WHEN '#' =>		result := 35;
		WHEN '$' =>		result := 36;
		WHEN '%' =>		result := 37;
		WHEN '&' =>		result := 38;
		WHEN ''' =>		result := 39;
		WHEN '(' =>		result := 40;
		WHEN ')' =>		result := 41;
		WHEN '*' =>		result := 42;
		WHEN '+' =>		result := 43;
		WHEN ',' =>		result := 44;
		WHEN '-' =>		result := 45;
		WHEN '.' =>		result := 46;
		WHEN '/' =>		result := 47;
		WHEN '0' =>		result := 48;
		WHEN '1' =>		result := 49;
		WHEN '2' =>		result := 50;
		WHEN '3' =>		result := 51;
		WHEN '4' =>		result := 52;
		WHEN '5' =>		result := 53;
		WHEN '6' =>		result := 54;
		WHEN '7' =>		result := 55;
		WHEN '8' =>		result := 56;
		WHEN '9' =>		result := 57;
		WHEN ':' =>		result := 58;
		WHEN ';' =>		result := 59;
		WHEN '<' =>		result := 60;
		WHEN '=' =>		result := 61;
		WHEN '>' =>		result := 62;
		WHEN '?' =>		result := 63;
		WHEN '@' =>		result := 64;
		WHEN 'A' =>		result := 65;
		WHEN 'B' =>		result := 66;
		WHEN 'C' =>		result := 67;
		WHEN 'D' =>		result := 68;
		WHEN 'E' =>		result := 69;
		WHEN 'F' =>		result := 70;
		WHEN 'G' =>		result := 71;
		WHEN 'H' =>		result := 72;
		WHEN 'I' =>		result := 73;
		WHEN 'J' =>		result := 74;
		WHEN 'K' =>		result := 75;
		WHEN 'L' =>		result := 76;
		WHEN 'M' =>		result := 77;
		WHEN 'N' =>		result := 78;
		WHEN 'O' =>		result := 79;
		WHEN 'P' =>		result := 80;
		WHEN 'Q' =>		result := 81;
		WHEN 'R' =>		result := 82;
		WHEN 'S' =>		result := 83;
		WHEN 'T' =>		result := 84;
		WHEN 'U' =>		result := 85;
		WHEN 'V' =>		result := 86;
		WHEN 'W' =>		result := 87;
		WHEN 'X' =>		result := 88;
		WHEN 'Y' =>		result := 89;
		WHEN 'Z' =>		result := 90;
		WHEN '[' =>		result := 91;
		WHEN '\' =>		result := 92;
		WHEN ']' =>		result := 93;
		WHEN '^' =>		result := 94;
		WHEN '_' =>		result := 95;
		WHEN '`' =>		result := 96;
		WHEN 'a' =>		result := 97;
		WHEN 'b' =>		result := 98;
		WHEN 'c' =>		result := 99;
		WHEN 'd' =>		result := 100;
		WHEN 'e' =>		result := 101;
		WHEN 'f' =>		result := 102;
		WHEN 'g' =>		result := 103;
		WHEN 'h' =>		result := 104;
		WHEN 'i' =>		result := 105;
		WHEN 'j' =>		result := 106;
		WHEN 'k' =>		result := 107;
		WHEN 'l' =>		result := 108;
		WHEN 'm' =>		result := 109;
		WHEN 'n' =>		result := 110;
		WHEN 'o' =>		result := 111;
		WHEN 'p' =>		result := 112;
		WHEN 'q' =>		result := 113;
		WHEN 'r' =>		result := 114;
		WHEN 's' =>		result := 115;
		WHEN 't' =>		result := 116;
		WHEN 'u' =>		result := 117;
		WHEN 'v' =>		result := 118;
		WHEN 'w' =>		result := 119;
		WHEN 'x' =>		result := 120;
		WHEN 'y' =>		result := 121;
		WHEN 'z' =>		result := 122;
		WHEN '{' =>		result := 123;
		WHEN '|' =>		result := 124;
		WHEN '}' =>		result := 125;
		WHEN '~' =>		result := 126;
		WHEN	OTHERS => result :=32;
		END CASE;
		RETURN result;
	END FUNCTION;
	
BEGIN
	
	--==============================================
	------------------------------------------------
	-- KeyFlag Filter 
	PROCESS( RESET, GCLK, CLK1, KeyValid, KeyCode, CountFilter, SW, KeyFlag, KeyFlagRefresh )
		VARIABLE Count  : STD_LOGIC_VECTOR(3 DOWNTO 0);
	BEGIN 
		-------------------------------------
		-- Filter 
		IF( RESET='0' OR KeyValid='0' ) THEN 
			KeyFlag <= '0';
			CountFilter <= (OTHERS=>'0');
		ELSIF( KeyValid='1' ) THEN 
			IF( GCLK'EVENT AND GCLK='1' ) THEN 
				IF( CountFilter<"1100100" ) THEN CountFilter <= CountFilter + 1; 
				ELSE 							 KeyFlag <= '1';
				END IF; 
			END IF; 
		END IF; 
		
		-------------------------------------
		-- Delay 
		IF( RESET='0' OR KeyFlag='1' ) THEN Count := (OTHERS=>'0');
		ELSIF( GCLK'EVENT AND GCLK='1' ) THEN 
			IF( Count<"1111" ) THEN Count := Count + 1; 
			END IF; 
			
			IF( Count="1110" AND SW(4 DOWNTO 3)="00"  ) THEN KeyFlagRefresh <= '1'; 
			ELSE 								    		 KeyFlagRefresh <= '0'; 
			END IF; 
			
		END IF; 
		
		IF( SW(4 DOWNTO 3)="00" ) THEN 	KeyFlagValid2 <= KeyFlag; 
		ELSE 							KeyFlagValid2 <= '0'; 
		END IF; 
		
		-- SPI 
		IF( SW(4)='1' ) THEN KeyFlagValid1 <= KeyFlag; 	
		ELSE 				 KeyFlagValid1 <= '0'; 		
		END IF; 
		
		-- I2C 
		IF( SW(3)='1' ) THEN KeyFlagValidIIC1 <= KeyFlag; 	
		ELSE 				 KeyFlagValidIIC1 <= '0'; 		
		END IF; 
		
	END PROCESS; 
	
	------------------------------------------------
	-- The Direct Interface of SPI Controller 
	PROCESS( CS, RW, STRB, DataOUT, SPI_Data )
	BEGIN 
		SPI_CS	 <= CS; 
		SPI_RW	 <= RW; 
		SPI_STRB <= STRB; 
		
		IF( CS='0' ) THEN 
			IF( RW='0' ) THEN 
				SPI_Data <= DataOUT; 
			ELSE 
				DataIN <= SPI_Data; 
			END IF; 
		ELSE 
			SPI_Data <= (OTHERS=>'Z'); 
		END IF; 
		
	END PROCESS; 
	
	------------------------------------------------
	-- Enter the datum : SPIDataW 
	PROCESS( RESET, KeyFlagValid2, CountSTEP )
	BEGIN
		IF( RESET='0' ) THEN 
			CountSTEP <= 0;
		ELSIF( KeyFlagValid2'EVENT AND KeyFlagValid2='1' ) THEN 
			IF( CountSTEP<5 ) THEN CountSTEP <= CountSTEP + 1; 
			END IF; 
		END IF; 
	END PROCESS; 
	
	------------------------------------------------
	-- Enter the datum : SPIDataW 
	PROCESS( RESET, KeyCode, KeyFlagRefresh, CountSTEP )
	BEGIN
		IF( RESET='0' ) THEN 
			SPIDataW <= B"1010_0000_1010_0011"; -- A0A3 
		ELSIF( KeyFlagRefresh'EVENT AND KeyFlagRefresh='1' ) THEN 
			IF	 ( CountSTEP=1 ) THEN SPIDataW(15 DOWNTO 12) <= KeyCode; 
			ELSIF( CountSTEP=2 ) THEN SPIDataW(11 DOWNTO 8 ) <= KeyCode; 
			ELSIF( CountSTEP=3 ) THEN SPIDataW(7  DOWNTO 4 ) <= KeyCode; 
			ELSIF( CountSTEP=4 ) THEN SPIDataW(3  DOWNTO 0 ) <= KeyCode; 
			END IF; 
		END IF; 
	END PROCESS; 
	
	------------------------------------------------
	-- SPI Memory Interface 
	PROCESS( RESET, GCLK, KeyFlagValid1, KeyCode, STRB, DataIN, SPIDataW )
		VARIABLE Count : STD_LOGIC_VECTOR(1 DOWNTO 0);
	BEGIN 
		IF( RESET='0' ) THEN 
			DataOUT	<= (OTHERS=>'0');
			CS <= '1'; RW <= '1'; 
			Count := (OTHERS=>'1'); 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -