---------------------------------------------------------------------------------- -- Company: -- Engineer: -- Create Date: -- Design Name: -- Module Name: led_status - Behavioral -- Project Name: DigMic_prj -- Target Devices: Gowin GW5A-25 -- Description: Индикация состояния тракта. -- не меняется — тактирования на clk нет вообще -- медленно — тактирование есть, отсчёты с дециматора не приходят -- быстро — отсчёты идут. Значит тракт PDM -> CIC -> FIR работает. -- -- Сброс намеренно не используется: мигание должно доказывать наличие клока -- даже если остальной тракт по какой-то причине стоит. ---------------------------------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; entity led_status is generic ( SYS_CLK_HZ : integer := 50_000_000; SLOW_HZ : integer := 2; -- нет отсчётов FAST_HZ : integer := 10; -- отсчёты идут ALIVE_MS : integer := 200 -- за какое время без отсчётов считаем, что их нет ); port ( clk : in std_logic; data_event : in std_logic; -- строб прихода отсчёта led : out std_logic ); end entity led_status; architecture rtl of led_status is constant HALF_SLOW : integer := SYS_CLK_HZ / (2 * SLOW_HZ); constant HALF_FAST : integer := SYS_CLK_HZ / (2 * FAST_HZ); constant ALIVE_TMO : integer := (SYS_CLK_HZ / 1000) * ALIVE_MS; signal alive_cnt : integer range 0 to ALIVE_TMO := 0; signal data_alive : std_logic := '0'; signal blk_cnt : integer range 0 to HALF_SLOW - 1 := 0; signal blink : std_logic := '0'; begin led <= blink; led_proc : process (clk) variable half : integer range 0 to HALF_SLOW; begin if rising_edge(clk) then if data_event = '1' then alive_cnt <= 0; data_alive <= '1'; elsif alive_cnt = ALIVE_TMO then data_alive <= '0'; else alive_cnt <= alive_cnt + 1; end if; if data_alive = '1' then half := HALF_FAST; else half := HALF_SLOW; end if; if blk_cnt >= half - 1 then blk_cnt <= 0; blink <= not blink; else blk_cnt <= blk_cnt + 1; end if; end if; end process led_proc; end architecture rtl;