Шесть простых асинхронных хитростей

ПЛИС
Введение

Большинство дизайнов для ПЛИС — чисто цифровые и, обычно, синхронные. Тем не менее, иногда возникает необходимость в специальных асинхронных модулях. Эти модули, хотя и кажутся тривиальными, могут привести к огромному количеству проблем если будут реализованы неправильно. В этой статей будут описаны шесть прошедших огонь и воду асинхронных модулей.

Подавитель дребезга контактов
Подключение переключателей или кнопок к быстрой логике — не тривиальная задача. Любой механический переключатель обладает дребезгом. Схема ниже использует обратную связь для подавления дребезга, и требует только одного вывода ПЛИС. Установите минимальный выходной ток ножки, чтобы уменьшить броски тока при переключении.

Подавитель дребезга контактов

Настраиваемый триггер Шмитта
Эта схема дает настраиваемый гистерезис. Разница между напряжениями высокого и низкого логических уровней равняется напряжению питания, умноженному на отношение сопротивлений резисторов.

Настраиваемый триггер Шмитта

RC генератор
Этот 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 комментариев

avatar
Интересная статья. По моему проще написать автомат антидребезга для кнопки, чем ставить резисторы снаружи плис :)
avatar
Только триггер Шмитта, а не Шмидта.
Шмидт — это другой дядька :)
avatar
В описании удвоителя неточность: «изменит частоту на вЫходную», видимо нужно исправить на «входную».
avatar
mea culpa
avatar
Любопытно, как будет выглядеть реализация подавителя дребезга на verilog-e?
Что-то вроде:
module antiglitch(
inout wire a,
inout wire b
);


always @(*) 
begin
a = b;
b = a;
end

endmodule


Или всеж через assign?
avatar
Нужно явно инстанциировать OBUF и IBUF
avatar
Очень полезная идея с удвоителем частоты. Я как раз делаю ВГА приблуду на FT800, но к нему требуется даблер для генерации ВГА развертки, а даблеру нужен 2х клок от пиксельклока фт800.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.