FIFO, сборка кадра с CRC-16, передатчик UART и индикация переносятся из имеющегося наработанного тракта без изменения логики. В STATUS бит1 переопределён под насыщение дециматора: DRDY здесь нет.
78 lines
2.6 KiB
VHDL
78 lines
2.6 KiB
VHDL
----------------------------------------------------------------------------------
|
|
-- 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;
|