Перейти к содержанию
    

На мой взгляд использование защелок никакой проблемы не составляет. У меня половина обычных триггеров, а половина защёлок. Живу и радуюсь - никаких проблем.

 

А использовать ветку else только для того чтобы написать что триггер должен сохранить свое значение - это только засорять код. От ошибок это не защищает.

С защёлками могут возникать неочевидные ошибки. Просто нужно осознанно их использовать. Это как с асинхронщиной, если обосновано и со знанием дела - пожалуста, используйте, будет работать. Но как показывает практика, у многих почему-то не работает. На симуляторе вроде работает, а на железе - глючит.

Поэтому тут по моему должен действовать принцип - не уверен - не используй, уверен - нет проблем :)

По else, пишу на V/SV, обычно ставлю _ff, и не имею проблем с засорением кода лишней информацие.

 

Добавлено: а разве защёлки во всех ПЛИС есть? Если нету - то тоже нарваться можно, т.к. она будет неким способом симитирована, и нужно ещё смотреть как именно...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а разве защёлки во всех ПЛИС есть?

Вот пример защелки

assign out = in & out;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот пример защелки

assign out = in & out;

 

Это не защелка, а комбинационная петля.

 

 

Защелка - это:

 

always @(*)
  if(en)
   out = in;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это не защелка, а комбинационная петля.

Защелка - это:

Ну, нехай так будет. И то, и другое легко сделать в любой ПЛИС :)

Вот пример, выполняющий то же самое. Но на него Quartus ругается, как на комбинационную петлю.

  assign out = in & en | out & !en;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Алгоритмы у меня такие : нужно :)

А Вы уверены, что в Вашем алгоритме без защелок не обойтись? Все-таки защелки - хитрая вещь и ИМХО лучше без них.

Да и по себе могу сказать - читая чужой код и встречая защелки (особенно в case любят опускать состояния) ну очень настораживает - как бы в неопределенность не погрузиться, особенно если обратная связь.

assign out = in & en | out & !en; - Вот такая то оплошность быстро обнаружиться, а вот если case состояний этак на 100, ну и одно забыли - хана, не обнаружишь.

Изменено пользователем bogaev_roman

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Алгоритмы у меня такие : нужно :)

Это как с оператором goto. Всегда можно обойтись и без него.  :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А Вы уверены, что в Вашем алгоритме без защелок не обойтись? Все-таки защелки - хитрая вещь и ИМХО лучше без них.

Да и по себе могу сказать - читая чужой код и встречая защелки (особенно в case любят опускать состояния) ну очень настораживает - как бы в неопределенность не погрузиться, особенно если обратная связь.

 

Вижу в использовании защёлки (когда это требуется) следующие факторы увеличивающие наглядность кода

1. Нет лишней засоряющей пространство ветви else

2. Чем реже меняет значение триггер тем меньше "ряби" и посторонних (промежуточных) значений на симуляции

3. Текст

always @(posedge clk)

if (ce)

dout<=din;

Прямо говорит что меняется значение dout тогда когда ce в единице

4. В принципе можно напрячься и избавиться от защёлок. Но это может привести к тому, что код хоть и будет работать правильно но идею алгоритма придётся расшифровывать внимательно вглядываясь в превращение входных данных в выходные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3. Текст

always @(posedge clk)

if (ce)

dout<=din;

Чёт-т туплю к концу дня, это разве защёлка? Вы точно уверены?

По моему это банальный тригер, и тогда все остальные рассуждения теряют смысл.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3. Текст

always @(posedge clk)

if (ce)

dout<=din;

Это не защелка. Смотрите пример защелки выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

always @(posedge clk)

if (ce)

dout<=din;

Это триггер-защелка (синтезирован будет как обычный триггер). Тока вот теперь ответьте на вопрос что Вы будете делать если будет вложенный оператор

if else if else и забудете первый else поставить? А вообще можно просто написать else ; И насчет читабельности я бы еще поспорил.

Изменено пользователем bogaev_roman

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это триггер-защелка (синтезирован будет как обычный триггер).

Это - не триггер-защелка.

Защелка (Latch) - это триггер, который передает входной сигнал, когда L = 1 (прозрачный), и не передает входной сигнал, когда L = 0. В момент перехода L из 1 в 0 триггер "защелкивает" сигнал, а до этого момента сигнал на выходе мог меняться вместе с входным.

 

P.S. А для case есть слово default.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это - не триггер-защелка.

Защелка (Latch) - это триггер, который передает входной сигнал, когда L = 1 (прозрачный), и не передает входной сигнал, когда L = 0. В момент перехода L из 1 в 0 триггер "защелкивает" сигнал, а до этого момента сигнал на выходе мог меняться вместе с входным.

 

P.S. А для case есть слово default.

Все-таки откопал из старого форума-конференции - вот собственно тема http://www.telesys.ru/wwwboards/fpga/270/m...ges/21837.shtml

А вот подробное описание отличий - http://www.telesys.ru/wwwboards/fpga/270/m...ges/22311.shtml

Так что то о чем говорил des333 - это latch, то о чем писал я -flip-flop and latch в общем случае, и речь шла немного о разных вещах.

Некоторым лень сознательно ставить default так же как и else - типа читается лучше да и строчек меньше, а потом начинается в крупных проектах "выковыривание" ошибки.

Интересно, а вот сходу скажет кто-нибудь - стандарт рекомендует по стилю вставлять else и default? По-моему рекомендует, хотя и не обязывает...

Изменено пользователем bogaev_roman

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во всяком случае, Quartus предлагает следующий шаблон для case:

case(<constant_expr>)
<constant_expr>: 
  begin : <block_name>
    // Generate Items
  end
<constant_expr>:
  begin : <block_name>
    // Generate Items
  end
// ...
default: 
  begin : <block_name>

  end
endcase

// NOTE: Block names are optional but Altera recommends them.

 

Кстати...

assign out = in & en | out & !en; - Вот такая то оплошность быстро обнаружиться

Это не оплошность, а осознанное решение. Ничего плохого в нем нет. Именно - триггер-защелка, применяется часто. Пример - 74HC373 - Octal 3-State Noninverting Transparent Latch.

Бывают защелки "полезные", а бывают "непредусмотренные" :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так что то о чем говорил des333 - это latch, то о чем писал я -flip-flop and latch в общем случае, и речь шла немного о разных вещах.

 

Ну, я думал, по контексту темы все поняли, что имеется в виду та защелка, которая latch.  :)

 

 

 

 

Это не оплошность, а осознанное решение. Ничего плохого в нем нет. Именно - триггер-защелка, применяется часто. Пример - 74HC373 - Octal 3-State Noninverting Transparent Latch.

Бывают защелки "полезные", а бывают "непредусмотренные" :)

 

Altera рекомендует не использовать latch вообще.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...