Я хочу разработать блок комбинационной логики с использованием VHDL, но иногда синтезированный результат содержит непреднамеренную защелку.
Каким правилам кодирования я должен следовать, чтобы синтезатор не вывел защелки?
Пример: в небольшом сегменте кода я должен использовать операторы if-else?
Ответы:
Чтобы избежать защелок, вы должны убедиться, что все ваши выходы назначены во всех возможных ветвях кода.
например,
будет генерировать защелку, потому что в первом условии значение b (1) не указано, поэтому компилятор решил, что вы хотите сохранить предыдущее значение b (1). Один из способов написать это, который не будет генерировать защелку:
Здесь вы явно заявляете, что b должен сохранить свое старое значение, а затем перезаписать b (0) новым значением.
Другой способ - указать значение ba по умолчанию, как в ответе @ TomiJ.
Если вы опубликуете код, на который получаете защелку, мы можем помочь вам найти конкретную причину.
источник
b <= b
позволит избежать защелки, поскольку он все еще требует сохранения состояния сигнала.Если вы используете процессы для комбинационной логики (и я советую против этого только по этой причине), убедитесь, что каждый путь в процессе назначает что-то каждому сигналу, который управляет процесс. Ни один из выходов не может зависеть от каких-либо выходов «последнего времени», в течение которого выполнялся процесс.
В противном случае вы выводите защелку, потому что в следующий раз, когда процесс запланирован, он должен сохранить значение сигнала, который не получил новое значение в прошлый раз.
Я предпочитаю сохранять чисто комбинационную логику в качестве непрерывных назначений и использовать процессы для тактированной логики, тогда я не получаю защелки.
источник
Четыре правила, чтобы избежать защелок:
Кроме того, если у вас есть несколько комбинационных процессов, убедитесь, что вы не создаете цикл.
Несколько стилей кодирования могут помочь вам придерживаться этих правил, например, стиль в ответе @ TomiJ. Как отмечает @Martin Thompson, может быть, лучше всего избегать комбинационной логики. Вместо этого поместите все в синхронизированный процесс.
источник
Как было отмечено @fbo и @Martin Thompson, вам необходимо убедиться, что каждому сигналу, управляемому процессом, присвоено некоторое значение в каждой ветви процесса, и это значение не должно зависеть от предыдущего состояния любого из выходов. процесса.
Самый простой способ убедиться в этом - назначить какое-то значение по умолчанию каждому выходу в самом начале процесса, например (пример использования fbo):
источник