gen: Add generic timer module
This commit is contained in:
parent
1c08d48861
commit
a19de6d0c8
64
trashernet/timer.vhd
Normal file
64
trashernet/timer.vhd
Normal file
@ -0,0 +1,64 @@
|
||||
-- -------------------------------------------------------------------------- --
|
||||
-- TRASHERNET - A Trashy Ethernet Stack for FPGAs --
|
||||
-- -------------------------------------------------------------------------- --
|
||||
-- timer.vhd : Simple Timer
|
||||
-- Implements a very simple integer timer
|
||||
-- -------------------------------------------------------------------------- --
|
||||
-- Author : Markus Koch <markus@notsyncing.net>
|
||||
-- Contributors : None
|
||||
-- License : Mozilla Public License (MPL) Version 2
|
||||
-- -------------------------------------------------------------------------- --
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.numeric_std.all;
|
||||
|
||||
entity timer is
|
||||
generic(
|
||||
F_TICK : integer; -- Frequency of `tick` (or `clk` if tick is tied to '1')
|
||||
DURATION : time; -- Duration of the timer
|
||||
AUTOSTART : boolean := false -- Automatically start the timer after reset
|
||||
);
|
||||
port(
|
||||
clk : in std_logic; -- Global clock
|
||||
rst : in std_logic; -- Asynchronous reset
|
||||
|
||||
tick : in std_logic; -- Timer enable
|
||||
start : in std_logic; -- (Re-)start timer
|
||||
|
||||
expired : out std_logic; -- Timer is expired
|
||||
expired_stb : out std_logic -- Strobe when timer reaches zero
|
||||
);
|
||||
end entity timer;
|
||||
|
||||
architecture rtl of timer is
|
||||
constant PERIOD : time := 1 sec / real(F_TICK);
|
||||
constant TICKS : integer := integer(DURATION / PERIOD);
|
||||
|
||||
signal counter : integer range 0 to TICKS;
|
||||
begin
|
||||
timer_p : process(clk, rst) is
|
||||
begin
|
||||
if rst then
|
||||
counter <= TICKS when AUTOSTART else 0;
|
||||
expired_stb <= '0';
|
||||
|
||||
elsif rising_edge(clk) then
|
||||
expired_stb <= '0';
|
||||
if tick then
|
||||
if counter = 1 then
|
||||
expired_stb <= '1';
|
||||
end if;
|
||||
if counter /= 0 then
|
||||
counter <= counter - 1;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
if start then
|
||||
counter <= TICKS;
|
||||
end if;
|
||||
end if;
|
||||
end process timer_p;
|
||||
|
||||
expired <= not start when counter = 0 else '0';
|
||||
end architecture rtl;
|
Loading…
Reference in New Issue
Block a user