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

📄 example14-9.vhd

📁 vhdl 实例 通过实例学习vhdl 编程
💻 VHD
字号:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;

ENTITY timer IS
	PORT(
clk:IN std_logic;
		RSTbar:IN std_logic;
		conminute:IN std_logic_vector(7 downto 0);
		conhour:IN std_logic_vector(7 downto 0);
		minute:OUT std_logic_vector(13 downto 0);
		hour:OUT std_logic_vector(13 downto 0)
		);
END timer;

ARCHITECTURE behave OF timer IS
	-----------function decoder7--------------
	FUNCTION decoder7(decin:integer) RETURN std_logic_vector IS
		VARIABLE decout:std_logic_vector(6 downto 0);
	BEGIN
		decout:="1111110";
		CASE decin IS
			WHEN 0 =>
			decout:="0111111";
			WHEN 1 =>
			decout:="0011000";
			WHEN 2 =>
			decout:="1110110";
			WHEN 3 =>
			decout:="1111100";
			WHEN 4 =>
			decout:="1011001";
			WHEN 5 =>
			decout:="1101101";
			WHEN 6 =>
			decout:="1101111";
			WHEN 7 =>
			decout:="0111000";
			WHEN 8 =>
			decout:="1111111";
			WHEN 9 =>
			decout:="1111101";
			WHEN others =>NULL;
			decout:="0111111";
		END CASE;
		RETURN decout;
	END decoder7;
	-----------------------function logic2dec--------------
	FUNCTION logic2dec(conin:std_logic_vector)RETURN integer IS
		VARIABLE conout:integer;
	BEGIN
		conout:=0;
		FOR i IN 0 TO 5 LOOP
			IF conin(i)='1' THEN
				conout:=conout+2**i;
			END IF;
		END LOOP;
		
		RETURN conout;
	END logic2dec;
	--------------------process--------------
BEGIN
	PROCESS(clk)
		VARIABLE lminute,hminute,lhour,hhour:std_logic_vector(6 downto 0);
		VARIABLE storeminute,storehour:std_logic_vector(7 downto 0);
		VARIABLE hhour_num,lhour_num,hminute_num,lminute_num:integer;
		VARIABLE minute_num,hour_num:integer;
		VARIABLE  time_count:std_logic_vector(3 downto 0);
	BEGIN
		IF clk'event and clk='1' THEN
			IF RSTbar='1' THEN
				storeminute:="00000000";
				storehour:="00000000";
				hour_num:=0;
				minute_num:=0;
				time_count:="0000";
				lminute_num:=0;
				hminute_num:=0;
				hhour_num:=0;
				lhour_num:=0;
				minute<="11111101111110";
				hour<="11111101111110";
			ELSE
				IF storeminute/=conminute or storehour/=conhour THEN
					storeminute:=conminute;
					storehour:=conhour;
					time_count:="0000";
					minute_num:=logic2dec(storeminute);
					hour_num:=logic2dec(storehour);
				END IF;
					time_count:=time_count+"0001";
				IF time_count="1111" THEN
					minute_num:=minute_num+1;
				END IF;
					IF minute_num>=60 THEN
					minute_num:=minute_num-60;
					hour_num:=hour_num+1;
				END IF;
				FOR i IN 0 TO 5 LOOP
					IF minute_num>=10 THEN
						minute_num:=minute_num-10;
						hminute_num:=hminute_num+1;
					ELSE
						exit;
					END IF;
				END LOOP;
				lminute_num:=minute_num;
				IF hour_num>=24 THEN
					hour_num:=hour_num-24;
				END IF;
				FOR i IN 0 TO 1 LOOP
					IF hour_num>=10 THEN
						hhour_num:=hhour_num+1;
						hour_num:=hour_num-10;
					ELSE
						exit;
					END IF;
				END LOOP;
				lhour_num:=hour_num;
				lminute:=decoder7(lminute_num);
				hminute:=decoder7(hminute_num);
				lhour:=decoder7(lhour_num);
				hhour:=decoder7(hhour_num);
				minute<=hminute&lminute;
				hour<=hhour&lhour;
			END IF;
		END IF;
	END PROCESS;
END behave;

⌨️ 快捷键说明

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