CPU EDGE TRIGGERED
Contents |
Активная логика (триггеры)
Edge-triggered схемы срабатывают не по уровню, а по факту смены уровня с 0 на 1 (задний фронт, raising edge, posedge в Verilog) или с 1 на 0 (передний фронт, falling edge, negedge в Verilog).
Смысл этого в том, чтобы "открыть" триггер только в первую половину полутакта или в последнюю. То есть мы можем по идее умножить частоту, если использовать два триггера, один из которых настроен на задний фронт, а другой на передний.
Если на входе "z" (отсоединен), то триггер не меняет своего значения. Такой способ позволяет сэкономить и не делать отдельный вход Enable.
Либо мы можем за 1 полутакт сделать сразу два действия, опять же используя этот трюк. Первое действие мы вешаем на триггер по заднему фронту, а второе - на триггер по переднему фронту. Память DDR так и работает.
Активная логика отличается от пассивной тем, что умеет запоминать некоторые состояния (в данном случае триггеры запоминают входное значение).
Семейство триггеров по нарастающему фронту выглядит примерно так (в большинстве это довольно крупные ячейки, состоящие из нескольких частей):
Устройство современных DFF
Master flip-flop открывается первым, т.к. CLK=0 заведен на PMOS. Slave открывается вторым.
В стандартных ячейках PSXCPU используется немного другая схема. Вместо FF на паре инверторов+MOSFET применяется инверторы+MUX.
Если на CLK=0 первый MUX открывается для приема D, то это posedge DFF. Если на CLK=0 открывается второй MUX, а первый остается закрытым, то это negedge DFF.
Я не очень понимаю как это работает, но скорее всего вся фишка в propagation delay. Эту магию знать не обязательно, будем отталкиваться от того, что если вход DFF заходит в MUX, который открывается при CLK=0 MOSFET-ом P-типа, то это posedge DFF.
DFF срабатывающий по нарастающему фронту (posedge, смена CLK 0->1)
Схемка для симуляции в Logisim лежит в SVN.
DFF по нарастающему фронту, со сбросом
Взяв за основу DFF, разработчики стали плодить его модификации.
Одна из них - DFF с дополнительным входом для сброса (причем вход в инверсной логике, как это обычно принято делать для сигналов сброса).
- Если /res (in2) равен нулю (сброс), то на выходе всегда будет 0
- Иначе схема работает как обычный DFF, устанавливая значение по нарастающему фронту
На следующей схеме не отражается тонкая механика работы мультиплексоров с задержкой:
(схема приведена чтобы примерно понимать какие логические элементы используются)
DFF со сбросом применяются например в счётчиках, а /RES используется когда нужно сбросить счётчик.
DFF по нарастающему фронту, селектируемый по MUX, со сбросом
Данный вариант ячейки является гибридным: вместо обычного входа (D) на ней установлен мультиплексируемый вход.
Вероятнее всего комбинация MUX + DFF встречалась настолько часто, что разработчики решили добавить гибридную ячейку.
Схема не особо отличается от DFFR.
Логическая схема (опять здесь не учитываются "медленные" MUXы):
DFF по спадающему фронту (negedge)
Как видно, когда CLK=0, то нижний MUX (куда приходит вход D) остается закрытым, а верхний открывается. Как уже было сказано выше - такая магия формирует negedge DFF.
|