НО! Нарвался на оговорку заказчика, что нет в проекте внешнего сброса.
1.Необходимости в PLL у дизайна нет (чтобы взять для сброса сигнал LOCK в качестве недостающего Сброса).
Была оговорка, что для такого случая надо обязательно сделать дополнительную задержку от разрешения LOCK, чтобы была гарантия стабильной частоты от PLL.
2.Была тут информация, что можно в дизайне задавать нужное состояние триггеров простым присвоением при создании.
И сей факт считаю интересным для явного формирования сигнала Сброс. Смысл- прописать состояние одного триггера и если он действительно послушно задал свое состояние, как было в проекте,- то формирователь сброса должен сформировать на счетчке задержанный сигнал перебрасывания его состояние в обратное. Это и будет сигнал сброса.
Что народ еще применял для начальной установки? Спасибо!
Как вариант, работающий на симуляции. Можно и проще, но, то что озвучивалась выглядит. Надеюсь такое будет работать "на железе"
Код
entity freset is
generic (TEMP_DELAY :integer);
port (
CLK_INP : in STD_LOGIC;
SENSOR_INP : in STD_LOGIC;
RESET_OUT : out STD_LOGIC);
end freset;
architecture res_body of freset is
signal cnt_div_s: INTEGER range TEMP_DELAY-1 downto 0 := (TEMP_DELAY-1);------- начальное состояние
begin
AVT_OUT_machine: process (CLK_INP)
begin
if rising_edge(CLK_INP) then
if cnt_div_s /= 0 and SENSOR_INP = '1' then
cnt_div_s <= cnt_div_s-1;
RESET_OUT <= '0';
else
RESET_OUT <= '1';
end if;
end if;
end process;
end res_body;
----------------------------------
signal init_s : STD_LOGIC:='1';------- начальное состояние
signal tnit_s : STD_LOGIC:='0';
signal RESET : STD_LOGIC;
begin
nu: process (CLK)
begin
if rising_edge(CLK) then
tnit_s <= not RESET;
if tnit_s ='1' and RESET ='1' then
init_s <= '0';
end if;
end if;
end process nu;
rest: freset
generic map(100)
port map (
CLK_INP => CLK,
SENSOR_INP => init_s,
RESET_OUT => RESET
);
generic (TEMP_DELAY :integer);
port (
CLK_INP : in STD_LOGIC;
SENSOR_INP : in STD_LOGIC;
RESET_OUT : out STD_LOGIC);
end freset;
architecture res_body of freset is
signal cnt_div_s: INTEGER range TEMP_DELAY-1 downto 0 := (TEMP_DELAY-1);------- начальное состояние
begin
AVT_OUT_machine: process (CLK_INP)
begin
if rising_edge(CLK_INP) then
if cnt_div_s /= 0 and SENSOR_INP = '1' then
cnt_div_s <= cnt_div_s-1;
RESET_OUT <= '0';
else
RESET_OUT <= '1';
end if;
end if;
end process;
end res_body;
----------------------------------
signal init_s : STD_LOGIC:='1';------- начальное состояние
signal tnit_s : STD_LOGIC:='0';
signal RESET : STD_LOGIC;
begin
nu: process (CLK)
begin
if rising_edge(CLK) then
tnit_s <= not RESET;
if tnit_s ='1' and RESET ='1' then
init_s <= '0';
end if;
end if;
end process nu;
rest: freset
generic map(100)
port map (
CLK_INP => CLK,
SENSOR_INP => init_s,
RESET_OUT => RESET
);