Модули буфера, упаковки кадров и UART
FIFO, сборка кадра с CRC-16, передатчик UART и индикация переносятся из имеющегося наработанного тракта без изменения логики. В STATUS бит1 переопределён под насыщение дециматора: DRDY здесь нет.
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
----------------------------------------------------------------------------------
|
||||
-- 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;
|
||||
Reference in New Issue
Block a user