Мне нужно спроектировать систему для пропуска определенного переднего фронта и продолжения счета, пока не будет обнаружен следующий передний фронт, так как при обнаружении следующего переднего фронта он должен начать отсчет с нуля. Val1, val2, val3 имеют счетчики различных импульсов, которыеcom из внешнего поля. Эта последовательность импульсов повторяется.Я оставляю первый импульс для подсчета каждого импульса, и вторая последовательность импульсов обнаруживается, если счет больше, чем счет, или меньше, чем счет, который должен пропустить нарастающий фронт и перейти к следующему нарастающему фронту и начать отсчет.Я пробовал таким образом ..
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use IEEE.Numeric_Std.all;
library work;
use work.all;
--use IEEE.NUMERIC_STD.ALL;
entity nxt_pwm is
Port ( i_clk : in std_logic;
signal_in: in std_logic;
signal_in1: in std_logic;
pwm_out: out std_logic);
end nxt_pwm;
architecture Behavioral of nxt_pwm is
signal Q1,Q2,Q3 : unsigned(15 downto 0);
signal reset,flag1,flag2,flag3,flag4: std_logic;
signal val1,val2,val3:unsigned (15 downto 0);
signal cnt_f,count_q: unsigned (15 downto 0);
signal val_tot: unsigned (15 downto 0) ;
begin
pulse_count:entity work.pulse port map(i_clk=>i_clk,signal_in1=>signal_in1,pwm_out=>pwm_out);
uut3: process (signal_in)
--- variable count_q : unsigned (15 downto 0);
-- variable reset: std_logic;
-- variable val_tot: unsigned (15 downto 0) ;
begin
if rising_edge(signal_in) then
if (flag1 = '1') then
Q1 <= val2;
elsif (flag2 = '1') then
Q2 <= val1;
elsif (flag3 = '1') then
Q3 <= val3;
end if;
if (reset = '1') then
count_q <= "0000000000000000";
if (flag1 = '1') then
count_q <= val2;
count_q <= count_q - 1;
if (signal_in'event and signal_in = '1') then
-- count_q <= count_q - 1;
end if;
elsif (flag2='1') then
count_q<=val1;
count_q <=count_q - 1;
if reset='0' then
if (signal_in'event and signal_in = '1') then
-- count_q<= count_q -1 ;
reset<='1';
if (signal_in'event and signal_in = '1') then
count_q<="0000";
end if;
end if;
end if;
elsif (flag3='1') then
count_q <=val3;
count_q <= count_q - 1;
if (signal_in'event and signal_in = '1') then
flag1<='1';
end if;
end if;
end if;
end if;
end process;
UUT2: process (i_clk,signal_in)
begin
if rising_edge(signal_in) then
if flag1<='1' or flag2<='1' or flag3<='1' then
if (cnt_f /= val_tot)then
if (cnt_f< (val_tot/2)) then
pwm_out<='1';
else
pwm_out<='0';
end if;
cnt_f<=cnt_f+1;
end if;
end if;
END IF;
end process;
end Behavioral;