基于Spartan6写FPGA秒表 可扩展功能的入门实战教程参考 时间:2026-09-14 来源:小宸
1. 基于Spartan-6的FPGA秒表设计:从零实现数字时钟项目
2. FPGA秒表实战入门:Spartan-6开发板手把手教你做
3. 如何用Spartan-6写一个FPGA秒表?完整项目教程
> "学了这么多Verilog,到底能不能做出一个像样的东西?"——这是每个FPGA初学者最真实的困惑。今天,我们用一块Spartan-6开发板,从零搭建一个功能完整的数字秒表。
在FPGA学习路线中,秒表项目具有不可替代的地位。它涵盖了计数器设计、分频器、数码管显示、按键消抖、状态机控制等核心知识点,但复杂度又足够可控,非常适合初学者建立信心。
许多学员在FPGA培训过程中,都会从秒表项目开始实践。它不仅能检验你对基础语法的掌握,更能让你理解"硬件思维"与"软件思维"的本质区别。
一个标准的FPGA秒表系统由以下模块组成:
系统时钟(50MHz) → 分频器 → 1Hz时钟 → 计数器模块 → 译码模块 → 数码管显示
↑
按键控制模块(复位/启动/暂停)
| 模块 | 功能说明 |
|---|---|
| 分频器 | 将50MHz系统时钟分频为1Hz精准时钟信号 |
| 计数器 | 接收1Hz时钟,实现秒、毫秒的累加计数 |
| 译码模块 | 将BCD码转换为数码管段选信号 |
| 按键消抖 | 滤除机械按键抖动,确保控制稳定 |
Spartan-6的开发板通常搭载50MHz晶振。要实现秒级计数,需要将其分频为1Hz:
module clk_div(
input wire clk, // 50MHz系统时钟
input wire rst, // 复位信号
output reg clk_out // 1Hz输出
);
reg [25:0] count;
always @(posedge clk or posedge rst) begin
if (rst) begin
count <= 26'd0;
clk_out <= 1'b0;
end else if (count == 26'd24_999_999) begin
count <= 26'd0;
clk_out <= ~clk_out;
end else begin
count <= count + 1'b1;
end
end
endmodule
> 关键点:分频值为25,000,000(50MHz的一半),因为我们需要方波,所以计数到该值时翻转电平,形成50%占空比的1Hz时钟。
module stopwatch_counter(
input wire clk,
input wire rst,
input wire start_stop, // 启动/暂停控制
output reg [31:0] display_data, // BCD码输出
output reg running
);
reg [31:0] count;
always @(posedge clk or posedge rst) begin
if (rst) begin
count <= 32'd0;
running <= 1'b0;
end else begin
case (start_stop)
1'b0: running <= 1'b0; // 暂停
1'b1: begin
running <= 1'b1;
if (count == 32'd9999)
count <= 32'd0; // 归零循环
else
count <= count + 1'b1;
end
endcase
end
end
// 将计数值转换为BCD码用于显示
assign display_data = count;
endmodule
FPGA驱动数码管需要译码逻辑。以共阴数码管为例:
module hex_to_seg(
input wire [3:0] bcd,
output reg [6:0] seg
);
always @(*) begin
case (bcd)
4'd0: seg = 7'b1000000;
4'd1: seg = 7'b1111001;
4'd2: seg = 7'b0100100;
4'd3: seg = 7'b0110000;
4'd4: seg = 7'b0011001;
4'd5: seg = 7'b0010010;
4'd6: seg = 7'b0000010;
4'd7: seg = 7'b1111000;
4'd8: seg = 7'b0000000;
4'd9: seg = 7'b0010000;
default: seg = 7'b1111111;
endcase
end
endmodule
在实际项目中,机械按键按下时会产生抖动(持续约5-10ms),如果不做消抖处理,会导致计数异常跳变。
常用消抖方法有两种:
硬件消抖:使用RS触发器或电容滤波电路
软件消抖:在Verilog中延时检测,确认稳定后再响应
// 软件消抖核心逻辑
if (!key_in) begin
if (delay_count < 20'd100_000) // 约10ms(50MHz时钟)
delay_count <= delay_count + 1'b1;
else
key_flag <= 1'b1;
end else begin
delay_count <= 20'd0;
key_flag <= 1'b0;
end
很多学员在自学过程中,容易陷入"只会写代码、不会调bug"的困境。一个完整的FPGA项目不仅需要代码能力,还需要:
1. 工具链熟练度:掌握Vivado/Quartus的完整流程
2. 时序约束能力:理解setup/hold time,能独立完成xdc约束
3. 调试技巧:熟练使用ILA/SignalTap进行在线调试
4. 系统设计思维:能够模块化分解复杂功能
如果你正在寻找系统的FPGA培训课程,宸极教育提供从入门到进阶的完整课程体系,涵盖Spartan-6、Zynq、UltraScale等多个平台,帮助你从零开始掌握FPGA开发的核心技能。
一个基于Spartan-6的秒表项目,看似简单,实则涵盖了FPGA开发的方方面面。它是检验学习成果的最佳试金石,也是通往更复杂项目的必经之路。
思考题:你的秒表如何支持"分段计时"功能?如果需要在运行过程中记录多圈时间并显示,你会如何设计模块结构?
> 想系统学习FPGA开发?欢迎在右下角客服窗口联系宸极教育,获取免费试听课程和学习规划建议。
下一篇:没有了