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

📄 up3_clock.vhd

📁 用VHDL语言编写的一个闹钟程序
💻 VHD
📖 第 1 页 / 共 2 页
字号:

				WHEN WRITE_CHAR17 =>
						LCD_E <='1';
                                         LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"3" & BCD_DAY1;
						state<= TOGGLE_E;
						next_command <= WRITE_CHAR18;


				WHEN WRITE_CHAR18 =>
						LCD_E <='1';
                                         LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"3" & BCD_DAY0;
						state<= TOGGLE_E;
						next_command <= RETURN_HOME;
-----------------------
-- Return write address to first character postion
				WHEN RETURN_HOME =>
						LCD_E <= '1';
						LCD_RS <= '0';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"80";
						state <= TOGGLE_E;
						next_command <= DISPLAY_SET;
-----------						
				WHEN GOTO_NEXTLINE =>
						LCD_E <= '1';
						LCD_RS <= '0';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"C0";
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR11;
--------------
-- The next two states occur at the end of each command to the LCD
-- Toggle E line - falling edge loads inst/data to LCD controller
				WHEN TOGGLE_E =>
						LCD_E <= '0';
						state <= HOLD;
-- Hold LCD inst/data valid after falling edge of E line				
				WHEN HOLD =>
						state <= next_command;
			
			END CASE;
		END IF;
	END PROCESS;

	PROCESS (Clk_10hz, reset)
	BEGIN	        

		IF reset = '0' THEN
			BCD_HRD1 <= X"0";			
			BCD_HRD0 <= X"0";
			BCD_MIND1 <= X"0";
			BCD_MIND0 <= X"0";
			BCD_SECD1 <= X"0";
			BCD_SECD0 <= X"0";
			BCD_TSEC  <= X"0";
					
			state1 <= WRITE_HOUR;
			next_command1 <= WRITE_MIN;
	---		
		ELSIF CLK_10HZ'EVENT AND CLK_10HZ = '1' THEN
		
		    	
		  	IF SET_TIME = '0' AND SET_MOD = '0' THEN
							  
	      		CASE STATE1 IS 
				
				WHEN WRITE_HOUR =>
					IF SET_CHANGE = '0' THEN						
						state1 <= TOGGLE_E1;
						next_command1 <= WRITE_MIN;
						
					ELSE						
						IF SET_ADD= '0'	THEN
-- HOURS
	    			    	IF BCD_HRD0 < 9 AND NOT((BCD_HRD1 = 2) AND (BCD_HRD0 = 3))THEN
		     	 				BCD_HRD0 <= BCD_HRD0 + 1;
	    					ELSE
-- TENS OF HOURS
	     	 					IF NOT((BCD_HRD1 = 2) AND (BCD_HRD0 = 3)) THEN
	      	  						BCD_HRD1 <= BCD_HRD1 + 1;
	      							BCD_HRD0 <= "0000";
								ELSE
	      							BCD_HRD1 <= "0000";
          	 						BCD_HRD0 <= "0000";
         						END IF;
          					END IF;						
						END IF; 
						state1 <= TOGGLE_E1;
						next_command1 <= WRITE_HOUR;
					END IF;
						
				WHEN WRITE_MIN =>
					IF SET_CHANGE = '0' THEN					
						state1 <= TOGGLE_E1;
						next_command1 <= WRITE_SEC;
					ELSE
						IF SET_ADD= '0'	THEN
-- MINUTES
	  						IF BCD_MIND0 < 9 THEN
	   	  						BCD_MIND0 <= BCD_MIND0 + 1;
	  	 					ELSE
-- TENS OF MINUTES
	   	  						BCD_MIND0 <= "0000";
	   	  						IF BCD_MIND1 < 5 THEN
	       							BCD_MIND1 <= BCD_MIND1 + 1;
								ELSE
	    							BCD_MIND1 <= "0000";
								END IF;
							END IF;
						END IF;
						state1 <= TOGGLE_E1;
						next_command1 <= WRITE_MIN;
						
					END IF;
				
				WHEN WRITE_SEC =>
					IF SET_CHANGE = '0' THEN					
						state1 <= TOGGLE_E1;
						next_command1 <= WRITE_HOUR;
						
					ELSE
						IF SET_ADD= '0'	THEN
-- MINUTES
	  						IF BCD_SECD0 < 9 THEN
	   	  						BCD_SECD0 <= BCD_SECD0 + 1;
	  	 					ELSE
-- TENS OF MINUTES
	   	  					BCD_SECD0 <= "0000";
	   	  						IF BCD_SECD1 < 5 THEN
	       							BCD_SECD1 <= BCD_SECD1 + 1;
								ELSE
	    							BCD_SECD1 <= "0000";
								END IF;
							END IF; 
						state1 <= TOGGLE_E1;
						next_command1 <= WRITE_SEC;
						END IF;
					END IF;
	          	WHEN TOGGLE_E1 =>
					--	LCD_E <= '0';
						state1 <= HOLD1;
-- Hold LCD inst/data valid after falling edge of E line				
				WHEN HOLD1 =>
						state1 <= next_command1;
	            END CASE;                	      

			ELSIF  SET_TIME = '1' THEN	
-- TENTHS OF SECONDS
				IF BCD_TSEC < 9 THEN
		 			BCD_TSEC <= BCD_TSEC + 1;
				ELSE
		 			BCD_TSEC <= X"0";
-- SECONDS
					IF BCD_SECD0 < 9 THEN
	 	 				BCD_SECD0 <= BCD_SECD0 + 1;
					ELSE
-- TENS OF SECONDS
		 				BCD_SECD0 <= "0000";
	 	  				IF BCD_SECD1 < 5 THEN
	  	 					BCD_SECD1 <= BCD_SECD1 + 1;
	 	 				ELSE
-- MINUTES
	  	 					BCD_SECD1 <= "0000";
	  	 					IF BCD_MIND0 < 9 THEN
	   	  						BCD_MIND0 <= BCD_MIND0 + 1;
	  	 					ELSE
-- TENS OF MINUTES
	   	 			 			BCD_MIND0 <= "0000";
	   	  						IF BCD_MIND1 < 5 THEN
	       							BCD_MIND1 <= BCD_MIND1 + 1;
	   	  						ELSE
-- HOURS
	    							BCD_MIND1 <= "0000";
	    								IF BCD_HRD0 < 9 AND NOT((BCD_HRD1 = 2) AND (BCD_HRD0 = 3))THEN
	     	 								BCD_HRD0 <= BCD_HRD0 + 1;
	    								ELSE
-- TENS OF HOURS
	     	 								IF NOT((BCD_HRD1 = 2) AND (BCD_HRD0 = 3)) THEN
	      	  									BCD_HRD1 <= BCD_HRD1 + 1;
	      	  									BCD_HRD0 <= "0000";
	     	 								ELSE
-- NEW DAY
	      	 									BCD_HRD1 <= "0000";
          			 							BCD_HRD0 <= "0000";
												IF BCD_DAY0 < 9 THEN
													BCD_DAY0 <= BCD_DAY0 + 1;
												ELSE 
													BCD_DAY0 <= "0000";
												END IF;
         									END IF;
           								END IF;
          						END IF;
         					END IF;
        				END IF;
       				END IF;
	 			END IF;
		--TIME COUNT
			END IF;
			--MODEL CHOOSE
		 END IF;
--IF INIT
  END PROCESS;    



 PROCESS  (Clk_10hz)
 BEGIN
IF reset = '0' THEN
        TIME <= 0;
END IF;
    ALARM_LED <= '0';
 IF     SET_ALARM = '0' AND 
	CLOSE_ALARM = '1' AND 
        BCD_SECD0 = BCD_S0 AND 
	BCD_SECD1 = BCD_S1 AND 
	BCD_MIND1 = BCD_M1 AND 
	BCD_MIND0 = BCD_M0 AND 
	BCD_HRD1 = BCD_H1 AND 
	BCD_HRD0 = BCD_H0 THEN
        TIME <= 100;
	ALARM_LED <= '1';  
 ELSIF  SET_ALARM = '0' AND 
	CLOSE_ALARM = '0' AND 
        TIME > 0 THEN
	ALARM_LED <= '0';
        TIME <= 0;
ELSIF  BCD_SECD0 = BCD_S0 AND 
	((BCD_SECD1 = BCD_S1 + 1) OR (BCD_SECD1 =0 AND BCD_S1=5) )THEN
	TIME <= 0;
	ALARM_LED <= '0';
	
 ELSIF TIME > 0 AND 
       SET_ALARM = '0' THEN 
	ALARM_LED <= '1';
        TIME <= TIME - 1;
 ELSE
    ALARM_LED <= '0';
    TIME <= 0;
 END IF;
 END PROCESS;

 PROCESS (Clk_10hz)
 BEGIN
 	GIVE_TIME_LED <= '0';
 IF GIVE_TIME = '0' AND 
	BCD_SECD1 = 0 AND 
	BCD_SECD0 = 0 AND 
	BCD_MIND1 = 0 AND 
	BCD_MIND0 = 0 THEN
    GIVE_TIME_LED <= '1';
  ELSE 
    GIVE_TIME_LED <= '0';
 END IF;
 END PROCESS;


PROCESS (Clk_10hz, reset)
BEGIN

		IF reset = '0' THEN
			BCD_H1 <= X"0";			
			BCD_H0 <= X"0";
			BCD_M1 <= X"0";
			BCD_M0 <= X"0";
			BCD_S1 <= X"0";
			BCD_S0 <= X"0";	
			state2 <= ALARM_HOUR;
			next_command2 <= ALARM_MIN;
					
		ELSIF CLK_10HZ'EVENT AND CLK_10HZ = '1' THEN
		
		    	
		 IF SET_TIME = '0' AND SET_MOD = '1' THEN
							  
	      		CASE STATE2 IS 
			

				WHEN ALARM_HOUR =>
					IF SET_CHANGE = '0' THEN						
						state2 <= TOGGLE_E2;
						next_command2 <= ALARM_MIN;
						
					ELSE						
						IF SET_ADD= '0'	THEN
-- HOURS
	    			    	IF BCD_H0 < 9 AND NOT((BCD_H1 = 2) AND (BCD_H0 = 3))THEN
		     	 				BCD_H0 <= BCD_H0 + 1;
	    					ELSE
-- TENS OF HOURS
	     	 					IF NOT((BCD_H1 = 2) AND (BCD_H0 = 3)) THEN
	      	  						BCD_H1 <= BCD_H1 + 1;
	      							BCD_H0 <= "0000";
								ELSE
	      							BCD_H1 <= "0000";
          	 						BCD_H0 <= "0000";
         						END IF;
          					END IF;						
						END IF; 
						state2 <= TOGGLE_E2;
						next_command2 <= ALARM_HOUR;
					END IF;
					
				WHEN ALARM_MIN =>
					IF SET_CHANGE = '0' THEN					
						state2 <= TOGGLE_E2;
						next_command2 <= ALARM_SEC;
					ELSE
						IF SET_ADD= '0'	THEN
-- MINUTES
	  						IF BCD_M0 < 9 THEN
	   	  						BCD_M0 <= BCD_M0 + 1;
	  	 					ELSE
-- TENS OF MINUTES
	   	  						BCD_M0 <= "0000";
	   	  						IF BCD_M1 < 5 THEN
	       							BCD_M1 <= BCD_M1 + 1;
								ELSE
	    							BCD_M1 <= "0000";
								END IF;
							END IF;
						END IF;
						state2 <= TOGGLE_E2;
						next_command2 <= ALARM_MIN;						
					END IF;	
					
				WHEN ALARM_SEC =>
					IF SET_CHANGE = '0' THEN					
						state2 <= TOGGLE_E2;
						next_command2 <= ALARM_HOUR;
						
					ELSE
						IF SET_ADD= '0'	THEN
-- MINUTES
	  						IF BCD_S0 < 9 THEN
	   	  						BCD_S0 <= BCD_S0 + 1;
	  	 					ELSE
-- TENS OF MINUTES
	   	  					BCD_S0 <= "0000";
	   	  						IF BCD_S1 < 5 THEN
	       							BCD_S1 <= BCD_S1 + 1;
								ELSE
	    							BCD_S1 <= "0000";
								END IF;
							END IF; 
						state2 <= TOGGLE_E2;
						next_command2 <= ALARM_SEC;
						END IF;
					END IF;				
									
	          	WHEN TOGGLE_E2 =>
				--		LCD_E <= '0';
						state2 <= HOLD2;
-- Hold LCD inst/data valid after falling edge of E line				
				WHEN HOLD2 =>
						state2 <= next_command2;
	            END CASE; 
   END IF;
END IF;

END PROCESS;

END a;

⌨️ 快捷键说明

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