一、核心功能设计
按键暂停/继续:通过KEY1控制计时状态
按键消抖处理:20ms消抖周期消除机械抖动
硬件资源分配:符合DE2-115开发板引脚规范
二、核心模块实现详解
1. 顶层模块(counter)
bash
module counter(
input CLOCK_50, // 50MHz时钟(PIN_Y2)
input KEY0, // 复位按键(低有效,PIN_M23)
input KEY1, // 暂停按键(低有效,PIN_M21)
output [6:0] hex0, // 秒个位(PIN_AF10~AG16)
output [6:0] hex1, // 秒十位
output [6:0] hex2, // 分个位
output [6:0] hex3 // 分十位
2. 时钟分频模块(clock_divider)
bash
module clock_divider #(
parameter DIVIDER = 24_999_999 // 50MHz→1Hz
)(
input clk,
input reset,
output reg clk_out
);
reg [31:0] counter; // 32位计数器
always @(posedge clk or posedge reset) begin
if (reset) begin
counter <= 0;
clk_out <= 0;
end else if (counter == DIVIDER) begin
counter <= 0;
clk_out <= ~clk_out; // 输出翻转
end else
counter <= counter + 1;
end
endmodule
参数计算 :
T c y c l e = D I V I D E R + 1 f c l k = 25 , 000 , 000 50 , 000 , 000 = 0.5 s T_{cycle} = \frac{DIVIDER+1}{f_{clk}} = \frac{25,000,000}{50,000,000} = 0.5s Tcycle=fclkDIVIDER+1=50,000,00025,000,000=0.5s
f o u t = 1 2 × 0.5 s = 1 H z f_{out} = \frac{1}{2 \times 0.5s} = 1Hz fout=2×0.5s1=1Hz
3. 优化版按键消抖模块(key_debounce)
bash
module key_debounce #(
parameter DEBOUNCE_MS = 20, // 消抖时间
parameter CLK_FREQ = 50_000_000
)(
input clk,
input key_n, // 低有效
output reg key_pulse // 输出脉冲
);
4. 七段译码器(seg7_decoder)
bash
module seg7_decoder(
input [3:0] num,
output reg [6:0] seg
);
always @(*) begin
case(num)
4'd0: seg = 7'b1000000; // 共阳极编码
// ...其他数字编码
default: seg = 7'b1111111; // 全灭
endcase
end
endmodule
显示优化:
- 十进制拆分逻辑:
verilog
seg0(.num(seconds%10), // 个位
seg1(.num(seconds/10) // 十位
- 错误状态自动灭灯
三、关键电路设计
1. 复位信号展宽电路
verilog
reg [5:0] reset_hold = 0; // 6位展宽寄存器
always @(posedge CLOCK_50) begin
if (reset_pulse)
reset_hold <= 6'b111111; // 64周期展宽
else if (reset_hold > 0)
reset_hold <= reset_hold - 1;
end
时序特性:
- 展宽时间: t = 64 50 M H z = 1.28 μ s t = \frac{64}{50MHz} = 1.28\mu s t=50MHz64=1.28μs
- 确保计数器稳定复位
2. 状态控制FSM
verilog
always @(posedge CLOCK_50) begin
if (reset_extended) // 复位优先
running <= 1'b1;
else if (pause_pulse) // 暂停切换
running <= ~running;
end
四、工程文件结构
/fpga_counter
├── quartus/
│ ├── counter.qpf
│ └── DE2_115.qsf
├── modelsim/
│ ├── tb_counter.v
│ └── wave.do
└── src/
├── counter.v
└── seg7_decoder.v
五.实验结果
fpga3
六.总结
本次实验在 DE2 - 115 板子上使用 Verilog 完成分秒计数器设计。通过代码实现精准计数,同时加入按键暂停与消抖功能。经多次测试,计数器运行稳定,按键操作能有效控制,为后续数字电路设计积累了实践经验。