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

📄 operation.vhd

📁 有關於EP2C的一些程序(EX:I2C,FLASH,IRDA,MUSIC,LED,LIGHT,SRAM,UART,PS2,SPI )
💻 VHD
📖 第 1 页 / 共 2 页
字号:
		ELSIF( KeyFlagValid1='1' ) THEN 
			Count := (OTHERS=>'0'); 
		ELSE 
			IF( GCLK'EVENT AND GCLK='1' ) THEN 
				IF( Count<"11" ) THEN 
					CS <= '0'; 
					Count := Count + 1; 
					IF( KeyCode<"0111" AND KeyCode/="0000" ) THEN 
						RW <= '0'; 
					END IF; 
					--------------------------
					-- Send Command To SPI Controller 
					IF	 ( KeyCode="0001" ) THEN -- KeyCode = 1 : ERASE 
						SPI_Address <= B"11_000000"; 
						DataOUT		<= (OTHERS=>'0');
					ELSIF( KeyCode="0010" ) THEN -- KeyCode = 2 : ERAL 
						SPI_Address <= B"0010_0000"; 
						DataOUT		<= (OTHERS=>'0');
					ELSIF( KeyCode="0011" ) THEN -- KeyCode = 3 : EWDS 
						SPI_Address <= B"0000_0000"; 
						DataOUT		<= (OTHERS=>'0');
					ELSIF( KeyCode="0100" ) THEN -- KeyCode = 4 : EWEN 
						SPI_Address <= B"0011_0000"; 
						DataOUT		<= (OTHERS=>'0');
					ELSIF( KeyCode="0101" ) THEN -- KeyCode = 5 : READ 
						SPI_Address <= B"10_000000"; 
						DataOUT		<= (OTHERS=>'0');
					ELSIF( KeyCode="0110" ) THEN -- KeyCode = 6 : WRITE 
						SPI_Address <= B"01_000000"; 
						DataOUT		<= SPIDataW; 
					-------------------------
					-- Receive the Data from I2C Controller 
					ELSE -- KeyCode = 0/7/8/9/A/B/C/D/E/F : Read 
						IF( STRB='1' ) THEN SPIDataR <= DataIN; 
						END IF; 
					END IF; 
				ELSE 
					CS <= '1'; RW <= '1'; 
					DataOUT	<= (OTHERS=>'0');
				END IF; 
			END IF; 
		END IF; 
		
		IF( Count="10" ) THEN STRB <= '1'; 
		ELSE 				  STRB <= '0'; 
		END IF; 
	END PROCESS; 
	
	--==============================================
	------------------------------------------------
	-- The Direct Interface of I2C Controller 
	PROCESS( CSI, RWI, STRBI, DataOUTI, I2C_Data )
	BEGIN 
		I2C_CS	 <= CSI; 
		I2C_RW	 <= RWI; 
		I2C_STRB <= STRBI; 
		
		IF( CSI='0' ) THEN 
			IF( RWI='0' ) THEN 
				I2C_Data <= DataOUTI; 
			ELSE 
				DataINI <= I2C_Data; 
			END IF; 
		ELSE 
			I2C_Data <= (OTHERS=>'Z'); 
		END IF; 
		
	END PROCESS; 
	
	------------------------------------------------
	-- I2C 
	PROCESS( RESET, GCLK, KeyFlagValidIIC1, KeyCode, DataINI, I2CDataW, SPIDataW, RWI  )
		VARIABLE Count : STD_LOGIC_VECTOR(2 DOWNTO 0);
	BEGIN
		I2CDataW <= SPIDataW(7 DOWNTO 0); 
		
		IF( RESET='0' ) THEN 
			DataOUTI <= (OTHERS=>'0');
			CSI <= '1'; RWI <= '1'; 
			Count := (OTHERS=>'1'); 
		ELSIF( KeyFlagValidIIC1='1' ) THEN 
			Count := (OTHERS=>'0'); 
		ELSE 
			IF( GCLK'EVENT AND GCLK='1' ) THEN 
				IF( Count<"111" ) THEN 
					CSI <= '0'; 
					Count := Count + 1; 
					IF( KeyCode="0001" OR KeyCode="0101" OR KeyCode="0110" ) THEN 
						RWI <= '0'; 
					END IF; 
					--------------------------
					-- Send Command To I2C Controller 
					IF	 ( KeyCode="0001" ) THEN -- KeyCode = 1 : ERASE 
						IF	 ( Count="010" ) THEN I2C_Address <= "00"; DataOUTI	<= B"1010_0000"; 
						ELSIF( Count="100" ) THEN I2C_Address <= "01"; DataOUTI	<= B"0000_0001"; 
						ELSIF( Count="110" ) THEN I2C_Address <= "10"; DataOUTI	<= B"1111_1111"; -- 
						END IF; 
					ELSIF( KeyCode="0101" ) THEN -- KeyCode = 5 : READ 
						IF	 ( Count="010" ) THEN I2C_Address <= "00"; DataOUTI	<= B"1010_0001"; 
						ELSIF( Count="100" ) THEN I2C_Address <= "01"; DataOUTI	<= B"0000_0001"; 
						ELSIF( Count="110" ) THEN I2C_Address <= "10"; DataOUTI	<= B"1111_1111"; -- FF 
						END IF; 
					ELSIF( KeyCode="0110" ) THEN -- KeyCode = 6 : WRITE 
						IF	 ( Count="010" ) THEN I2C_Address <= "00"; DataOUTI	<= B"1010_0000"; 
						ELSIF( Count="100" ) THEN I2C_Address <= "01"; DataOUTI	<= B"0000_0001"; 
						ELSIF( Count="110" ) THEN I2C_Address <= "10"; DataOUTI	<= I2CDataW; -- 
						END IF; 
					-------------------------
					-- Receive the Data from I2C Controller 
					ELSE -- KeyCode = 0/7/8/9/A/B/C/D/E/F : Read 
						IF( STRBI='1' ) THEN I2CDataR <= DataINI; 
						END IF; 
					END IF; 
				ELSE 
					CSI <= '1'; RWI <= '1'; 
					DataOUTI <= (OTHERS=>'0');
				END IF; 
			END IF; 
		END IF; 
		
		IF( RWI='0' ) THEN 
			IF( Count="010" OR Count="100" OR Count="110" ) THEN STRBI <= '1'; 
			ELSE 												 STRBI <= '0'; 
			END IF; 
		ELSE 
			IF( Count="010" ) THEN STRBI <= '1'; 
			ELSE 				   STRBI <= '0'; 
			END IF; 
		END IF; 
			
	END PROCESS; 
	
	------------------------------------------------
	-- irDA 
	PROCESS( RESET )
	BEGIN
		
	END PROCESS; 
	-------------------------------------------------
	-------------------------------------------------
	
	
	--===============================================
	-------------------------------------------------
	-- LCD Display 
	PROCESS( RESET, CharAdd, LCD_ARRAY )
	BEGIN 
		IF( CONV_INTEGER(CharAdd)<32 ) THEN LCDValue <= LCD_ARRAY( CONV_INTEGER(CharAdd) ); 
		ELSE 								LCDValue <= "00000000";
		END IF; 
	END PROCESS; 
	
	-------------------------------------------------
	-- LCD Refresh 
	PROCESS( RESET, CLK1, CLK2P, Fresh, irDAValid, PS2Valid, UARTValid, KeyFlag, KeyFlagRefresh, CountSTEP, SW )
		VARIABLE Count : STD_LOGIC_VECTOR(1 DOWNTO 0);
	BEGIN 
		IF( RESET='0' ) THEN CLK2P <= '0';
		ELSIF( CLK1'EVENT AND CLK1='0' ) THEN CLK2P <= NOT CLK2P; 
		END IF; 
		
		-----------------------------------------------
		Fresh <= irDAValid OR PS2Valid OR UARTValid OR KeyFlag OR KeyFlagRefresh; 
		
		IF( RESET='0' OR Fresh='1' ) THEN Count := "00";
		ELSE 
			IF( CLK2P'EVENT AND CLK2P='1' ) THEN 
				IF( Count<"11" ) THEN Count := Count + 1; 
				END IF; 
			END IF; 
		END IF; 
		
		IF( Count="10" ) THEN LCDFresh <= '1';	
		ELSE 				  LCDFresh <= '0';	
		END IF; 
		
		IF( SW(0)='1' ) THEN Speak <= Fresh; 
		ELSE 				 Speak <= '0'; 
		END IF; 
	END PROCESS; 
	
	-------------------------------------------------
	-- The content of LCD1602 
	PROCESS( RESET, Fresh, irDACodeL, irDACodeM, irDACodeU, PS2Code, UARTCode, TempCode, KeyCode, CountSTEP, SPIDataW )   
		
	BEGIN 
		
		IF( RESET='0' ) THEN 
		--	LCD_ARRAY( 0  ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('w') ,8 ); 
		--	LCD_ARRAY( 1  ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('w') ,8 ); 
		--	LCD_ARRAY( 2  ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('w') ,8 ); 
		--	LCD_ARRAY( 3  ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('.') ,8 ); 
		--	LCD_ARRAY( 4  ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('I') ,8 ); 
		--	LCD_ARRAY( 5  ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('C') ,8 ); 
		--	LCD_ARRAY( 6  ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('D') ,8 ); 
		--	LCD_ARRAY( 7  ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('E') ,8 ); 
		--	LCD_ARRAY( 8  ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('V') ,8 ); 
		--	LCD_ARRAY( 9  ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('.') ,8 ); 
		--	LCD_ARRAY( 10 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('c') ,8 ); 
		--	LCD_ARRAY( 11 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('o') ,8 ); 
		--	LCD_ARRAY( 12 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('m') ,8 ); 
		--	LCD_ARRAY( 13 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('.') ,8 ); 
		--	LCD_ARRAY( 14 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('c') ,8 ); 
		--	LCD_ARRAY( 15 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('n') ,8 ); 
			
			LCD_ARRAY( 6  ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
			LCD_ARRAY( 7  ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
			LCD_ARRAY( 8  ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
			LCD_ARRAY( 9  ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
			LCD_ARRAY( 10 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
			LCD_ARRAY( 11 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
			LCD_ARRAY( 12 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
			LCD_ARRAY( 13 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
			LCD_ARRAY( 14 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
			LCD_ARRAY( 15 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
			
			LCD_ARRAY( 16 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('D') ,8 ); 
			LCD_ARRAY( 17 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('a') ,8 ); 
			LCD_ARRAY( 18 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('t') ,8 ); 
			LCD_ARRAY( 19 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('u') ,8 ); 
			LCD_ARRAY( 20 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('m') ,8 ); 
			LCD_ARRAY( 21 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(':') ,8 ); 
			LCD_ARRAY( 22 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('0') ,8 ); 
			LCD_ARRAY( 23 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('0') ,8 ); 
			LCD_ARRAY( 24 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('0') ,8 ); 
			LCD_ARRAY( 25 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('0') ,8 ); 
			LCD_ARRAY( 26 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
			LCD_ARRAY( 27 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
			LCD_ARRAY( 28 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('F') ,8 ); 
			LCD_ARRAY( 29 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('P') ,8 ); 
			LCD_ARRAY( 30 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('G') ,8 ); 
			LCD_ARRAY( 31 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('A') ,8 ); 
		ELSIF( Fresh='1' ) THEN 
			-- To ACSII Code 
			----------------------------------------------
			-- irDA 
			IF( irDACodeU(7 DOWNTO 4)<"1010" ) THEN LCD_ARRAY( 0 ) <= ("0000" & irDACodeU(7 DOWNTO 4)) + "00110000"; 
			ELSE 									LCD_ARRAY( 0 ) <= ("0000" & irDACodeU(7 DOWNTO 4)) + "00110111"; 
			END IF; 
			IF( irDACodeU(3 DOWNTO 0)<"1010" ) THEN LCD_ARRAY( 1 ) <= ("0000" & irDACodeU(3 DOWNTO 0)) + "00110000"; 
			ELSE 									LCD_ARRAY( 1 ) <= ("0000" & irDACodeU(3 DOWNTO 0)) + "00110111"; 
			END IF; 
			IF( irDACodeM(7 DOWNTO 4)<"1010" ) THEN LCD_ARRAY( 2 ) <= ("0000" & irDACodeM(7 DOWNTO 4)) + "00110000"; 
			ELSE 									LCD_ARRAY( 2 ) <= ("0000" & irDACodeM(7 DOWNTO 4)) + "00110111"; 
			END IF; 
			IF( irDACodeM(3 DOWNTO 0)<"1010" ) THEN LCD_ARRAY( 3 ) <= ("0000" & irDACodeM(3 DOWNTO 0)) + "00110000"; 
			ELSE 									LCD_ARRAY( 3 ) <= ("0000" & irDACodeM(3 DOWNTO 0)) + "00110111"; 
			END IF; 
			IF( irDACodeL(7 DOWNTO 4)<"1010" ) THEN LCD_ARRAY( 4 ) <= ("0000" & irDACodeL(7 DOWNTO 4)) + "00110000"; 
			ELSE 									LCD_ARRAY( 4 ) <= ("0000" & irDACodeL(7 DOWNTO 4)) + "00110111"; 
			END IF; 
			IF( irDACodeL(3 DOWNTO 0)<"1010" ) THEN LCD_ARRAY( 5 ) <= ("0000" & irDACodeL(3 DOWNTO 0)) + "00110000"; 
			ELSE 									LCD_ARRAY( 5 ) <= ("0000" & irDACodeL(3 DOWNTO 0)) + "00110111"; 
			END IF; 
			
			----------------------------------------------
			-- PS2 
			IF( PS2Code(7 DOWNTO 4)<"1010" ) THEN LCD_ARRAY( 7 ) <= ("0000" & PS2Code(7 DOWNTO 4)) + "00110000"; 
			ELSE 								  LCD_ARRAY( 7 ) <= ("0000" & PS2Code(7 DOWNTO 4)) + "00110111"; 
			END IF; 
			IF( PS2Code(3 DOWNTO 0)<"1010" ) THEN LCD_ARRAY( 8 ) <= ("0000" & PS2Code(3 DOWNTO 0)) + "00110000"; 
			ELSE 								  LCD_ARRAY( 8 ) <= ("0000" & PS2Code(3 DOWNTO 0)) + "00110111"; 
			END IF; 
			
			----------------------------------------------
			-- UART 
			IF( UARTCode(7 DOWNTO 4)<"1010" ) THEN LCD_ARRAY( 10) <= ("0000" & UARTCode(7 DOWNTO 4)) + "00110000"; 
			ELSE 								   LCD_ARRAY( 10) <= ("0000" & UARTCode(7 DOWNTO 4)) + "00110111"; 
			END IF; 
			IF( UARTCode(3 DOWNTO 0)<"1010" ) THEN LCD_ARRAY( 11) <= ("0000" & UARTCode(3 DOWNTO 0)) + "00110000"; 
			ELSE 								   LCD_ARRAY( 11) <= ("0000" & UARTCode(3 DOWNTO 0)) + "00110111"; 
			END IF; 
			
			----------------------------------------------
			-- KEY 
			IF( KeyCode<"1010" ) THEN LCD_ARRAY( 13) <= ("0000" & KeyCode) + "00110000"; 
			ELSE 					  LCD_ARRAY( 13) <= ("0000" & KeyCode) + "00110111"; 
			END IF; 
			
			----------------------------------------------
			-- SPIDataW 
			IF( CountSTEP/=0 ) THEN 
				---------------
				IF( SPIDataW(15 DOWNTO 12)<"1010" ) THEN LCD_ARRAY( 22 ) <= ("0000" & SPIDataW(15 DOWNTO 12)) + "00110000"; 
				ELSE 									 LCD_ARRAY( 22 ) <= ("0000" & SPIDataW(15 DOWNTO 12)) + "00110111"; 
				END IF; 
				---------------
				IF( CountSTEP>1 ) THEN 
					IF( SPIDataW(11 DOWNTO 8 )<"1010" ) THEN LCD_ARRAY( 23 ) <= ("0000" & SPIDataW(11 DOWNTO 8 )) + "00110000"; 
					ELSE 									 LCD_ARRAY( 23 ) <= ("0000" & SPIDataW(11 DOWNTO 8 )) + "00110111"; 
					END IF; 
				ELSE 
					LCD_ARRAY( 23 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
				END IF; 
				---------------
				IF( CountSTEP>2 ) THEN 
					IF( SPIDataW(7  DOWNTO 4 )<"1010" ) THEN LCD_ARRAY( 24 ) <= ("0000" & SPIDataW(7  DOWNTO 4 )) + "00110000"; 
					ELSE 									 LCD_ARRAY( 24 ) <= ("0000" & SPIDataW(7  DOWNTO 4 )) + "00110111"; 
					END IF; 
				ELSE 
					LCD_ARRAY( 24 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
				END IF; 
				---------------
				IF( CountSTEP>3 ) THEN 
					IF( SPIDataW(3  DOWNTO 0 )<"1010" ) THEN LCD_ARRAY( 25 ) <= ("0000" & SPIDataW(3  DOWNTO 0 )) + "00110000"; 
					ELSE 									 LCD_ARRAY( 25 ) <= ("0000" & SPIDataW(3  DOWNTO 0 )) + "00110111"; 
					END IF; 
				ELSE 
					LCD_ARRAY( 25 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
				END IF; 
			ELSE 
				LCD_ARRAY( 22 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
				LCD_ARRAY( 23 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
				LCD_ARRAY( 24 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
				LCD_ARRAY( 25 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 ); 
			END IF; 
		END IF; 
		
		
	END PROCESS;
	
	--===============================================
	-------------------------------------------------
	-- LED MUX 
	PROCESS( CLK1, Refresh, LED_ARRAY )   
	BEGIN
		IF( CLK1'EVENT AND CLK1 = '0' )THEN 
			Refresh <= Refresh + 1; 
		END IF; 
		
		LEDValue   <= LED_ARRAY( CONV_INTEGER(Refresh) ); 
		DigitValue <= Refresh; 
	END PROCESS;
	
	-------------------------------------------------
	LED_ARRAY( 0 ) <= TempCode( 7 DOWNTO 4 ); 
	LED_ARRAY( 1 ) <= TempCode( 3 DOWNTO 0 ); 
	
	LED_ARRAY( 2 ) <= I2CDataR( 7 DOWNTO 4 ); 
	LED_ARRAY( 3 ) <= I2CDataR( 3 DOWNTO 0 ); 
	
	LED_ARRAY( 4 ) <= SPIDataR( 15 DOWNTO 12 ); 
	LED_ARRAY( 5 ) <= SPIDataR( 11 DOWNTO 8  ); 
	LED_ARRAY( 6 ) <= SPIDataR( 7  DOWNTO 4  ); 
	LED_ARRAY( 7 ) <= SPIDataR( 3  DOWNTO 0  ); 
	
	-------------------------------------------------
	-------------------------------------------------
	
	MusicEnable <= SW(5);
	
END Behavioral;

⌨️ 快捷键说明

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