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

📄 up3_clock.vhd

📁 用vhdl设计实现的多功能电子钟
💻 VHD
📖 第 1 页 / 共 2 页
字号:
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= CHAR42;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR43;
				WHEN WRITE_CHAR43 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= CHAR43;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR44;
				WHEN WRITE_CHAR44 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= CHAR44;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR45;
				WHEN WRITE_CHAR45 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= CHAR45;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR46;
				WHEN WRITE_CHAR46 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= CHAR46 ;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR47;
				WHEN WRITE_CHAR47 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= CHAR47;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR48;
				WHEN WRITE_CHAR48 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= CHAR48;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR49;
				WHEN WRITE_CHAR49 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= CHAR49;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR4A;
				WHEN WRITE_CHAR4A =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= CHAR4A ;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR4B;
				WHEN WRITE_CHAR4B =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= CHAR4B;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR4C;
				WHEN WRITE_CHAR4C =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= CHAR4C;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR4D;
				WHEN WRITE_CHAR4D =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= CHAR4D ;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR4E;						
				WHEN WRITE_CHAR4E =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= CHAR4E ;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR4F;	
				WHEN WRITE_CHAR4F =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= CHAR4F;
						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 <= WRITE_CHAR0;
-- 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;
	
--******************************************************************************


--	SIGNAL CHAR0,CHAR1,CHAR2,CHAR3,CHAR4,CHAR5,CHAR6,CHAR7,CHAR8,CHAR9,CHARA,CHARB,CHARC,
--	CHARD,CHARE,CHARFCHAR40,CHAR41,CHAR42,CHAR43,CHAR44,CHAR45,CHAR46,CHAR47,CHAR48,
--	CHAR49,CHAR4A,CHAR4B,CHAR4C,CHAR4D,CHAR4E,CHAR4F:STD_LOGIC_VECTOR(7 DOWNTO 0);
--******************************************************************************
	PROCESS(CLK_10Hz,reset,AL2NOL)
	BEGIN
	IF(reset= '0')OR (AL2NOL ='0' ) THEN
	   WR_OR_BL <= '1';
	ELSE
	
	IF rising_edge(CLK_10Hz)  THEN
	        IF  (WR_OR_BL = '1') THEN
				   CHAR0 <= X"3" & BCD_HRD1;
				   CHAR1 <= X"3" & BCD_HRD0;
				   CHAR2 <= X"3A";
				   CHAR3 <= X"3" & BCD_MIND1;
				   CHAR4 <= X"3" & BCD_MIND0;
				   CHAR5 <= X"3A";
				   CHAR6 <= X"3" & BCD_SECD1;
				   CHAR7 <= X"3" & BCD_SECD0;
				   CHAR8 <= X"2E";
				   CHAR9 <= X"3" & BCD_TSEC;
				   CHARA <= X"20";
				   CHARE <= X"3"&BCD_CLK_HRD1;
				   CHARF <= X"3"&BCD_CLK_HRD0;
				   CHAR40 <= X"3" & BCD_YEAR3;
				   CHAR41 <= X"3" & BCD_YEAR2;
				   CHAR42 <= X"3" & BCD_YEAR1;
				   CHAR43 <= X"3" & BCD_YEAR0;
				   CHAR44 <= X"2E";
				   CHAR45 <= X"3" & BCD_MON1;
				   CHAR46 <= X"3" & BCD_MON0;
				   CHAR47 <= X"2E";
				   CHAR48 <= X"3" & BCD_DAY1;
				   CHAR49 <= X"3" & BCD_DAY0;
				   CHAR4A <= X"20";
				   CHAR4B <= X"3" & BCD_CLK_MIN1;
				   CHAR4C <= X"3" & BCD_CLK_MIN0;
				   CHAR4D <= X"3A";
				   CHAR4E <= X"3" & BCD_CLK_SEC1;
				   CHAR4F <= X"3" & BCD_CLK_SEC0;
				   WR_OR_BL <= '0';
			 ELSE
					   WR_OR_BL <= '1';
		               IF (MODIFY_HOUR1_CON = '1')  THEN
		         			IF (MOD_OR_SET = '1') THEN
			                    CHAR0 <= X"20";
			                ELSE
			                    CHARE <= X"20";
			                END IF;
		               ELSIF (MODIFY_HOUR0_CON = '1')  THEN 
		         			IF (MOD_OR_SET = '1') THEN
			                    CHAR1 <= X"20";
			                ELSE
		                        CHARF <= X"20";
			                END IF;		

					   ELSIF (MODIFY_MIN1_CON = '1') THEN
		         			IF (MOD_OR_SET = '1') THEN
			                    CHAR3 <= X"20";
			                ELSE
					            CHAR4B <= X"20";
			                END IF;					
					   ELSIF (MODIFY_MIN0_CON = '1') THEN
		         			IF (MOD_OR_SET = '1') THEN
			                    CHAR4 <= X"20";
			                ELSE
			                    CHAR4C <= X"20";
			                END IF;					
					   ELSIF (MODIFY_SECD1_CON = '1') THEN
		         			IF (MOD_OR_SET = '1') THEN
			                    CHAR6 <= X"20";
			                ELSE
			                    CHAR4E <= X"20";
			                END IF;					
					   ELSIF (MODIFY_SECD0_CON = '1') THEN
		         			IF (MOD_OR_SET = '1') THEN
			                    CHAR7 <= X"20";
			                ELSE
			                    CHAR4F <= X"20";
			                END IF;					
					
	                   ELSIF(MODIFY_YEAR3_CON = '1') THEN 
			                CHAR40 <= X"20";
                       ELSIF(MODIFY_YEAR2_CON = '1')   THEN
                            CHAR41 <= X"20";
                       ELSIF(MODIFY_YEAR1_CON = '1')   THEN
                            CHAR42 <= X"20";	
                       ELSIF(MODIFY_YEAR0_CON = '1')   THEN
                            CHAR43 <= X"20";
                       ELSIF(MODIFY_MON1_CON = '1')   THEN
                            CHAR45 <= X"20";
                       ELSIF(MODIFY_MON0_CON = '1')   THEN
                            CHAR46 <= X"20";
                       ELSIF(MODIFY_DAY1_CON = '1')   THEN
                            CHAR48 <= X"20";
                       ELSIF(MODIFY_DAY0_CON = '1')   THEN
                            CHAR49 <= X"20";
                       ELSE
						   CHAR0 <= X"3" & BCD_HRD1;
						   CHAR1 <= X"3" & BCD_HRD0;
						   CHAR2 <= X"3A";
						   CHAR3 <= X"3" & BCD_MIND1;
						   CHAR4 <= X"3" & BCD_MIND0;
						   CHAR5 <= X"3A";
						   CHAR6 <= X"3" & BCD_SECD1;
						   CHAR7 <= X"3" & BCD_SECD0;
						   CHAR8 <= X"2E";
						   CHAR9 <= X"3" & BCD_TSEC;
						   CHARA <= X"20";
						   CHARE <= X"3"&BCD_CLK_HRD1;
						   CHARF <= X"3"&BCD_CLK_HRD0;
						   CHAR40 <= X"3" & BCD_YEAR3;
						   CHAR41 <= X"3" & BCD_YEAR2;
						   CHAR42 <= X"3" & BCD_YEAR1;
						   CHAR43 <= X"3" & BCD_YEAR0;
						   CHAR44 <= X"2E";
						   CHAR45 <= X"3" & BCD_MON1;
						   CHAR46 <= X"3" & BCD_MON0;
						   CHAR47 <= X"2E";
						   CHAR48 <= X"3" & BCD_DAY1;
						   CHAR49 <= X"3" & BCD_DAY0;
						   CHAR4A <= X"20";
						   CHAR4B <= X"3" & BCD_CLK_MIN1;
						   CHAR4C <= X"3" & BCD_CLK_MIN0;
						   CHAR4D <= X"3A";
						   CHAR4E <= X"3" & BCD_CLK_SEC1;
						   CHAR4F <= X"3" & BCD_CLK_SEC0;

				       END IF;
				END IF;
			END IF;
	End IF;
	END PROCESS;
	
	   
	
	
--******************************************************************************
--  根据分频原理设置时间BCD_HRD1 <= X"0";			
--			BCD_HRD1   计10小时
--          BCD_HRD0   计1小时
--			BCD_MIND1  计10分钟
--			BCD_MIND0  计1分钟
--			BCD_SECD1  计10秒
--			BCD_SECD0  计1秒
--			BCD_TSEC   计0.1秒
--  通过以上变量可以以十进制的形式来输出时间例如:12:34:55.8
--  通过状态机产生的两个变量INC_CON 和DEC_CON 来控制调整时钟。
--******************************************************************************	
	
	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";

		ELSIF clk_10HZ'EVENT AND clk_10HZ = '1' THEN
		   IF(ONE_DAY = '1') THEN
		      ONE_DAY <= '0';
		   END IF;
-- TENTHS OF SECONDS 0.1秒
           IF NOT((COUNT_CON = '0')AND (MOD_OR_SET = '1' )) THEN
				IF BCD_TSEC < 9 THEN
				 BCD_TSEC <= BCD_TSEC + 1;
				ELSE
				 BCD_TSEC <= X"0";
		-- SECONDS  1秒
					IF BCD_SECD0 < 9 THEN
				 	   BCD_SECD0 <= BCD_SECD0 + 1;
					ELSE
			-- TENS OF SECONDS   10秒
					 BCD_SECD0 <= "0000";
					 	 IF BCD_SECD1 < 5 THEN
					  	      BCD_SECD1 <= BCD_SECD1 + 1;
					 	 ELSE
				-- MINUTES  1分钟
					  	 BCD_SECD1 <= "0000";
						  	 IF BCD_MIND0 < 9 THEN
						   	  BCD_MIND0 <= BCD_MIND0 + 1;
						  	 ELSE
					-- TENS OF MINUTES 10分钟
						   	  BCD_MIND0 <= "0000";
							   	  IF BCD_MIND1 < 5 THEN
							       BCD_MIND1 <= BCD_MIND1 + 1;
							   	  ELSE
						-- HOURS 1小时
							    	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  10小时
									     	 IF NOT((BCD_HRD1 = 2) AND (BCD_HRD0 = 3)) THEN
									      	  BCD_HRD1 <= BCD_HRD1 + 1;
									      	  BCD_HRD0 <= "0000";
									     	 ELSE
								-- NEW DAY  1天
									      	 BCD_HRD1 <= "0000";
								          	 BCD_HRD0 <= "0000";
								             ONE_DAY <= '1';
								         	END IF;
							           END IF;
						          END IF;
					         END IF;
				        END IF;
			       END IF;
			END IF;
			ELSE 
			   IF (HIT = '1')AND (MOD_OR_SET = '1') THEN
	                IF (MODIFY_HOUR1_CON = '1')  THEN
	                    IF (BCD_HRD0<4) THEN
	                      IF(KEY_BCD < 3) THEN
		                     BCD_HRD1 <= KEY_BCD;
		                    END IF;
		                  ELSE
		                     IF (KEY_BCD<3) THEN
		                       BCD_HRD1<=KEY_BCD;
		                       BCD_HRD0<="0000";
		                     END IF;
		                   END IF;
	                ELSIF (MODIFY_HOUR0_CON = '1')  THEN 
	                    IF(BCD_HRD1 = "0010")  THEN
	                         IF (KEY_BCD <4)  THEN
			                     BCD_HRD0 <= KEY_BCD;
			                 END IF;
			            ELSE
		                     BCD_HRD0 <= KEY_BCD;
		                END IF;
					ELSIF (MODIFY_MIN1_CON = '1') THEN
	                    IF(KEY_BCD < 6) THEN
		                     BCD_MIND1 <= KEY_BCD;
		                END IF;
					ELSIF (MODIFY_MIN0_CON = '1') THEN
						   BCD_MIND0 <= KEY_BCD;
					ELSIF (MODIFY_SECD1_CON = '1') THEN
	                    IF(KEY_BCD < 6) THEN
		                     BCD_SECD1 <= KEY_BCD;
		                END IF;
					ELSIF (MODIFY_SECD0_CON = '1') THEN
						   BCD_SECD0 <=KEY_BCD;
					END IF;
				END IF;
			END IF;			
	END IF;
 END PROCESS;

     
--************************************************************************************
--  修改状态机
--	TYPE STATE_TYPE_SET IS (COUNT,MODIFY_HOUR,MODIFY_MIN,MODIFY_SECD,MODIFY_YEAR,
--	MODIFY_MON,MODIFY_DAY,SET_HOUR,SET_MIN,SET_SECD,SET_YEAR,SET_MON,SET_DAY);
--  并不是直接在状态机里面进行操作,而是可以控制变量,然后用该变量控制其他进程
--  SET:   PROCESS (Clk_10hz,INC_CON,RESET )这样的写法是不对的因为BCD_HRD1不可以在不同
--  的进程中被不同的时钟驱动
--  写程序时遇到的问题有:忘写

⌨️ 快捷键说明

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