基于FPGA的数字电子时钟VHDL代码Quartus仿真

名称:基于FPGA的数字电子时钟VHDL代码Quartus仿真

软件:Quartus

语言:VHDL

代码功能:

设计要求为:

1.具有时分秒的计数显示功能    

2.具有清零功能,可数字时钟的小时,分钟进行调整。

3.12小时制和24小时制均可

4.具有日期和星期显示功能并且可对其进行调整

5.具有秒表功能

6.具有定时和闹钟功能



FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com


演示视频:

设计文档:

设计文档.doc

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. 仿真图

整体仿真图

计时模块仿真图

日期模块仿真图


部分代码展示:

LIBRARY ieee;
   USE ieee.std_logic_1164.all;
   USE ieee.std_logic_unsigned.all;
--万年历
ENTITY calendar IS
   PORT (
      CLK        : IN STD_LOGIC;
      RST        : IN STD_LOGIC;
      --年月日调整按键
      day_add    : IN STD_LOGIC;--天加
      day_sub    : IN STD_LOGIC;--天减
      month_add  : IN STD_LOGIC;--月加
      month_sub  : IN STD_LOGIC;--月减
      year_add   : IN STD_LOGIC;--年加
      year_sub   : IN STD_LOGIC;--年减  
      
  year_h     : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--年高位
      year_l     : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--年低位
      month      : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--月
  week       : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--星期
      day        : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)--天
   );
END calendar;
ARCHITECTURE behave OF calendar IS
   SIGNAL month_add_cin : STD_LOGIC := '0';
   SIGNAL month_sub_cin : STD_LOGIC := '0';
   SIGNAL year_add_cin  : STD_LOGIC := '0';
   SIGNAL year_sub_cin  : STD_LOGIC := '0';
   SIGNAL day_max    : STD_LOGIC_VECTOR(4 DOWNTO 0);----月最大天数
   SIGNAL year_h_temp  : STD_LOGIC_VECTOR(7 DOWNTO 0);
   SIGNAL year_l_temp  : STD_LOGIC_VECTOR(7 DOWNTO 0);
   SIGNAL month_temp   : STD_LOGIC_VECTOR(3 DOWNTO 0);
   SIGNAL day_temp     : STD_LOGIC_VECTOR(4 DOWNTO 0);
   SIGNAL week_temp     : STD_LOGIC_VECTOR(3 DOWNTO 0);--星期
BEGIN
--输出
   year_h<=year_h_temp;
   year_l <= year_l_temp;
   month <= month_temp;
   day <= day_temp;
   week <= week_temp;
--闰月判断
   PROCESS (CLK, RST)
   BEGIN
      IF (RST = '1') THEN
         day_max <= "11110";
      ELSIF (CLK'EVENT AND CLK = '1') THEN
         IF (NOT((year_l_temp(1 DOWNTO 0) = "00" AND year_l_temp /= "00000000") OR (year_h_temp(1 DOWNTO 0) = "00" AND year_l_temp = "00000000")) AND (month_temp = "0010")) THEN
            day_max <= "11100";--非闰年2月
         ELSIF (((year_l_temp(1 DOWNTO 0) = "00" AND year_l_temp /= "00000000") OR (year_h_temp(1 DOWNTO 0) = "00" AND year_l_temp = "00000000")) AND (month_temp = "0010")) THEN
            day_max <= "11101";--闰年2月
         ELSIF ((month_temp = "0100") OR (month_temp = "0110") OR (month_temp = "1001") OR (month_temp = "1011")) THEN
            day_max <= "11110";--小月
         ELSIF ((month_temp = "0001") OR (month_temp = "0011") OR (month_temp = "0101") OR (month_temp = "0111") OR (month_temp = "1000") OR (month_temp = "1010") OR (month_temp = "1100")) THEN
            day_max <= "11111";--大月
         ELSE
            day_max <= "11110";
         END IF;
      END IF;
   END PROCESS;
   
 --调整星期 
   PROCESS (CLK, RST)
   BEGIN
      IF (RST = '1') THEN
         week_temp <= "0011";--星期3
      ELSIF (CLK'EVENT AND CLK = '1') THEN
         IF (day_add = '1') THEN--加
            IF (week_temp >= "0111") THEN--星期最大7
               week_temp <= "0001";--最小1
            ELSE
               week_temp <= week_temp + "0001";--加1
            END IF;
         ELSIF (day_sub = '1') THEN--减
            IF (week_temp = "0001") THEN--最小1
               week_temp <= "0111";--星期最大7
            ELSE
               week_temp <= week_temp - "0001";--减1
            END IF;
         ELSIF (week_temp >= "0111") THEN--星期最大7
            week_temp <= "0111";--星期最大7
         ELSE
            week_temp <= week_temp;
         END IF;
      END IF;
   END PROCESS;
   
 --调整天  
   PROCESS (CLK, RST)
   BEGIN
      IF (RST = '1') THEN
         day_temp <= "00001";--1日
      ELSIF (CLK'EVENT AND CLK = '1') THEN
         IF (day_add = '1') THEN--加
            IF (day_temp >= day_max) THEN
               day_temp <= "00001";
               month_add_cin <= '1';--月进1
            ELSE
               day_temp <= day_temp + "00001";
               month_add_cin <= '0';
            END IF;
         ELSIF (day_sub = '1') THEN--减
            IF (day_temp = "00001") THEN
               day_temp <= day_max;
               month_sub_cin <= '1';--月减1
            ELSE
               day_temp <= day_temp - "00001";
               month_sub_cin <= '0';
            END IF;
         ELSIF (day_temp >= day_max) THEN
            day_temp <= day_max;
            month_add_cin <= '0';
            month_sub_cin <= '0';
         ELSE
            day_temp <= day_temp;
            month_add_cin <= '0';
            month_sub_cin <= '0';
         END IF;
      END IF;
   END PROCESS;
   
  --调整月 
   PROCESS (CLK, RST)
   BEGIN
      IF (RST = '1') THEN
         month_temp <= "0001";--1月
      ELSIF (CLK'EVENT AND CLK = '1') THEN
         IF (month_add = '1' OR month_add_cin = '1') THEN--加
            IF (month_temp >= "1100") THEN--12月
               month_temp <= "0001";
               year_add_cin <= '1';--年加1
            ELSE
               month_temp <= month_temp + "0001";
               year_add_cin <= '0';
            END IF;
         ELSIF (month_sub = '1' OR month_sub_cin = '1') THEN--减
            IF (month_temp = "0001") THEN
               month_temp <= "1100";
               year_sub_cin <= '1';--年减1
            ELSE
               month_temp <= month_temp - "0001";
               year_sub_cin <= '0';
            END IF;
         ELSE
            month_temp <= month_temp;
            year_add_cin <= '0';
            year_sub_cin <= '0';
         END IF;
      END IF;
   END PROCESS;

代码文件(付费下载):



1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 基于FPGA的数字电子时钟VHDL代码Quartus仿真

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员