«Защелка» отличается от «триггера» тем, что FF изменяет свой выход только в ответ на фронт тактового сигнала. Защелка может изменить свой выход в ответ на что-то, кроме часов. Например, SR-Latch имеет набор и вход сброса, и если любой из них активен, выход может измениться. Где, как SR-FF, реагирует на установку или сброс только тогда, когда имеется также край тактового сигнала.
В FPGA вы хотите, чтобы ваша логика была полностью синхронной. Это означает, что все элементы хранения (например, FF) синхронизируются от одного источника синхронизации. Все, что является асинхронным с этими часами, должно обрабатываться очень осторожно, иначе произойдет ошибка синхронизации.
Защелка в основном является асинхронным элементом хранения. Он не имеет тактового входа и поэтому не может быть синхронизирован с любыми часами. Следует отметить, что есть FF с асинхронным сбросом и входами сброса, и к ним следует относиться с той же осторожностью, что и к обычным защелкам.
Разобраться во всех проблемах синхронизации, которые могут вызвать защелки, гораздо больше, чем здесь, но позвольте мне привести один пример:
Допустим, у вас есть SR-Latch, и вы хотите, чтобы он устанавливался каждый раз, когда 8-битный счетчик достигает определенного значения. Я не уверен, каким будет код Verilog, но в VHDL этот код: set <= '1' когда count = "11010010" else '0'; Этот установленный сигнал поступает на установленный вход нашей SR-Latch.
Логика, которая генерирует, является чисто комбинаторной; смесь и-ворота, или-ворота, и инверторы (или LUT). Но пути прохождения сигнала по этой комбинаторной логике не всегда идеальны, и сигнал «set» может иметь глюки. Путь прохождения сигнала через определенную группу затворов может занять больше времени, чем у другой группы, в результате чего заданный выходной сигнал активируется на короткое время, прежде чем выходной сигнал устанавливается в конечное состояние.
Этот выходной глюк может привести к тому, что наш SR-Latch будет установлен, даже если это не предполагалось. Если мы переключаемся с SR-Latch на SR-FF, синхронизируясь с теми же часами, что и счетчик, то SR-FF будет ждать один полный тактовый цикл, прежде чем менять состояние. По сути, он будет ждать установления сигнала, прежде чем смотреть на него.
Если пути через комбинаторную логику для заданного сигнала просто маршрутизируются по-разному (что приводит к различным задержкам), то поведение сбоев также изменится. Логика может работать нормально, но затем, поскольку вы изменили что-то совершенно не связанное, эта логика маршрутизируется по-другому, и ошибка появляется. Температура и напряжение также изменят синхронизацию сигнала, и, таким образом, могут изменить поведение сбоев.
Это неопределенность во времени, поэтому вы должны избегать защелок в вашей логике. FF гораздо безопаснее в использовании. Вот почему ваш компилятор предупреждает вас о защелках, так как легко ошибочно сделать защелку, и вы, вероятно, в любом случае ее там не хотите.
Конечно, иногда требуются защелки. Вы просто должны использовать их очень редко, только когда это абсолютно необходимо, а затем вы должны правильно разработать логику, чтобы избежать возможных сбоев.