1. 设计目标
- 实现 24 小时制数字时钟的基本计时功能(时:分:秒)
- 通过 8 位数码管显示时间,格式为 HH.MM.SS
- 支持按键调整时间(秒、分、时分别可调)
- 拓展:本设计实现闹钟功能,可设置闹钟时间并在指定时间触发蜂鸣器报警
2. 开发流程
2.1 开发环境
| 目标器件 | EP4CE10F17C8 (Altera Cyclone IV) | | 开发工具 | Quartus II 13.0 | | 系统时钟 | 50MHz 晶振 | | 编程语言 | Verilog HDL |
2.2 架构设计
为了提供一种最简单直观的显示,开发板上提供了一个 7 段 8 位共阳极数码管电路。为了减少对 FPGA 引脚资源的占用,开发板上的数码管采用串行移位寄存器芯片将串行数据转化为 16 位并行数据后进行驱动。Cyclone IV E 通过 3 根数据线,连接到两片级联的串行移位器芯片 74HC595 上,再由 74HC595 将每次 16 位串行的数据转化为 16 位并行的数据,分别用以驱动 7 段 8 位数码管的段选和位选。

top 顶层模块,负责各子模块的连接与信号分配(top.v)
Project_Segled2 数字时钟核心模块,包含计时、显示、按键处理、闹钟等功能(Project_Segled2.v)
HC595_Driver 74HC595 移位寄存器驱动,实现串行数据输出(HC595_Driver.v)
2.3 顶层 IO
module top(
input Clk, // 50MHz 系统时钟
input Rst_n, // 复位信号(低电平有效)
input KEY1, // 模式切换/长按进入闹钟设置
input KEY2, // 数值递增按键
output SH_CP, // 74HC595 移位时钟
output ST_CP, // 74HC595 锁存时钟
output DS, // 74HC595 串行数据
output BEEP // 蜂鸣器输出
);
2.4 数字时钟核心模块 (Project_Segled2.v)
2.4.1 按键消抖
采用计数器消抖方式,消抖时间约 20ms:
parameter DB_CNT_MAX = 20'd100; // 消抖计数最大值
// 两级同步 + 计数消抖
always @(posedge CLK_50M or negedge RST_N) begin
if(!RST_N) begin
k1_sync0 <= 1'b1;
k1_sync1 <= 1'b1;
end else begin
k1_sync0 <= FLAG1;
k1_sync1 <= k1_sync0;
end
end
设计特点:
- 采用两级触发器同步,防止亚稳态
- 检测高→低电平翻转,产生单周期脉冲
- 支持长按检测(1 秒),用于进入闹钟设置模式
2.4.2 计时
基于 50MHz 时钟进行分频,实现秒、分、时的计时:
// 关键参数
parameter SET_TIME_1S = 'd50_000_000; // 1 秒计数值
parameter SIXTY = 'd60; // 60 进制
parameter TWENTYFORE = 'd24; // 24 进制
// 1 秒定时器
always @ (posedge CLK_50M or negedge RST_N) begin
if(!RST_N)
cnt_1s <= 28'd0;
else if(set_mode != 2'd0) // 调整模式下暂停
cnt_1s <= 28'd0;
else if(cnt_1s == SET_TIME_1S - 1)
cnt_1s <= 28'd0;
else
cnt_1s <= cnt_1s + 28'b1;
end

