亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> VHDL

构建可靠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

  1. VHDL 字符串列表创建:最佳实践与示例
  2. 基于 Tcl 驱动的 VHDL 密码锁模块测试平台
  3. 优雅结束 VHDL 测试平台仿真
  4. VHDL 实现 PWM 控制器:设计、仿真与 FPGA 演示
  5. VHDL 生成随机数:从均匀分布到 OSVVM
  6. 在块RAM中设计健壮的VHDL环形缓冲区FIFO
  7. 构建VHDL自检测试平台实战指南
  8. 用VHDL受保护类型和访问指针实现动态链表
  9. 利用进程内过程简化VHDL状态机设计
  10. 使用VHDL不纯函数提升FSM可读性与可维护性
  11. 掌握VHDL函数:高效设计实战指南
  12. 用VHDL设计有限状态机:红绿灯实战范例