基于FPGA的数字时钟设计

基于FPGA的数字时钟设计

芯片与开发板

在这里插入图片描述
技术指标
1.具有正常的日时分秒技术显示功能,用七个数码管分别显示日,时,分,秒。
2.有按键校日,校时,校分,校秒。
3.利用led模拟整点报时功能。
4.起始时间为周一00.00.00。

VHDL代码
分频器

Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all;
Use ieee.std_logic_arith.all;

Entity FDIV250 is
  generic(N: integer:=250);       --rate=N,N是偶数
  port(
        clkin: IN std_logic;
        clkout: OUT std_logic
        );
End FDIV250;
Architecture a of FDIV250 is
  signal cnt: integer range 0 to n/2-1;
  signal temp: std_logic;
Begin
  process(clkin)
  begin
      if(clkin'event and clkin='1') then
          if(cnt=n/2-1) then
              cnt <= 0;
              temp <= NOT temp;
          else
              cnt <= cnt+1;
          end if;
      end if;
  end process;
  clkout <= temp;
End a;

D触发器

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY D_DD_RS IS
PORT (D,CLOCK:IN STD_LOGIC;
					  Q:OUT STD_LOGIC);
END ENTITY D_DD_RS;

ARCHITECTURE BEHAVIOURAL OF D_DD_RS IS
BEGIN
PROCESS(CLOCK)IS
BEGIN
	IF (CLOCK'EVENT AND CLOCK = '1') THEN
		Q <= D;
	END IF;
END PROCESS;
END;

用D触发器构成的按键消抖电路
在这里插入图片描述
日期计数(7进制)初值1

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY DATE IS
PORT (KEYIN,CLK: IN STD_LOGIC;
	 DATE_0: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END;

ARCHITECTURE BHV OF DATE IS
SIGNAL DATE0 :STD_LOGIC_VECTOR(3 DOWNTO 0):="0001";
SIGNAL CLOCK :STD_LOGIC;
BEGIN
CLOCK <= CLK or (not KEYIN);
	PROCESS(CLOCK)
	BEGIN		
		IF(CLOCK'event and CLOCK = '1') THEN 
			IF(DATE0 = 7) THEN
				DATE0 <= "0001";
			ELSE
				DATE0 <= DATE0+1;
			END IF;
		END IF;
	END PROCESS;
DATE_0 <= DATE0;

END;

小时计数(BCD24)初值00

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY HOUR IS
PORT (KEYIN,CLK: IN STD_LOGIC;
	 RCO:OUT STD_LOGIC;
	 hour_1,hour_0: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END;

ARCHITECTURE BHV OF HOUR IS
SIGNAL hour1 :STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
SIGNAL hour0 :STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
SIGNAL CLOCK :STD_LOGIC;
BEGIN
CLOCK <= CLK or (not KEYIN);
 --由于键盘未按下是高电平,所以用非门和或门制作一个触发信号,上升沿进位
	PROCESS(CLOCK)
	BEGIN		
		IF(CLOCK'event and CLOCK = '1') THEN 
			IF(hour1 = 2 AND hour0 = 3) THEN
				hour1 <= "0000";
				hour0 <= "0000";
				RCO <= '1';
			ELSIF (hour0 = 9) THEN
				hour1 <= hour1+1;
				hour0 <= "0000";
			ELSE
				hour0 <= hour0+1;
				RCO <= '0';	
			END IF;
		END IF;
	END PROCESS;
	
	
hour_1 <= hour1;	
hour_0 <= hour0;

END;

分钟计数(BCD60)初值00

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY MIN IS
PORT (CLK,KEYIN: IN STD_LOGIC;
	  RCO:OUT STD_LOGIC;
	 min_1,min_0: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END;

ARCHITECTURE BHV OF MIN IS
SIGNAL min1 :STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
SIGNAL min0 :STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
SIGNAL CLOCK:STD_LOGIC;
BEGIN
CLOCK <= (not KEYIN) or CLK;
	PROCESS(CLOCK)
	BEGIN
		IF(CLOCK'event and CLOCK = '1') THEN 
			IF(min1 = 5 AND min0 = 9) THEN
				min1 <= "0000";
				min0 <= "0000";
				RCO <= '1';
			ELSIF(min0 = 9) THEN 
				min1 <= min1+1;
				min0 <= "0000";				
			ELSE
				min0 <= min0+1;		
				RCO <= '0';		
			END IF;			
		END IF;
	END PROCESS;

min_1 <= min1;	
min_0 <= min0;

END;

秒计数(BCD60)初值00

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY SEC IS
PORT (CLK: IN STD_LOGIC;
	  RCO:OUT STD_LOGIC;
	 sec_1,sec_0: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END;

ARCHITECTURE BHV OF SEC IS
SIGNAL sec1:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
SIGNAL sec0:STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";
BEGIN
	PROCESS(CLK)
	BEGIN
		IF(CLK'EVENT AND CLK = '1') THEN 
			IF(sec1 = 5 AND sec0 = 9) THEN
				sec1 <= "0000";
				sec0 <= "0000";
				RCO <= '1';
			ELSIF(sec0 = 9) THEN
				sec1 <= sec1+1;
				sec0 <= "0000";
			ELSE 
				sec0 <= sec0+1;
				RCO <= '0';
			END IF;
		END IF;
	END PROCESS;

sec_1 <= sec1;	
sec_0 <= sec0;

END;

选择器(CONTROL)

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY CONTROL IS
PORT (hour_1,hour_0,min_1,min_0,sec_1,sec_0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
	  DD:IN STD_LOGIC_VECTOR(2 DOWNTO 0);
	      Q1,Q2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END;

ARCHITECTURE BAV OF CONTROL IS
BEGIN		  
	Q1 <= min_0 WHEN DD = "000" ELSE
		  min_1 WHEN DD = "001" ELSE
		  hour_0 WHEN DD = "010" ELSE
		  hour_1 WHEN DD = "011" ELSE
		  "1111";
--由于开发板上只有4位数码管,所以外接延伸两个数码管显示秒的个位十位		  
    Q2 <= sec_0 WHEN DD = "100" ELSE		  
		  sec_1 WHEN DD = "101" ELSE
		  "1111";
END;

译码器(四位共阳极数码管)

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY DUAN IS
PORT (AA: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
	  YY:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END;

ARCHITECTURE BAV OF DUAN IS
SIGNAL TEMP:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN 
	PROCESS(AA,TEMP)
	BEGIN
		CASE AA IS
		    WHEN "0000" => TEMP <= "00111111";
			WHEN "0001" => TEMP <= "00000110";
			WHEN "0010" => TEMP <= "01011011";
			WHEN "0011" => TEMP <= "01001111";
			WHEN "0100" => TEMP <= "01100110";
			WHEN "0101" => TEMP <= "01101101";
			WHEN "0110" => TEMP <= "01111101";
			WHEN "0111" => TEMP <= "00000111";
			WHEN "1000" => TEMP <= "01111111";
			WHEN "1001" => TEMP <= "01101111";
			WHEN OTHERS => TEMP <= "00000000";
		END CASE;
		YY <= NOT TEMP;
	END PROCESS;
	END;

译码器(二位共阴极译码器)

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY DUAN2 IS
PORT (AA: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
	  YY:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END;

ARCHITECTURE BAV OF DUAN2 IS
SIGNAL TEMP:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN 
	PROCESS(AA,TEMP)
	BEGIN
		CASE AA IS
			WHEN "0000" => TEMP <= "00111111";
			WHEN "0001" => TEMP <= "00000110";
			WHEN "0010" => TEMP <= "01011011";
			WHEN "0011" => TEMP <= "01001111";
			WHEN "0100" => TEMP <= "01100110";
			WHEN "0101" => TEMP <= "01101101";
			WHEN "0110" => TEMP <= "01111101";
			WHEN "0111" => TEMP <= "00000111";
			WHEN "1000" => TEMP <= "01111111";
			WHEN "1001" => TEMP <= "01101111";
			WHEN OTHERS => TEMP <= "00000000";
		END CASE;
		YY <= TEMP;
	END PROCESS;
END;

译码器(一位共阳极译码器)

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY DUAN3 IS
PORT (AA: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
	  YY:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END;

ARCHITECTURE BAV OF DUAN3 IS
SIGNAL TEMP:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN 
	PROCESS(AA,TEMP)
	BEGIN
		CASE AA IS
			WHEN "0001" => TEMP <= "00000110";
			WHEN "0010" => TEMP <= "01011011";
			WHEN "0011" => TEMP <= "01001111";
			WHEN "0100" => TEMP <= "01100110";
			WHEN "0101" => TEMP <= "01101101";
			WHEN "0110" => TEMP <= "01111101";
			WHEN "0111" => TEMP <= "01111111"; 
			 --由于时日进制所以第七天显示数字8以模拟‘日’字
			WHEN OTHERS => TEMP <= "00000000";
		END CASE;
		YY <= NOT TEMP;
	END PROCESS;
	END;

报时电路

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY BAOSHI IS
PORT(CLK:IN STD_LOGIC;
	 min_1,min_0,sec_1,sec_0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);  
	 LED:OUT STD_LOGIC);
END;

ARCHITECTURE BAV OF BAOSHI IS
SIGNAL EN:STD_LOGIC;
SIGNAL min1,min0,sec1,sec0:STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

min1 <= min_1;
min0 <= min_0;
sec1 <= sec_1;
sec0 <= sec_0;

	PROCESS(min1,min0,sec1,sec0)
	BEGIN
		IF(min1 = 5 AND min0 = 9 AND sec1 = 5 AND sec0 = 5) THEN
			EN <= '1';
		ELSIF(min1 = 0 AND min0 = 0 AND sec1 = 0 AND sec0 = 0) THEN
			EN <= '0';
		ELSE
			EN <= EN;
		END IF;
	END PROCESS;
	
	PROCESS(EN)
	BEGIN
		IF(EN = '1') THEN 
			LED <= CLK;
		ELSIF(EN = '0') THEN
			LED <= '0';
		ELSE
			LED <= '0';
		END IF;
	END PROCESS;
END;

六进制计数器

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CNT5 IS
PORT(CLK: IN STD_LOGIC;
	  Q:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END;

ARCHITECTURE BAV OF CNT5 IS
SIGNAL Q1:STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN 
	PROCESS(CLK)
	BEGIN
		IF(CLK'EVENT AND CLK = '1') THEN
			Q1 <= Q1+1;
			IF(Q1 = 5) THEN 
				Q1 <= "000";
			END IF;
		END IF;		
	END PROCESS;
Q <= Q1;
END;

位选

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY WEI IS
PORT (Q: IN STD_LOGIC_VECTOR(2 DOWNTO 0);
	  DD:OUT STD_LOGIC_VECTOR(5 DOWNTO 0));
END;

ARCHITECTURE BAV OF WEI IS
BEGIN 
	PROCESS(Q)
	BEGIN
		CASE Q IS
			WHEN "000" => DD <= "001110"; 
			  --外接数码管位选高电平触发,内接数码管位选低电平触发
			WHEN "001" => DD <= "001101";
			WHEN "010" => DD <= "001011";
			WHEN "011" => DD <= "000111";
			WHEN "100" => DD <= "101111";
			WHEN "101" => DD <= "011111";
			WHEN OTHERS => DD <= "001111";
		END CASE;
	END PROCESS;
END;

顶层设计
在这里插入图片描述
在这里插入图片描述
文章有参考“思索与猫”《根据VHDL语言制作的数字钟》。

  • 10
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
多功能数字时钟是一种集计时、计数、闹铃、温湿度显示等多种功能于一体的电子时钟。它广泛应用于生活、工作、教育等领域,成为现代社会不可缺少的一部分。要设计一个多功能数字时钟,需要用到VHDL语言。 首先,VHDL是一种硬件描述语言,它可以描述数字电路的行为和结构,也可以模拟数字电路的实现。我们可以利用VHDL语言实现数字时钟中的各种功能,如时钟、闹铃、温湿度显示等。 其次,设计多功能数字时钟需要有几个关键模块。例如,时钟模块,它包括时钟的频率、时钟信号的分频、小时、分钟、秒的计数和显示等功能。还有,闹铃模块,它可以设置闹铃的时间和铃声,当时钟时间到达设定的闹铃时间时,闹铃即响。最后,温湿度显示模块,可以通过VHDL语言控制温湿度传感器的采集和数据显示等。 此外,采用VHDL进行数字时钟设计,有利于提高设计效率、简化开发流程和减少实现成本。因为VHDL语言可以模拟电路的实现过程,能够快速地检查和排除电路中的错误。同时,VHDL语言的可读性和可扩展性也为数字时钟设计和维护带来诸多便利。 综上所述,设计一个多功能数字时钟,需要用到VHDL语言,并开发出几个核心模块,而这些模块通过软件的方式进行实现,不仅能够提高效率,还能够保证数字时钟的可靠性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值