Difference between revisions of "CPU EDGE TRIGGERED"
(→Активная логика (триггеры)) |
(→Устройство современных DFF) |
||
Line 24: | Line 24: | ||
Если на CLK=0 первый MUX открывается для приема D, то это posedge DFF. Если на CLK=0 открывается второй MUX, а первый остается закрытым, то это negedge DFF. | Если на CLK=0 первый MUX открывается для приема D, то это posedge DFF. Если на CLK=0 открывается второй MUX, а первый остается закрытым, то это negedge DFF. | ||
+ | |||
+ | Я не очень понимаю как это работает, но скорее всего вся фишка в propagation delay. Эту магию знать не обязательно, будем отталкиваться от того, что если вход DFF заходит в MUX, который открывается MOSFET P-типа, то это posedge DFF. | ||
=== DFF срабатывающий по нарастающему фронту (posedge, смена CLK 0->1) === | === DFF срабатывающий по нарастающему фронту (posedge, смена CLK 0->1) === |
Revision as of 14:25, 18 June 2018
Contents |
Активная логика (триггеры)
Edge-triggered схемы срабатывают не по уровню, а по факту смены уровня с 0 на 1 (задний фронт, raising edge, posedge в Verilog) или с 1 на 0 (передний фронт, falling edge, negedge в Verilog).
Смысл этого в том, чтобы "открыть" триггер только в первую половину полутакта или в последнюю. То есть мы можем по идее умножить частоту, если использовать два триггера, один из которых настроен на задний фронт, а другой на передний.
Либо мы можем за 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, который открывается MOSFET P-типа, то это posedge DFF.
DFF срабатывающий по нарастающему фронту (posedge, смена CLK 0->1)
Стандартный D-триггер (в англ. литературе называется D flip/flop).
Обозначается символом :
(уголок рядом с CLK означает, что элемент срабатывает по фронту, а не по уровню)
Логика работы основана на propagation delay, с помощью которого управляются 2 внутренних D-latch:
На картинке я пометил 1 и 2 - внутренние сигналы CLK, которые есть на транзисторной схеме. Сигнал 1 немного запаздывает относительно сигнала 2, благодаря дополнительному инвертору. В результате чего выходной D-latch обновляется только когда 12 = 00 (то есть когда CLK меняет своё значение с 0 на 1).
Схемка для симуляции в Logisim лежит в SVN.
DFF по нарастающему фронту, со сбросом
Взяв за основу DFF, разработчики стали плодить его модификации.
Одна из них - DFF с дополнительным входом для сброса (причем вход в инверсной логике, как это обычно принято делать для сигналов сброса).
- Если /res (in2) равен нулю (сброс), то на выходе всегда будет 0
- Иначе схема работает как обычный DFF, устанавливая значение по нарастающему фронту
DFF со сбросом применяются например в счётчиках, а /RES используется когда нужно сбросить счётчик.
DFF по нарастающему фронту, селектируемый по MUX, со сбросом
Данный вариант ячейки является гибридным: вместо обычного входа (D) на ней установлен мультиплексируемый вход.
Вероятнее всего комбинация MUX + DFF встречалась настолько часто, что разработчики решили добавить гибридную ячейку.
Схема не особо отличается от DFFR.
|