Шесть простых асинхронных хитростей
Введение
Большинство дизайнов для ПЛИС — чисто цифровые и, обычно, синхронные. Тем не менее, иногда возникает необходимость в специальных асинхронных модулях. Эти модули, хотя и кажутся тривиальными, могут привести к огромному количеству проблем если будут реализованы неправильно. В этой статей будут описаны шесть прошедших огонь и воду асинхронных модулей.
Подавитель дребезга контактов
Подключение переключателей или кнопок к быстрой логике — не тривиальная задача. Любой механический переключатель обладает дребезгом. Схема ниже использует обратную связь для подавления дребезга, и требует только одного вывода ПЛИС. Установите минимальный выходной ток ножки, чтобы уменьшить броски тока при переключении.
Настраиваемый триггер Шмитта
Эта схема дает настраиваемый гистерезис. Разница между напряжениями высокого и низкого логических уровней равняется напряжению питания, умноженному на отношение сопротивлений резисторов.
RC генератор
Этот RC генератор, в первом приближении, не чувствителен к напряжению питания, пороговому напряжению и температуре. Триггер в генераторе предотвращает дребезг при медленном изменении напряжения на конденсаторе вблизи порогового напряжения. Единственный его недостаток — необходимость в трех ножках.
Реализация и комментарии BSVi
module RC(
output r1,
input r2,
output c,
output clock
);
reg latch;
assign r1 = !c;
assign c = latch;
always @(*) begin
if (r1 & r2) begin
latch = 1;
end else if (!r1 & !r2) begin
latch = 0;
end
end
assign clock = latch
endmodule
Если необходимо получить строго 50% заполнение, нужно использовать делитель. К примеру, вот так:
module RC(
output r1,
input r2,
output c,
output reg clock
);
reg latch;
assign r1 = !c;
assign c = latch;
always @(*) begin
if (r1 & r2) begin
latch = 1;
end else if (!r1 & !r2) begin
latch = 0;
end
end
assign
always @(posedge latch) begin
clock <= !clock;
end
initial begin
clock <= 0;
end
endmodule
Удвоитель частоты
Эта схема выдает короткий импульс при каждом изменении входного сигнала. Получившийся импульс надежно переключает триггеры во всей ПЛИС. При низких температурах и высоком питании импульс становится короче, но и триггеры срабатывают быстрее. Эти обстоятельства взаимокомпенсируются. Любой управляющий сигнал, который не даст триггеру переключаться (асинхронный сброс, к примеру), изменит частоту на входную.Эта схема заставляет нахмурится всех цифровых дизайнеров, она должна быть использована только как крайняя мера.

Реализация от BSVi
module ClockDoubler(
input clk,
output doubled
);
reg doubler_reg;
wire edges = !(clk ^ (!doubler_reg));
always @(posedge edges) doubler_reg <= !doubler_reg;
assign doubled = edges;
endmodule
Управляем 5в уровнем при помощи 3.3в ножки
Для 5в CMOS входа, 3.3в, которые обычно выдают ПЛИС может оказаться не достаточно. Если выходная ножка ПЛИС может выдержать 5в, можно использовать подтягивающий резистор и увеличить размах. К сожалению, подтяжки медленны и фронт может достигать сотен наносекунд, что бывает слишком медленно.Эта схема позволяет сильно уменьшить длительность фронта за счет активного управления ножкой до тех пор, пока напряжение на ней не достигнет логического порога (~1.6в). Если замедлить входной буфер и добавить задержек, можно ускорить фронт еще больше.
Такую схему, можно использовать и для преобразования любых других логический уровней. К примеру, 2.5в в 3.3в.

Асинхронное переключение между двумя несвязанными тактовыми сигналами
Простое асинхронное переключение между тактовыми сигналами приведет к коротким импульсам и глитчам. Предлагаемая схема решает эту проблему.Когда вывод SELECT стабилен (в высоком или низком состоянии), два управляющих триггера находятся в противоположных состояниях и один из входных сигналов появляется на выходе.
Когда SELECT изменяется, ничего не происходит до следующего спадающего фронта текущего выбранного тактового сигнала. После этого, выходной сигнал будет низким до тех пор, пока не появится спадающий фронт нового тактового сигнала, после чего, он появляется на выходе.
Если SELECT приведет к метастабильности, это ни на что не повлияет. Выходной сигнал будет оставаться низким, пока метастабильность не разрешится.

Эта статья — перевод. Оригинал статьи Peter Alfke «Six Easy Pieces (Non-Synchronous Circuit Tricks)», Xilinx San Jose на сайте pldworld.
8 комментариев
Шмидт — это другой дядька :)
Что-то вроде:
Или всеж через assign?