Dual edge flip flop

Опубликовано в рубрике "ПЛИС", 27.06.2011.
Тэги: , автор:

Недавно, понадобился триггер, работающий по обоим фронтам сигнала. Поиски в нете ни одного готового верилог-решения не обнаружили, так-что, выкладываю свою реализацию

 

image

Триггер состоит из двух триггеров, работающих по разным фронтам. Дабы не тянуть резину, вот реализация:

 

module  DDR_FF(input set, reset, clk, in, output out);

    reg ff_rise, ff_fall; 
    
    always@ (posedge set, posedge reset, posedge clk) begin 
       if (reset == 1) 
            ff_rise = 0; 
       else if (set == 1) 
            ff_rise = 1; 
        else if (clk == 1) begin 
            if (in == 1) 
                ff_rise = !ff_fall; 
            else 
                ff_rise = ff_fall; 
        end 
    end 
     
    
    always@ (posedge set, posedge reset, negedge clk) begin 
        if (reset == 1) 
            ff_fall = 0; 
        else if (set == 1) 
            ff_fall = 0; 
       else if (clk == 0) begin 
            if (in == 1) 
                ff_fall= !ff_rise; 
            else 
                ff_fall= ff_rise; 
        end 
    end

    
    assign out = (set == 1) ? 1'b1 : (reset == 1) ? 1'b0 : ff_rise ^ ff_fall;

endmodule

 

set – асинхронная установка,  reset – асинхронный сброс, оба с прямыми логическими уровнями. Остальное – думаю, понятно.

Проверка асинхронных входов в последнем assign’е сделана, чтобы избежать глитчей.

Вдохновением служила вот эта статья:

Комментарии
  1. Alexey_TeslaFX написал(а) 28th Июнь, 2011 в 21:52

    О, пасиба 🙂 Думаю фпгашникам тема будет актуальна — в нете практически нет толковых подсказок за редким исключеним…
    В своё время рашал эту задачу, с кучей костылей…

  2. tetraa написал(а) 12th Июнь, 2012 в 14:41

    Во втором олвейсе асинхронная установка походу неработает.

  3. BSVi написал(а) 12th Июнь, 2012 в 14:45

    Как это, не работает?

    ff_fall = 0;

  4. tetraa написал(а) 12th Июнь, 2012 в 14:49

    а. ну да)

  5. tetraa написал(а) 12th Июнь, 2012 в 19:02

    Мож объяснить как последняя строчка работает?

  6. BSVi написал(а) 12th Июнь, 2012 в 19:13

    Ну, давай на словах напишу тоже-самое.

    Если set=1, то на выходе 1
    Если reset=1, то на выходе 0
    Если оба предыдущих условия не верны, на выходе — ff_rise ^ ff_fall

  7. tetraa написал(а) 12th Июнь, 2012 в 19:45

    Спасибо. впринципе догадывался но всеравно не могу понять как работает эта конструкция?

  8. Perfer написал(а) 24th Май, 2013 в 21:50

    Кажется забыли указать самое важно слово «ИНАЧЕ». Получается конструкция типа switch:

    Если set=1, то на выходе 1
    Иначе если reset=1, то на выходе 0
    Иначе на выходе ff_rise ^ ff_fall

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт защищен reCAPTCHA и применяются Политика конфиденциальности и Условия обслуживания применять.