VHDL 数字时钟设计概述
利用 FPGA 芯片在没有操作系统和定时器中断的情况下精准走时,可以通过纯硬件驱动的数字时钟系统实现。本示例使用 VHDL 语言在 Xilinx FPGA 上从底层逻辑搭建完整的 24 小时制时钟,并通过数码管实时显示时间。该方案避开软件延时的不稳定性,利用 FPGA 的硬逻辑资源,打造高精度、可扩展、模块化的时钟系统。
硬件时钟与软件定时器的区别
传统单片机依赖软件定时器加中断机制,存在中断延迟、多任务调度导致计时不准、系统复位时间丢失等隐患。而在 FPGA 中,使用纯组合与同步逻辑构建时钟。所有操作在硬件层面完成,每一个'秒'的到来由精确的时钟边沿触发,不受软件干扰。这种方式稳定可靠,有助于理解数字系统的工作原理。项目涵盖时序逻辑(计数器)、组合逻辑(译码器)、跨时钟域处理、I/O 资源优化及模块化设计思想。
时钟分频器设计
大多数 FPGA 开发板板载晶振频率为 50MHz 或 100MHz。主时钟每秒振荡 5000 万次,目标是从中提取出每秒跳一次的 1Hz 脉冲信号。
分频原理
让一个计数器对 50MHz 时钟上升沿进行累加,当它数到 25,000,000 时翻转一次输出电平,得到周期为 2 秒的方波;再取其半周期,即可得到 1Hz 的基准信号。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity clock_divider is
Port ( clk_in : in std_logic;
reset : in std_logic;
clk_out : out std_logic );
end clock_divider;
architecture Behavioral of clock_divider is
signal count : unsigned(24 downto 0) := (others => '0');
signal temp_clk : std_logic := '0';
begin
process(clk_in, reset)
begin
if reset = '1' then
count <= (others => '0');
temp_clk <= '0';
elsif rising_edge(clk_in) then
if count = 24999999 then
count <= (others => '0');
temp_clk <= not temp_clk;
else
count <= count + 1;
end if;
end if;
end process;
clk_out <= temp_clk;
end Behavioral;
注意区分生成的是秒脉冲(单周期高电平)还是 1Hz 方波。若用于触发'加一秒'动作,应生成单周期高电平脉冲;若用于驱动指示灯闪烁,则可保留方波。

