这个数字钟项目是基于SystemVerilog语言在Basys3 FPGA开发板上实现的综合功能时钟系统。作为国防科技大学数字逻辑与计算机设计课程的大作业,它不仅仅是一个简单的时钟显示,而是集成了多种实用功能的完整解决方案。
核心功能包括:
项目最大的特点是充分利用了Basys3开发板的硬件资源,通过按键和拨码开关实现了多种功能的切换和设置,同时使用LED灯和七段数码管提供了丰富的状态反馈。代码结构清晰,模块化设计合理,是学习FPGA数字逻辑设计的优秀范例。
Basys3是Digilent公司推出的一款入门级FPGA开发板,搭载Xilinx Artix-7 XC7A35T-1CPG236C FPGA芯片。这款开发板特别适合教学和原型开发,具有以下特点:
本项目使用的主要开发工具包括:
提示:Vivado的安装和配置需要特别注意版本兼容性。Basys3开发板推荐使用Vivado 2018.3或更高版本。
数字钟系统的顶层模块clock包含了所有功能的核心逻辑。模块的输入输出接口设计如下:
systemverilog复制module clock(
input logic clk_pre, // 100MHz主时钟
input logic TU, TL, TC, TD, TR, // 五个功能按键
input logic SET_TIME, DISPLAY_SWITCHER, ALARM_ENABLE, // 三个拨码开关
output logic dp, // 数码管小数点控制
output logic [10:0] disp_7seg, // 数码管显示信号
output logic mode1_date, mode2_stopwatch, mode3_countdown, mode4_alarm, // 模式指示灯
output logic alarm_light, down_light, // 闹钟和倒计时指示灯
output logic tag0, tag1, tag2 // 显示模式指示
);
系统通过枚举类型定义了五种工作模式:
systemverilog复制typedef enum integer {MAIN, ALARM, STOP_WATCH, DOWN, DATE} ModeType;
模式切换逻辑由RIGHT按键控制,循环顺序为:MAIN → DATE → STOP_WATCH → DOWN → ALARM → MAIN。
由于Basys3提供的是100MHz主时钟,而数字钟需要多种不同频率的时钟信号:
分频器通过计数器实现,代码片段如下:
systemverilog复制always_ff @ (posedge clk_pre) begin
cnt_sec <= cnt_sec + 1;
cnt_centi <= cnt_centi + 1;
cnt_disp <= cnt_disp + 1;
cnt_blink <= cnt_blink + 1;
if (cnt_sec == 100000000) begin // 1秒分频
cnt_sec <= 0;
clk_sec <= 1'b1;
end
else clk_sec <= 1'b0;
if (cnt_centi == 1000000) begin // 0.01秒分频
cnt_centi <= 0;
clk_centi <= 1'b1;
end
// 其他分频器类似...
end
基础时钟功能是数字钟的核心,实现时、分、秒的计时和显示。计时逻辑采用级联计数器结构:
systemverilog复制if (s0 == 9) begin
if (s1 == 5) begin
if (m0 == 9) begin
if (m1 == 5) begin
if (h0 == 3 && h1 == 2) begin
{s0, s1, m0, m1, h0, h1} <= 24'd0; // 23:59:59 → 00:00:00
jw_d <= 1'b1; // 日期进位信号
end
// 小时进位逻辑...
end
// 分钟进位逻辑...
end
// 秒进位逻辑...
end
// 秒个位计数...
end
日期功能需要考虑月份天数的变化,通过组合逻辑实现:
systemverilog复制always_comb begin
case ({mm1, mm0})
{4'd0, 4'd1}: Handsome_ksj = {4'd3, 4'd1}; // 1月31天
{4'd0, 4'd2}: Handsome_ksj = {4'd2, 4'd8}; // 2月28天(不考虑闰年)
// 其他月份...
endcase
end
日期进位逻辑与时钟联动,当时钟从23:59:59变为00:00:00时触发日期更新。
秒表功能精确到百分之一秒,使用独立的计数器:
systemverilog复制if (cs0 == 9) begin
if (cs1 == 9) begin
if (cm0 == 9) begin
if (cm1 == 5) begin
if (ch0 == 9) begin
if (ch1 == 5) begin
{cs0, cs1, cm0, cm1, ch0, ch1} = 24'd0; // 59:59.99 → 00:00.00
end
// 小时进位...
end
// 分钟进位...
end
// 秒进位...
end
// 0.1秒进位...
end
// 0.01秒计数...
end
倒计时功能采用递减计数器,具有以下特点:
RESET按键重置倒计时核心逻辑:
systemverilog复制if (ds0 == 0) begin
ds0 <= 4'd9;
if (ds1 == 0) begin
ds1 <= 4'd5;
if (dm0 == 0) begin
// 分钟和小时借位逻辑...
end
// 其他借位...
end
// 其他借位...
end else begin
ds0 <= ds0 - 1; // 秒个位递减
end
闹钟功能实现要点:
ALARM_ENABLE启用/禁用闹钟触发逻辑:
systemverilog复制if (s0 == as0 && s1 == as1 && m0 == am0 && m1 == am1 && h0 == ah0 && h1 == ah1) begin
alarm_sig <= 1'b1;
if (!alarm_sig && ALARM_ENABLE) alarm_time <= 5; // 触发5秒闪烁
end
系统充分利用Basys3的五个按键实现多功能控制:
| 按键 | 功能描述 |
|---|---|
| TU | 设置模式下当前位+1 |
| TL | 设置模式下循环切换设置位 |
| TC | 秒表模式下暂停/开始 |
| TD | 重置当前模式 |
| TR | 循环切换显示模式 |
机械按键存在抖动问题,本项目采用三级寄存器链消抖:
systemverilog复制always_ff @ (posedge clk_centi) begin
tmpU3 <= tmpU2;
tmpU2 <= tmpU1;
tmpU1 <= TU;
// 其他按键类似...
end
always_comb begin
UP = tmpU1 & tmpU2 & tmpU3; // 只有当连续三个周期都检测到按键按下才视为有效
// 其他按键类似...
end
系统采用动态扫描方式驱动4位7段数码管,主要特点:
显示控制逻辑:
systemverilog复制always_comb begin
case (disp_pos)
0: begin disp_7seg[10:7] = 4'b1110; disp_number = disp_B0; end // 选中第一位
1: begin disp_7seg[10:7] = 4'b1101; disp_number = disp_B1; end // 选中第二位
// 其他位...
endcase
// 7段译码
case (disp_number)
4'd0: disp_7seg[6:0] = 7'b0000001; // 数字0的段码
4'd1: disp_7seg[6:0] = 7'b1001111; // 数字1的段码
// 其他数字...
endcase
end
约束文件(XDC)定义了引脚分配和电气特性,是FPGA设计的关键部分。本项目的主要约束包括:
tcl复制set_property PACKAGE_PIN W5 [get_ports clk_pre]
set_property IOSTANDARD LVCMOS33 [get_ports clk_pre]
create_clock -period 10 -name clk_pre [get_ports clk_pre]
tcl复制set_property PACKAGE_PIN T18 [get_ports TU]
set_property IOSTANDARD LVCMOS33 [get_ports TU]
tcl复制set_property PACKAGE_PIN W4 [get_ports {disp_7seg[10]}]
set_property IOSTANDARD LVCMOS33 [get_ports {disp_7seg[10]}]
tcl复制set_property PACKAGE_PIN L1 [get_ports mode1_date]
set_property IOSTANDARD LVCMOS33 [get_ports mode1_date]
数码管显示异常:
按键响应不灵敏:
计时不准:
这个数字钟项目从设计到实现展示了完整的FPGA开发流程,涵盖了数字逻辑设计的多个重要概念。通过本项目的学习和实践,可以深入理解时序电路设计、状态机控制、人机交互等关键技术,为更复杂的FPGA项目开发打下坚实基础。