121 lines
3.6 KiB
VHDL
121 lines
3.6 KiB
VHDL
library ieee;
|
|
use ieee.std_logic_1164.all;
|
|
use ieee.std_logic_arith.all;
|
|
use ieee.std_logic_unsigned.all;
|
|
|
|
entity tick_gen is
|
|
generic(
|
|
CLOCK_SPEED_MHZ : integer := 100
|
|
);
|
|
port(
|
|
clk_in : in std_logic;
|
|
|
|
tick_1us_out : out std_logic;
|
|
tick_1ms_out : out std_logic;
|
|
tick_500ms_out : out std_logic;
|
|
tick_750ms_out : out std_logic;
|
|
tick_1s_out : out std_logic;
|
|
|
|
prog_us_tick_rate_in : in std_logic_vector(31 downto 0);
|
|
prog_us_tick_out : out std_logic;
|
|
|
|
reset_in : in std_logic
|
|
);
|
|
end entity tick_gen;
|
|
|
|
architecture imp of tick_gen is
|
|
|
|
signal sysclk_cnt_r : integer range 0 to CLOCK_SPEED_MHZ-1;
|
|
signal usec_cnt_r : integer range 0 to 999;
|
|
signal msec_cnt_r : integer range 0 to 499;
|
|
signal msec_cnt1_r : integer range 0 to 999;
|
|
signal tick_1us_r : std_logic;
|
|
signal tick_1ms_r : std_logic;
|
|
signal tick_500ms_r : std_logic;
|
|
signal tick_750ms_r : std_logic;
|
|
signal tick_1s_r : std_logic;
|
|
|
|
signal prog_usec_cnt_r : std_logic_vector(31 downto 0);
|
|
signal prog_us_tick_r : std_logic;
|
|
|
|
begin
|
|
|
|
tick_1us_out <= tick_1us_r;
|
|
tick_1ms_out <= tick_1ms_r;
|
|
tick_500ms_out <= tick_500ms_r;
|
|
tick_750ms_out <= tick_750ms_r;
|
|
tick_1s_out <= tick_1s_r;
|
|
prog_us_tick_out <= prog_us_tick_r;
|
|
|
|
process(clk_in, reset_in)
|
|
begin
|
|
if(reset_in = '1') then
|
|
sysclk_cnt_r <= 0;
|
|
usec_cnt_r <= 0;
|
|
msec_cnt_r <= 0;
|
|
msec_cnt1_r <= 0;
|
|
tick_1us_r <= '1';
|
|
tick_1ms_r <= '0';
|
|
tick_500ms_r <= '0';
|
|
tick_750ms_r <= '0';
|
|
tick_1s_r <= '0';
|
|
prog_usec_cnt_r <= (others => '0');
|
|
prog_us_tick_r <= '0';
|
|
elsif rising_edge(clk_in) then
|
|
tick_1ms_r <= '0';
|
|
tick_500ms_r <= '0';
|
|
tick_750ms_r <= '0';
|
|
tick_1s_r <= '0';
|
|
prog_us_tick_r <= '0';
|
|
|
|
if(sysclk_cnt_r = CLOCK_SPEED_MHZ-1) then
|
|
sysclk_cnt_r <= 0;
|
|
tick_1us_r <= '1';
|
|
else
|
|
sysclk_cnt_r <= sysclk_cnt_r + 1;
|
|
tick_1us_r <= '0';
|
|
end if;
|
|
|
|
if(tick_1us_r = '1') then
|
|
if(usec_cnt_r = 999) then -- 1000us
|
|
usec_cnt_r <= 0;
|
|
tick_1ms_r <= '1';
|
|
else
|
|
usec_cnt_r <= usec_cnt_r + 1;
|
|
end if;
|
|
end if;
|
|
|
|
if(tick_1ms_r = '1') then
|
|
if(msec_cnt_r = 499) then -- 500ms
|
|
msec_cnt_r <= 0;
|
|
tick_500ms_r <= '1';
|
|
else
|
|
msec_cnt_r <= msec_cnt_r + 1;
|
|
end if;
|
|
end if;
|
|
|
|
if(tick_1ms_r = '1') then
|
|
if(msec_cnt1_r = 749) then -- 750ms
|
|
tick_750ms_r <= '1';
|
|
end if;
|
|
if(msec_cnt1_r = 999) then -- 1s
|
|
msec_cnt1_r <= 0;
|
|
tick_1s_r <= '1';
|
|
else
|
|
msec_cnt1_r <= msec_cnt1_r + 1;
|
|
end if;
|
|
end if;
|
|
|
|
if(tick_1us_r = '1') then
|
|
if(prog_usec_cnt_r = prog_us_tick_rate_in) then
|
|
prog_usec_cnt_r <= (others => '0');
|
|
prog_us_tick_r <= '1';
|
|
else
|
|
prog_usec_cnt_r <= prog_usec_cnt_r + 1;
|
|
end if;
|
|
end if;
|
|
|
|
end if;
|
|
end process;
|
|
|
|
end architecture imp; |