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

📄 up3_clock.vhd

📁 采用vhdl语言编写的UP3开发板电子钟程序。在quartus中编译完成。
💻 VHD
📖 第 1 页 / 共 2 页
字号:
							DATA_BUS_VALUE <= X"80";
							state <= TOGGLE_E;
							next_command <= WRITE_CHAR1;
-- 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_400hz, time_set_valid, alarm_set_valid)
		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"00";
			elsif clk_400hz'event and clk_400hz = '1' then
				if time_set_state = '0' and alarm_set_state = '0' then
					BCD_HRD1 <= count_hrd1;			
					BCD_HRD0 <= count_hrd0;
					BCD_MIND1 <= count_mind1;
					BCD_MIND0 <= count_mind0;
					BCD_SECD1 <= count_secd1;
					BCD_SECD0 <= count_secd0;
					BCD_TSEC  <= X"3" & count_tsec;				
				elsif time_set_state = '1' then
					BCD_HRD1 <= count_hrd1;			
					BCD_HRD0 <= count_hrd0;
					BCD_MIND1 <= count_mind1;
					BCD_MIND0 <= count_mind0;
					BCD_SECD1 <= count_secd1;
					BCD_SECD0 <= count_secd0;
					BCD_TSEC  <= X"20";
				elsif alarm_set_state = '1' then
					BCD_HRD1 <= alarm_hrd1;			
					BCD_HRD0 <= alarm_hrd0;
					BCD_MIND1 <= alarm_mind1;
					BCD_MIND0 <= alarm_mind0;
					BCD_SECD1 <= alarm_secd1;
					BCD_SECD0 <= alarm_secd0;
					BCD_TSEC  <= X"20";
				end if;
			end if;
		end process;
--计时		
	process (clk_10hz, reset, time_set_state)
		begin
			if reset = '0' then
				count_HRD1 <= X"0";			
				count_HRD0 <= X"0";
				count_MIND1 <= X"0";
				count_MIND0 <= X"0";
				count_SECD1 <= X"0";
				count_SECD0 <= X"0";
				count_TSEC  <= X"0";
				bcd_yrd3 <= X"0";
				bcd_yrd2 <= X"0";
				bcd_yrd1 <= X"0";
				bcd_yrd0 <= X"0";
				bcd_mond1 <= X"0";
				bcd_mond0 <= X"0";
				bcd_dad1 <= X"0";
				bcd_dad0 <= X"0";				
			elsif time_set_state = '1' then
				count_HRD1 <= set_hrd1;			
				count_HRD0 <= set_hrd0;
				count_MIND1 <= set_mind1;
				count_MIND0 <= set_mind0;
				count_SECD1 <= set_secd1;
				count_SECD0 <= set_secd0;
				count_TSEC  <= X"0";
				bcd_yrd3 <= set_yrd3;
				bcd_yrd2 <= set_yrd2;
				bcd_yrd1 <= set_yrd1;
				bcd_yrd0 <= set_yrd0;
				bcd_mond1 <= set_mond1;
				bcd_mond0 <= set_mond0;
				bcd_dad1 <= set_dad1;
				bcd_dad0 <= set_dad0;
			elsif clk_10HZ'EVENT AND clk_10HZ = '1' THEN
-- TENTHS OF SECONDS
				IF count_TSEC < 9 THEN
					count_TSEC <= count_TSEC + 1;
				ELSE
					count_TSEC <= X"0";
-- SECONDS
					IF count_SECD0 < 9 THEN
						count_SECD0 <= count_SECD0 + 1;
					ELSE
-- TENS OF SECONDS
						count_SECD0 <= "0000";
						IF count_SECD1 < 5 THEN
							count_SECD1 <= count_SECD1 + 1;
						ELSE
-- MINUTES
							count_SECD1 <= "0000";
							IF count_MIND0 < 9 THEN
								count_MIND0 <= count_MIND0 + 1;
							ELSE
-- TENS OF MINUTES
								count_MIND0 <= "0000";
								IF count_MIND1 < 5 THEN
									count_MIND1 <= count_MIND1 + 1;
								ELSE
-- HOURS
									count_MIND1 <= "0000";
									IF count_HRD0 < 9 AND NOT((count_HRD1 = 2) AND (count_HRD0 = 3))THEN
										count_HRD0 <= count_HRD0 + 1;
									ELSE
-- TENS OF HOURS
										IF NOT((count_HRD1 = 2) AND (count_HRD0 = 3)) THEN
											count_HRD1 <= count_HRD1 + 1;
											count_HRD0 <= "0000";
										ELSE
-- NEW DAY
											count_HRD1 <= "0000";
											count_HRD0 <= "0000";
--年月日
		if bcd_dad0 < 9 and bcd_dad1 < 2 then
			bcd_dad0 <= bcd_dad0 + 1;
		else
			if bcd_dad1 < 2 then
				bcd_dad0 <= X"0";
				bcd_dad1 <= bcd_dad1 + 1;
			else
				if bcd_dad1 = 2 and bcd_dad0 < 8 then
					bcd_dad0 <= bcd_dad0 + 1;
				else
					if bcd_mond1 = 0 and bcd_mond0 = 2 and (not(bcd_yrd1 = 0 and bcd_yrd0 = 0) and 
					bcd_yrd0(1) = '0' and bcd_yrd0(0) = '0') and bcd_dad0 < 9 then
						bcd_dad0 <= bcd_dad0 + 1;
					else
						if not(bcd_mond1 = 0 and bcd_mond0 = 2) and bcd_dad0 < 9 and bcd_dad1 < 3 then
							bcd_dad0 <= bcd_dad0 + 1;
						else
							if not(bcd_mond1 = 0 and bcd_mond0 = 2) and bcd_dad1 < 3 then
								bcd_dad0 <= X"0";
								bcd_dad1 <= bcd_dad1 + 1;
							else
								if (bcd_mond1 = 0 and (bcd_mond0 = 1 or bcd_mond0 = 3 or bcd_mond0 = 5
								or bcd_mond0 = 7 or bcd_mond0 = 8)) and (bcd_mond1 = 1 and (bcd_mond0 = 0 
								or bcd_mond0 = 2)) then
									bcd_dad1 <= bcd_dad1 + 1;
								else
									bcd_dad0 <= X"1";
									bcd_dad1 <= X"0";
									if not(bcd_mond1 = 1 and bcd_mond0 = 2) and bcd_mond0 < 9 then
										bcd_mond0 <= bcd_mond0 + 1;
									else
										if not(bcd_mond1 = 1 and bcd_mond0 = 2) then
											bcd_mond1 <= bcd_mond1 + 1;
											bcd_mond0 <= X"0";
										else
											bcd_mond1 <= X"0";
											bcd_mond0 <= X"1";
											if bcd_yrd0 < 9 then
												bcd_yrd0 <= bcd_yrd0 + 1;
											else
												bcd_yrd0 <= X"0";
												if bcd_yrd1 < 9 then
													bcd_yrd1 <= bcd_yrd1 + 1;
												else
													bcd_yrd1 <= X"0";
													if bcd_yrd2 < 9 then
														bcd_yrd2 <= bcd_yrd2 + 1;
													else
														bcd_yrd2 <= X"0";
														if bcd_yrd3 < 9 then
															bcd_yrd3 <= bcd_yrd3 + 1;
														else
															bcd_yrd3 <= X"0";
														end if;
													end if;
												end if;
											end if;
										end if;
									end if;
								end if;
							end if;
						end if;
					end if;
				end if;
			end if;
		end if;	
							
										END IF;
									END IF;
								END IF;
							END IF;
						END IF;
					END IF;
				END IF;
			end if;
		end process;
--校时设闹
	process (clk_48Mhz, inc_valid, reset)
		begin
			if reset = '0' then
				alarm_HRD1 <= X"0";			
				alarm_HRD0 <= X"0";
				alarm_MIND1 <= X"0";
				alarm_MIND0 <= X"0";
				alarm_SECD1 <= X"0";
				alarm_SECD0 <= X"0";
				set_HRD1 <= X"0";			
				set_HRD0 <= X"0";
				set_MIND1 <= X"0";
				set_MIND0 <= X"0";
				set_SECD1 <= X"0";
				set_SECD0 <= X"0";
			elsif clk_48Mhz'event and clk_48Mhz = '1' then
				if inc_valid = '1' then
					CASE MODIFY IS
--校时
						WHEN MDHR1 =>
							IF set_HRD1 < 2 THEN
								set_HRD1 <= set_HRD1 + 1;
							ELSE
								set_HRD1 <= X"0";
							END IF;
						WHEN MDHR0 =>
							IF set_HRD1 < 2 THEN
								IF set_HRD0 < 9 THEN
									set_HRD0 <= set_HRD0 + 1;
								ELSE
									set_HRD0 <= X"0";
								END IF;	
							ELSE
								IF set_HRD0 < 3 THEN
									set_HRD0 <= set_HRD0 + 1;
								ELSE
									set_HRD0 <= X"0";
								END IF;
							END IF;
						WHEN MDMIN1 =>
							IF set_MIND1 < 5 THEN
								set_MIND1 <= set_MIND1 + 1;
							ELSE
								set_MIND1 <= X"0";
							END IF;
						WHEN MDMIN0 =>
							IF set_MIND0 < 9 THEN
								set_MIND0 <= set_MIND0 + 1;
							ELSE
								set_MIND0 <= X"0";
							END IF;
						WHEN MDSEC1 =>
							IF set_SECD1 < 5 THEN
								set_SECD1 <= set_SECD1 + 1;
							ELSE
								set_SECD1 <= X"0";
							END IF;
						WHEN MDSEC0 =>
							IF set_SECD0 < 9 THEN
								set_SECD0 <= set_SECD0 + 1;
							ELSE
								set_SECD0 <= X"0";
							END IF;
						when mdyr3 =>
							if set_yrd3 < 9 then
								set_yrd3 <= set_yrd3 + 1;
							else
								set_yrd3 <= X"0";
							end if;
						when mdyr2 =>
							if set_yrd2 < 9 then
								set_yrd2 <= set_yrd2 + 1;
							else
								set_yrd2 <= X"0";
							end if;
						when mdyr1 =>
							if set_yrd1 < 9 then
								set_yrd1 <= set_yrd1 + 1;
							else
								set_yrd1 <= X"0";
							end if;
						when mdyr0 =>
							if set_yrd0 < 9 then
								set_yrd0 <= set_yrd0 + 1;
							else
								set_yrd0 <= X"0";
							end if;
						when mdmon1 =>
							if set_mond1 = X"0" then
								set_mond1 <= X"1";
							else
								set_mond1 <= X"0";
							end if;
						when mdmon0 =>
							if set_mond1 = X"1" then
								if set_mond0 < 2 then
									set_mond0 <= set_mond0 + 1;
								else
									set_mond0 <= X"0";
								end if;
							else
								if set_mond0 < 9 then
									set_mond0 <= set_mond0 + 1;
								else
									set_mond0 <= X"1";
								end if;								
							end if;
						when mdda1 =>
							if set_mond0 = X"2" and set_mond1 = X"0" then
								if set_dad1 < 2 then
									set_dad1 <= set_dad1 + 1;
								else
									set_dad1 <= X"0";
								end if;
							else
								if set_dad1 < 3 then
									set_dad1 <= set_dad1 + 1;
								else
									set_dad1 <= X"0";
								end if;
							end if;							
						when mdda0 =>
							if set_dad1 = X"2" then 
								if set_mond0 = X"2" and set_mond1 = X"0" and not(set_yrd0(1) = '0' and 
								set_yrd0(0) = '0') and not(set_yrd2(1) = '0' and set_yrd2(0) = '0' and 
								set_yrd1 = X"0" and set_yrd0 = X"0") then
									if set_dad0 < 8 then
										set_dad0 <= set_dad0 + 1;
									else 
										set_dad0 <= X"0";
									end if;
								else
									if set_dad0 < 9 then
										set_dad0 <= set_dad0 + 1;
									else 
										set_dad0 <= X"0";
									end if;
								end if;
							elsif set_dad1 = X"3" then
								if set_dad0 = X"0" then
									set_dad0 <= X"1";
								else
									set_dad0 <= X"0";
								end if;
							else
								if set_dad0 < 9 then
									set_dad0 <= set_dad0 + 1;
								else 
									set_dad0 <= X"0";
								end if;
							end if;
--设闹					
						WHEN alHR1 =>
							IF alarm_HRD1 < 2 THEN
								alarm_HRD1 <= alarm_HRD1 + 1;
							ELSE
								alarm_HRD1 <= X"0";
							END IF;
						WHEN alHR0 =>
							IF alarm_HRD1 < 2 THEN
								IF alarm_HRD0 < 9 THEN
									alarm_HRD0 <= alarm_HRD0 + 1;
								ELSE
									alarm_HRD0 <= X"0";
								END IF;	
							ELSE
								IF alarm_HRD0 < 3 THEN
									alarm_HRD0 <= alarm_HRD0 + 1;
								ELSE
									alarm_HRD0 <= X"0";
								END IF;
							END IF;
						WHEN alMIN1 =>
							IF alarm_MIND1 < 5 THEN
								alarm_MIND1 <= alarm_MIND1 + 1;
							ELSE
								alarm_MIND1 <= X"0";
							END IF;
						WHEN alMIN0 =>
							IF alarm_MIND0 < 9 THEN
								alarm_MIND0 <= alarm_MIND0 + 1;
							ELSE
								alarm_MIND0 <= X"0";
							END IF;	
						WHEN alSEC1 =>
							IF alarm_SECD1 < 5 THEN
								alarm_SECD1 <= alarm_SECD1 + 1;
							ELSE
								alarm_SECD1 <= X"0";
							END IF;
						WHEN alSEC0 =>
							IF alarm_SECD0 < 9 THEN
								alarm_SECD0 <= alarm_SECD0 + 1;
							ELSE
								alarm_SECD0 <= X"0";
							END IF;
						WHEN OTHERS => NULL;
					END CASE;
				end if;
			end if;
		END PROCESS;	
--状态转换
	PROCESS (clk_48mhz, TIME_SET_VALID, alarm_set_valid, RESET)
		BEGIN
			IF RESET = '0' THEN
				MODIFY <= COUNT;
				TIME_SET_STATE <= '0';
				alarm_set_state <= '0';
			ELSIF clk_48mhz'event and clk_48mhz = '1' then 
				if TIME_SET_VALID = '1' THEN
					CASE MODIFY IS
						WHEN COUNT => MODIFY <= MDHR1; TIME_SET_STATE <= '1';
						WHEN MDHR1 => MODIFY <= MDHR0; TIME_SET_STATE <= '1';
						WHEN MDHR0 => MODIFY <= MDMIN1; TIME_SET_STATE <= '1';
						WHEN MDMIN1 => MODIFY <= MDMIN0; TIME_SET_STATE <= '1';
						WHEN MDMIN0 => MODIFY <= MDSEC1; TIME_SET_STATE <= '1';
						WHEN MDSEC1 => MODIFY <= MDSEC0; TIME_SET_STATE <= '1';
						WHEN MDSEC0 => MODIFY <= MDyr3; TIME_SET_STATE <= '1';
						WHEN MDyr3 => MODIFY <= MDyr2; TIME_SET_STATE <= '1';
						WHEN MDyr2 => MODIFY <= MDyr1; TIME_SET_STATE <= '1';
						WHEN MDyr1 => MODIFY <= MDyr0; TIME_SET_STATE <= '1';
						WHEN MDyr0 => MODIFY <= MDmon1; TIME_SET_STATE <= '1';
						WHEN MDmon1 => MODIFY <= MDmon0; TIME_SET_STATE <= '1';
						WHEN MDmon0 => MODIFY <= MDda1; TIME_SET_STATE <= '1';
						WHEN MDda1 => MODIFY <= MDda0; TIME_SET_STATE <= '1';						
						WHEN MDda0 => MODIFY <= COUNT; TIME_SET_STATE <= '0';
						when others => time_set_state <= '0';
					END CASE;
				elsif alarm_set_valid = '1' then
					case modify is
						WHEN COUNT => MODIFY <= alHR1; alarm_SET_STATE <= '1';
						WHEN alHR1 => MODIFY <= alHR0; alarm_SET_STATE <= '1';
						WHEN alHR0 => MODIFY <= alMIN1; alarm_SET_STATE <= '1';
						WHEN alMIN1 => MODIFY <= alMIN0; alarm_SET_STATE <= '1';
						WHEN alMIN0 => MODIFY <= alSEC1; alarm_SET_STATE <= '1';
						WHEN alSEC1 => MODIFY <= alSEC0; alarm_SET_STATE <= '1';
						WHEN alSEC0 => MODIFY <= COUNT; alarm_SET_STATE <= '0';
						when others => alarm_set_state <= '0';
					end case;
				end if;
			END IF;
		END PROCESS;
--闹铃
	process (clk_10hz, cancel)
		begin
			if cancel = '0' then
				alarm_led <= '0';
				current <= normal;
			elsif clk_10hz'event and clk_10hz = '1' then
				case current is
					when normal =>
						if count_hrd1 = alarm_hrd1 and count_hrd0 = alarm_hrd0 and count_mind1 = alarm_mind1							and count_mind0 = alarm_mind0 and count_secd1 = alarm_secd1 and
							count_secd0 = alarm_secd0 and alarm = '0' then current <= alarm_on;
						elsif count_mind1 = X"0" and count_mind0 = X"0" and count_secd1 = X"0" and
							count_secd0 = X"0" and hour_alarm = '0' then current <= hour_on;
						else current <= normal;alarm_led <= '0';
						end if;
					when alarm_on =>
						if (count_secd1 = (alarm_secd1 + 1)) and count_secd0 = alarm_secd0 then
							current <= normal;
							alarm_led <= '0';
						else 
							alarm_led <= '1';
							current <= alarm_on;
						end if;
					when hour_on =>
						if count_secd0 = (alarm_secd0 + 1) then
							current <= normal;
							alarm_led <= '0';
						else
							alarm_led <= '1';
							current <= hour_on;
						end if;
				end case;
			end if;
		end process;					
--24hour to  12hour
	process (shift, bcd_hrd0, bcd_hrd1)
		begin
			if shift = '0' then
				if bcd_hrd1 = X"2" or (bcd_hrd1 = X"1" and bcd_hrd0 > 2) then
					am_pm <= X"50";
				else
					am_pm <= X"41";
				end if;
			else
				am_pm <= X"41";
			end if;
		end process;
END a;

⌨️ 快捷键说明

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