Модули буфера, упаковки кадров и UART

FIFO, сборка кадра с CRC-16, передатчик UART и индикация переносятся
из имеющегося наработанного тракта без изменения логики. В STATUS бит1
переопределён под насыщение дециматора: DRDY здесь нет.
This commit is contained in:
nikit3s
2026-08-14 15:54:53 +03:00
commit 2d66c49031
5 changed files with 688 additions and 0 deletions
+77
View File
@@ -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;