多功能数字时钟万年历温湿度DHT11设计
项目概述
名称: 多功能数字时钟万年历温湿度DHT11 VHDL+Verilog Quartus II
软件:?Quartus II
语言:?VHDL + Verilog
代码功能
熟悉QUARTUSII开发软件,掌握VHDL语言,掌握EDA技术及其开发流程;
设计一个多功能的数字钟,具有年、月、日、时、分、秒计数显示功能,以24小时循环计数;具有校对、闹铃功能及环境温湿度的采集显示。采用EDA技术自顶向下层次化设计方法,由控制模块、计时模块、显示、报时模块、闹铃模块及温湿度采集模块共同构建一个基于FPGA的数字钟。
用VHDL语言设计满足上述功能要求的数字钟,完成各功能模块的功能仿真,通过系统实验箱下载验证设计课题的正确性。
本项目实现了一个功能丰富的多模式数字时钟万年历系统,集成了DHT11温湿度传感器。系统具备时钟显示、万年历功能、闹钟设置、秒表计时、温湿度监测等多种功能。支持LCD1602液晶显示和数码管显示两种显示方式,用户可通过按键在不同功能模式间切换。系统采用24小时制时间显示,万年历支持年月日显示并能自动处理闰年和月份天数,闹钟功能支持定时提醒,秒表提供精确计时功能。
代码已在开发板验证
外设板PERI1-8KD说明书.pdf

演示视频
代码实现思路
系统架构设计
系统采用分层模块化设计,主要分为以下几个层次:
- 时钟基础层:提供系统时钟分频和基准时序
- 功能模块层:实现各种具体功能(时钟、万年历、闹钟、秒表等)
- 接口控制层:处理按键输入、传感器通信和显示输出
- 模式管理层:协调各功能模块的工作状态
关键技术实现
代码结构
主要模块说明
calendar
?- 万年历模块,实现年月日计算和闰年处理逻辑 clock
?- 时钟模块,提供时分秒计时功能和时钟分频 alarm
?- 闹钟模块,实现闹钟时间设置和报警功能 stopwatch
?- 秒表模块,提供精确的计时和暂停功能 dht11
?- 温湿度传感器模块,实现DHT11通信协议(Verilog实现) display
?- 显示控制模块,管理数码管的动态扫描显示 lcd1602
?- LCD显示模块,控制液晶屏的字符显示 mode_select
?- 模式选择模块,处理功能模式切换逻辑 change_io
?- 输入输出控制模块,处理按键输入和蜂鸣器输出 key_6s
?- 按键处理模块,实现按键防抖和长按检测 BCD
?- BCD码转换模块,处理数字显示的编码转换
系统接口定义
|
|
|
---|---|---|
时钟模块 | clk
rst ,?hour[7:0] ,?min[7:0] ,?sec[7:0] |
|
万年历模块 | year[15:0]
month[7:0] ,?day[7:0] |
|
DHT11模块 | dht11_data
temp[15:0] ,?humi[15:0] |
|
显示模块 | seg[7:0]
sel[5:0] ,?lcd_data[7:0] |
|
按键模块 | key_in[3:0]
key_out[3:0] |
|
功能模式说明
- 时钟模式:显示当前时分秒,支持12/24小时制切换
- 万年历模式:显示年月日和星期,自动处理闰年
- 闹钟模式:设置和显示闹钟时间,支持闹铃提醒
- 秒表模式:提供开始、暂停、复位的计时功能
- 温湿度模式:实时显示环境温度和湿度数据
- 设置模式:调整时间、日期和闹钟参数
设计特点
- 混合语言设计:主体采用VHDL,DHT11模块使用Verilog实现
- 多功能集成:集成时钟、万年历、闹钟、秒表、温湿度监测
- 双显示支持:同时支持LCD1602和数码管显示
- 智能万年历:自动处理闰年和各月天数差异
- 用户友好界面:直观的按键操作和模式切换
- 实时数据采集:DHT11传感器提供环境监测功能
技术亮点
- 精确时序控制:采用多级时钟分频确保计时精度
- 状态机设计:DHT11通信和按键处理均采用状态机实现
- 模块化架构:各功能模块独立设计,便于扩展和维护
- 资源优化:合理的逻辑设计,有效利用FPGA资源
工程相关图片

部分代码展示:
LIBRARY ieee;
? ?USE ieee.std_logic_1164.all;
? ?USE ieee.std_logic_unsigned.all;
--时分秒模块
ENTITY clock IS
PORT(
? ? ? clk ? ? ? ??: IN STD_LOGIC;
? ? ? RST ? ? ? ??: IN STD_LOGIC;
? ? ? hour_add ? ?: IN STD_LOGIC;
? ? ? minute_add ?: IN STD_LOGIC;
? ? ? day_cin ? ??: OUT STD_LOGIC;
? ? ? hour_out ? ?: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
? ? ? minute_out ?: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
? ? ? second_out ?: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END clock;
ARCHITECTURE behave OF clock IS
? ?SIGNAL hour ??:STD_LOGIC_VECTOR(7 DOWNTO 0);
? ?SIGNAL minute :STD_LOGIC_VECTOR(7 DOWNTO 0);
? ?SIGNAL second :STD_LOGIC_VECTOR(7 DOWNTO 0);
? ?SIGNAL day_en : STD_LOGIC :='0';
? ?SIGNAL cnt ? ?:STD_LOGIC_VECTOR(31 DOWNTO 0):="00000000000000000000000000000000";
BEGIN
? ?day_cin <= day_en;
PROCESS(clk, RST)
? ?BEGIN
IF(RST ='1') THEN
? ? ? ? ?cnt <="00000000000000000000000000000000";
ELSIF(clk'EVENT AND clk = '1') THEN
IF(cnt >="00000010111110101111000010000000") THEN-----------0000001111101000
? ? ? ? ? ? cnt <="00000000000000000000000000000000";
? ? ? ? ?ELSE
? ? ? ? ? ? cnt <= cnt +"00000000000000000000000000000001";
? ? ? ? ?END IF;
? ? ? END IF;
? ?END PROCESS;
PROCESS(clk, RST)
? ?BEGIN
IF(RST ='1') THEN
? ? ? ? ?hour <="00000000";
? ? ? ? ?minute <="00000000";
? ? ? ? ?second <="00000000";
? ? ? ? ?day_en <='0';
ELSIF(clk'EVENT AND clk = '1') THEN
IF(hour_add ='1') THEN
IF(hour >="00010111") THEN
? ? ? ? ? ? ? ?hour <="00000000";
? ? ? ? ? ? ELSE
? ? ? ? ? ? ? ?hour <= hour +"00000001";
? ? ? ? ? ? END IF;
ELSIF(minute_add ='1') THEN
IF(minute >="00111011") THEN
? ? ? ? ? ? ? ?minute <="00000000";
? ? ? ? ? ? ELSE
? ? ? ? ? ? ? ?minute <= minute +"00000001";
? ? ? ? ? ? END IF;
ELSIF(cnt >="00000010111110101111000010000000") THEN---------0000001111101000
IF(hour ="00010111" AND minute ="00111011" AND second ="00111011") THEN
? ? ? ? ? ? ? ?day_en <='1';
? ? ? ? ? ? ? ?hour <="00000000";
? ? ? ? ? ? ? ?minute <="00000000";
? ? ? ? ? ? ? ?second <="00000000";
ELSIF(minute ="00111011" AND second ="00111011") THEN
? ? ? ? ? ? ? ?day_en <='0';
? ? ? ? ? ? ? ?hour <= hour +"00000001";
? ? ? ? ? ? ? ?minute <="00000000";
? ? ? ? ? ? ? ?second <="00000000";
ELSIF(second ="00111011") THEN
? ? ? ? ? ? ? ?day_en <='0';
? ? ? ? ? ? ? ?hour <= hour;
? ? ? ? ? ? ? ?minute <= minute +"00000001";
? ? ? ? ? ? ? ?second <="00000000";
? ? ? ? ? ? ELSE
? ? ? ? ? ? ? ?day_en <='0';
? ? ? ? ? ? ? ?hour <= hour;
? ? ? ? ? ? ? ?minute <= minute;
? ? ? ? ? ? ? ?second <= second +"00000001";
? ? ? ? ? ? END IF;
? ? ? ? ?END IF;
? ? ? END IF;
? ?END PROCESS;
? ?hour_out <= hour;
? ?minute_out <= minute;
? ?second_out <= second;
END behave;
代码下载(付费可见):
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1549