да, потому что этот кусок схемы синтезируется в табличку истинности либо in=out либо in=~out, в итоге либо займет одну LUT либо вообще будет заменено дорожкой.
Вид для печати
Значит реализация данного кусочка не желательна в ПЛИС - на выходе никогда ничего не появится?
P.S. В схеме ошибка элементы исключающие ИЛИ без инверсии.
fifan, такая асинхронная схема, наверно, заработает, если правильно задать констрейнты.
В ПЛИС подобные схемы - однозначные генераторы глюков...
Если надо удваивать частоту - надо использовать встроенную PLL.
Хотя, если очень хочется, то попробовать такую схему собрать можно, только надо писать ее соответствующе...
out = LCELL(in xor LCELL(LCELL(in))); - на AHDL
В MAX-Plus II с CPLD такое вполне проканало... а с FPGA были проблемы...
На VHDL такое не пишется, а если и записать то оно соптимизируется в
out <= '0';
В то же время, если удваиваемая частота не слишком высока и есть более высокая тактовая, то можно задержку сделать на D-тригере:
out = DFF(in xor DFF(in,clk_up,,),clk_up,,);
Tакая штука сгенерит два коротких импульса на каждом фронте сигнала in, но только при условии, что clk_up имеет частоту значительно выше, чем частота на входе in.
Я просто хочу получить частоту 4 МГц из 10 МГц входных. Решил сначала удвоить частоту, а затем поделить на 5. В семействе MAX7000S функций PLL почти нет. Я нашёл одну: внутренний генератор - мне не пойдёт.
Вот как-то так можно получить 4 мегагерца из 10...
CLK10 : input;
CLK4 : output;
VARIABLE
CT[1..0] : DFF;
C4 : NODE;
BEGIN
CT.clk = C4;
CT[].d = CT[] + 1;
C4 = LCELL(CLK10 xor CT[1]);
CLK4 = CT[1];
---------- Post added at 05:06 ---------- Previous post was at 04:51 ----------
ошибочка - это схема деления на 1.5
Деление на 2.5:
только что в квартусе на симуляторе проверил.Код:SUBDESIGN test(
CLK10 : input;
CLK4 : output
)
VARIABLE
CT[3..0] : DFF;
C4 : NODE;
BEGIN
CT[].clk = C4;
CASE CT[] IS
WHEN 0 => CT[] = 1;
WHEN 1 => CT[] = 2;
WHEN 2 => CT[] = 4;
WHEN 3 => CT[] = 4;
WHEN 4 => CT[] = 5;
WHEN 5 => CT[] = 6;
WHEN 6 => CT[] = 0;
WHEN 7 => CT[] = 0;
END CASE;
C4 = LCELL(CLK10 xor CT[2]);
CLK4 = CT[2];
END;
Подобным образом можно построить делитель на любой полуцелый коэфициент.
п.с. Идея заимствована из журнала "Радио" из прошлого тысячелетия.
Что-то не вяжется с частотой. Входная - 10 МГц ~100 нС. Выходная - 500 нС ~ 2 МГц. В верхнем примере считается частота 10/2=5. Т.е. деление не в 2,5 раза, а в 5 раз.
это было во времена, когда ПЛИС еще и в помине не было...
Схемка на рассыпухе была дана.
Номеров не помню, ибо те времена и те интересы давно канули в лету...
А про ПЛИС (и не только) сейчас печатается не мало в журнале "Компоненты и Технологии".
---------- Post added at 19:06 ---------- Previous post was at 18:51 ----------
Хм, и вправду накосячил... Не с того выхода счетчика сигнал снял...
Обновленная схема:
SUBDESIGN test(
CLK10 : input;
CLK4 : output
)
VARIABLE
CT[3..0] : DFF;
C4 : NODE;
BEGIN
CT[].clk = C4;
CASE CT[] IS
WHEN 0 => CT[] = 1;
WHEN 1 => CT[] = 2;
WHEN 2 => CT[] = 4;
WHEN 3 => CT[] = 4;
WHEN 4 => CT[] = 5;
WHEN 5 => CT[] = 6;
WHEN 6 => CT[] = 0;
WHEN 7 => CT[] = 0;
END CASE;
C4 = LCELL(CLK10 xor CT[2]);
CLK4 = CT[1];
END;
END;
Задний фронт слишком затянут: 150 нС против переднего 100 нС. Может не прокатить. Я хочу данный делитель поставить в контроллере дисковода к Специалисту_МХ. Данное несоответствие может сказаться на читаемость дискет.