构建可靠VHDL计时器:从时钟周期计数到小时
早期教程用wait for语句在仿真中延时。但wait for不能用于生产设计,因真实电路无法指令暂停。在VHDL模块中度量时间的实用方法是计数时钟周期。
每个数字设计都有已知频率的稳定时钟信号。若时钟100MHz,一秒等于1亿个时钟滴答。通过计数这些滴答可可靠生成秒、分、小时及更长时间。
本文属基础VHDL教程系列。
我们实现计数器在每个时钟上升沿增量。当计数器达时钟频率值,一秒过去,二级“秒”计数器增量。类似方法用于分钟(60秒后增量)和小时(60分钟后增量)。可链接更多计数器得天、周、月,仅受FPGA/ASIC资源和计数器位宽限制。
较长计数器消耗更多逻辑资源,也增加传播延迟。计数器链的关键路径必须适应时钟周期,否则综合失败。
练习:实现计时器
下面VHDL测试平台演示简单10Hz时钟以保持仿真时间合理。DUT为输出Seconds、Minutes、Hours信号的计时器。
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T18_TimerTb is end entity; architecture sim of T18_TimerTb is -- Slow clock for fast simulation constant ClockFrequencyHz : integer := 10; -- 10 Hz constant ClockPeriod : time := 1000 ms / ClockFrequencyHz; signal Clk : std_logic := '1'; signal nRst : std_logic := '0'; signal Seconds : integer; signal Minutes : integer; signal Hours : integer; begin -- Device Under Test (DUT) i_Timer : entity work.T18_Timer(rtl) generic map(ClockFrequencyHz => ClockFrequencyHz) port map ( Clk => Clk, nRst => nRst, Seconds => Seconds, Minutes => Minutes, Hours => Hours); -- Clock generator Clk <= not Clk after ClockPeriod / 2; -- Testbench sequence process is begin wait until rising_edge(Clk); wait until rising_edge(Clk); -- Release reset nRst <= '1'; wait; end process; end architecture;
下面是计时器模块本身。它计数滴答、秒、分、时,负复位(nRst)置位时复位所有计数器。
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T18_Timer is generic(ClockFrequencyHz : integer); port( Clk : in std_logic; nRst : in std_logic; -- Negative reset Seconds : inout integer; Minutes : inout integer; Hours : inout integer); end entity; architecture rtl of T18_Timer is -- Count clock periods signal Ticks : integer; begin process(Clk) is begin if rising_edge(Clk) then if nRst = '0' then Ticks <= 0; Seconds <= 0; Minutes <= 0; Hours <= 0; else if Ticks = ClockFrequencyHz - 1 then Ticks <= 0; if Seconds = 59 then Seconds <= 0; if Minutes = 59 then Minutes <= 0; if Hours = 23 then Hours <= 0; else Hours <= Hours + 1; end if; else Minutes <= Minutes + 1; end if; else Seconds <= Seconds + 1; end if; else Ticks <= Ticks + 1; end if; end if; end if; end process; end architecture;
波形确认正确操作:Seconds每滴答增量,Minutes每60秒增量,Hours每60分钟增量。
仿真中用run 50 hr在ModelSim跑50小时测试,用10Hz时钟保持运行时间可控。调整测试平台时钟频率是加速验证的常用策略。
真实硬件中,计数器链必须在一个时钟周期内完成。计数器位宽增长导致传播延迟增加,可能超出周期造成时序违例。具体极限取决于FPGA/ASIC系列和时钟速度。
关键要点
- VHDL中时间度量通过计数时钟周期实现。
- 降低测试平台时钟频率加速仿真且不改变设计。
进入下一教程学习高级计时器特性。
VHDL