Триггер с загрузкой/установкой, сбросом, кликом и вводом

Я не ищу описание триггера на аппаратном языке, но уровень логического элемента для реализации.

В Verilog эквивалент, который я ищу,

always@(posedge clk or negedge reset)
begin
    if(~reset)
      Q <= 1'b0;
    else if(~load)
      Q <= D;
    end

Я просмотрел: http://reviseomatic.org/help/e-flip-flop/4013%20D-Type%20Flip%20Flop.php и http://www.csee.umbc.edu/~squire/images . /dff.jpg

проблема с приведенной выше реализацией заключается в том, что после того, как я установил значение Q (D = 0, Q = 0, load = 0) с нагрузкой (установленной на картинке) = 0, затем, когда я устанавливаю высокую нагрузку нагрузки = 1 на следующем цикл clk, я получаю (D = x, Q = 1, load = 1). Другими словами, изменение нагрузки с true на false изменит значение Q, но я хочу, чтобы Q сохранял предыдущее значение.

Что такое триггер, который будет удерживать свое значение на Q после того, как он был установлен, а разрешение установлено на высокий уровень?

Ответы (1)

Вы рассматривали неправильные компоненты: триггер D-типа используется для выборки входа D в каждом тактовом цикле, но вы хотите использовать loadсигнал, чтобы включить выборку. Обратите внимание, что сигнал set, который вы хотели использовать, loadимеет другую функциональность - он вызывает высокий уровень на выходе (независимо от значения D).

То, что вы ищете, это D Flip-Flop с Enable. Есть два простых способа добавить эту функциональность к обычному D-FF.

Обратная связь:

Добавление MUX, который управляется Enableсигналом. На каждом фронте такта флоп будет либо выбирать новое значение, либо старое значение (что эквивалентно сохранению старого значения).

введите описание изображения здесь

Часы стробирования:

Вместо мультиплексирования входа триггера вы можете просто отключить часы, когда вы не хотите сэмплировать новое значение. Этот подход широко используется для снижения энергопотребления (нет часов -> нет активности -> не потребляется активная мощность).

Как отметил @Supercat в комментариях, синхронизация — это более сложный метод, который требует немного больше опыта, поскольку он создает дополнительные задержки в тактовом пути.

введите описание изображения здесь

Флоп с активацией отличается в некоторых очень важных аспектах от флопа, часы которого заблокированы извне. Среди прочего, время установки/удержания/минимального/максимального распространения на флопе с включением четко указано по нарастающему фронту часов; если часы стробируются за пределами флопа, погрешность в 5 нс во времени распространения логического элемента может превратить флоп, значения которого будут, например, 4/1/2/6 (что, если работать, например, на частоте 40 МГц (период 25 нс), может приспособить время распространения логики от предыдущая защелка 0-15 нс) в одну, значения которой будут 4/6/2/11 (требующие времени распространения логики...
... быть в диапазоне 4 нс-10 нс. Критически важным является то, что при использовании флопа с включением минимальное время для логики между флопами не требуется, но при внешнем стробировании часов оно есть. Еще одна проблема, которую следует учитывать, заключается в том, что разрешающий сигнал, как правило, должен соответствовать времени установки/удержания относительно активного фронта тактового сигнала, в то время как отдельно стробируемый тактовый сигнал должен избегать наличия спадающего фронта разрешающего сигнала вблизи (до или после). !) Активный край часов. Синхронизация безопаснее в устройствах с 2-фазной тактовой частотой, но я не видел, чтобы в последнее время широко использовались 2-фазные часы.
@supercat, действительно, стробирование часов представляет собой дополнительные факторы, которые следует учитывать, но эти факторы известны, и существуют надежные методы их обработки. Например, одна из оптимизаций, доступных в Synopsys Design Compiler, заключается в автоматическом преобразовании разрешений FF в синхронизацию.
У меня сложилось впечатление, что во многих устройствах FPGA большая часть логики не имеет определенного минимального времени распространения, за исключением того, что если два флопа управляются одной и той же назначенной тактовой шиной , время распространения одного выхода одного флопа плюс любая логика, через которую он проходит, будет соответствовать требования к времени удержания другого флопа. Если флопы не проходят через назначенную шину синхронизации, время распространения может произвольно варьироваться. Хуже того, если кто-то не форсирует физическую реализацию узла схемы (использование флоп-флопа заставит это сделать), логика, подаваемая узлом, может иметь отрицательную задержку распространения относительно него.
Конечно, некоторые устройства включают в свои шины тактовых импульсов схему, позволяющую безопасно стробировать их, но я не знаю ни одного, позволяющего безопасно фиксировать выход флопа, тактовый сигнал которого сгенерирован с использованием «случайной логики», любым другим флопом, контролируемым контроллером. тот же главный фронт часов. Некоторые устройства позволяют это?
@supercat, у меня нет большого опыта работы с FPGA, но, если я правильно помню, там очень ограниченные возможности для стробирования тактовых импульсов. Конечно, дизайн должен соответствовать срокам, но методы обеспечения этого выходят за рамки этого вопроса. Я даже не уверен, что OP знает, что такое STA.