[an error occurred while processing this directive]
|
Делал так в альтере. (Отлаживая тот самый азик :) )
мультиплексор такой:
out_clk = (clk1 & LCELL(LCELL(clk1en))) | (clk2 & LCELL(LCELL(clk2en)))
clk1en и clk2en - выходы регистров, тактируемых каждый своим соответствующим ИНВЕРТИРОВАННЫМ клоком (clk1 и clk2)
А вот процесс переключения хитрый. Например переход с clk1 на clk2
1) отключаю clk1en синхронно с клоком clk1. Это просто и ясно.
2) сигнал с clk1en идет через линию задержки, тактируемую инверт. клоком clk2. Длина этой ЛЗ 2-3 триггера, от метастабильности.
3) по факту перехода в ноль этой ЛЗ включаю clk2en. Это тоже синхронно с клоком clk2. Опять - просто.
Нюанс в самом проходе клока через мультиплексор. ЛЗ и триггеры разрешения клоков тактируются по спаду. Соответственно сигнал разрешения на соотв. вход мультиплексора дойдет через время T от спада клока. Это время состоит из времени распространения от входя клока регистра до данных и времени прохождения через пару LCELLов. На второй вход мультиплексора идет непосредственно клок, и время его прихода заведомо меньше того времени T. Это полностью исключает глитчи.
В общем это работает, и отлично. Коммутация идет между двумя независимыми кварцевыми генераторами (скоростной и 32 кгц)
E-mail: info@telesys.ru