Цитата(makc @ May 23 2006, 01:46)

Раньше использовал DCM и не особо не задумывался, что LOCKED может пропасть и т.п. Но на всякий случай использовал его для выработки сигнала сброса той части схемы, которая тактировалась с выхода DCM.
Но вот настал момент, когда в случае пропадания LOCKED сброс недопустим. Т.е. схема может остановиться, но сброса быть не должно, т.к. это приведет невосполнимой потере данных, загруженных ранее микроконтроллером в регистры ПЛИС (и которых у микроконтроллера больше нет).
Ja obychno delaju interface block otdel'no i pitaju ego kakim nibud' drugim stabil'nym clockom ili voobshe async signalami ot processora. Togda system clk mogno resetit' skol'ko ugodno i prietom sodergimoe registrov ostanetsja neizmennym. Krome togo sushestvuet reshenie kogda registrovyj massive realizuetsja na SRL (xilinx, smotri naprimer GSRD ref design). Togda po svoej suti reset ne smoget sbrosit' sodergimoe.
Ny eto esli eshe ne pozdno menjat' design.
Po povodu DCM ja v svoe vrema silno naelsja s nimi osobenno s VirtexE, u kotoryh sboj moget proizojty, no pri etom Lock stoit kak geroj. Chashe dage ne sboj, a ne pravilnyj setup (posle configuracii i nachal'nogo reset-a ). Prishlos' ispolzovat' druguju, kosvennuju informaciju v dopolnenii s LOCK o tom chto DCM pora resetit'.
V Virtex2 DCM chutochku podpravili. No vse ravno plohaja situacija moget proizojty.
V moem sluchae pomog imenno timeout (watchdog), kotoryj legko sdelat' s pomoshju pseudo schetchika.
Recomenduju. Ochen' kompactno poluchaetsja. Vyhod shetchika - pulse raz v skolko-to ms. Ego potom nugno ob'edinit' po AND s nLOCK signalom.
---------------------------------------------------------------------------
-- 22 bit LFSR counter. With XNOR feedback the lock-up state is "all-ones".
-- TC is based on a zero_cnt, which cnts consecutive zeros.
-- When it comes to zero, that means we have "all-zeros" state, which is the TC state.
PROCESS (clk10)
variable v: std_logic_vector(21 downto 0):=(others=> '0');
variable d: std_logic;
constant cLFSR_LENGTH :std_logic_vector(4 downto 0) := conv_std_logic_vector(21,5);
variable zero_cnt: std_logic_vector(4 downto 0):=cLFSR_LENGTH;
BEGIN
if rising_edge(clk10) then
if zero_cnt=conv_std_logic_vector(0,5) then -- check for TC pulse
iRstCntPulse <= '1'; -- set terminal count pulse for 1 clk
iRst_toggle <= not iRst_toggle;
else
iRstCntPulse <= '0';
end if;
---------
if v(v'high)='1' then -- count zeros
zero_cnt := cLFSR_LENGTH;
else
zero_cnt := zero_cnt - 1;
end if;
------------
d:= v(v'high) xnor v(v'high-1); -- feedback
v:= v(v'high -1 downto 0) & d; -- shift reg
end if;
end process ;