|
|
  |
Защелки в FSM |
|
|
|
May 26 2010, 14:38
|
iBuilder©
   
Группа: Свой
Сообщений: 519
Регистрация: 14-07-04
Из: Минск
Пользователь №: 322

|
Цитата(icyrock @ May 26 2010, 17:28)  На мой взгляд использование защелок никакой проблемы не составляет. У меня половина обычных триггеров, а половина защёлок. Живу и радуюсь - никаких проблем.
А использовать ветку else только для того чтобы написать что триггер должен сохранить свое значение - это только засорять код. От ошибок это не защищает. С защёлками могут возникать неочевидные ошибки. Просто нужно осознанно их использовать. Это как с асинхронщиной, если обосновано и со знанием дела - пожалуста, используйте, будет работать. Но как показывает практика, у многих почему-то не работает. На симуляторе вроде работает, а на железе - глючит. Поэтому тут по моему должен действовать принцип - не уверен - не используй, уверен - нет проблем  По else, пишу на V/SV, обычно ставлю _ff, и не имею проблем с засорением кода лишней информацие. Добавлено: а разве защёлки во всех ПЛИС есть? Если нету - то тоже нарваться можно, т.к. она будет неким способом симитирована, и нужно ещё смотреть как именно...
|
|
|
|
|
May 27 2010, 14:26
|
Профессионал
    
Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079

|
Цитата(ViKo @ May 27 2010, 18:05)  Вот пример защелки Код assign out = in & out; Это не защелка, а комбинационная петля. Защелка - это: Код always @(*) if(en) out = in;
--------------------
|
|
|
|
|
May 27 2010, 15:02
|

Участник

Группа: Участник
Сообщений: 29
Регистрация: 27-04-07
Из: Санкт-Петербург
Пользователь №: 27 351

|
Цитата(des333 @ May 26 2010, 18:35)  Главный вопрос: а зачем? Алгоритмы у меня такие : нужно
|
|
|
|
|
May 27 2010, 15:38
|

Участник

Группа: Участник
Сообщений: 29
Регистрация: 27-04-07
Из: Санкт-Петербург
Пользователь №: 27 351

|
Цитата(bogaev_roman @ May 27 2010, 19:07)  А Вы уверены, что в Вашем алгоритме без защелок не обойтись? Все-таки защелки - хитрая вещь и ИМХО лучше без них. Да и по себе могу сказать - читая чужой код и встречая защелки (особенно в case любят опускать состояния) ну очень настораживает - как бы в неопределенность не погрузиться, особенно если обратная связь. Вижу в использовании защёлки (когда это требуется) следующие факторы увеличивающие наглядность кода 1. Нет лишней засоряющей пространство ветви else 2. Чем реже меняет значение триггер тем меньше "ряби" и посторонних (промежуточных) значений на симуляции 3. Текст always @(posedge clk) if (ce) dout<=din; Прямо говорит что меняется значение dout тогда когда ce в единице 4. В принципе можно напрячься и избавиться от защёлок. Но это может привести к тому, что код хоть и будет работать правильно но идею алгоритма придётся расшифровывать внимательно вглядываясь в превращение входных данных в выходные.
|
|
|
|
|
May 27 2010, 15:58
|
iBuilder©
   
Группа: Свой
Сообщений: 519
Регистрация: 14-07-04
Из: Минск
Пользователь №: 322

|
Цитата(icyrock @ May 27 2010, 18:38)  3. Текст always @(posedge clk) if (ce) dout<=din; Чёт-т туплю к концу дня, это разве защёлка? Вы точно уверены? По моему это банальный тригер, и тогда все остальные рассуждения теряют смысл.
|
|
|
|
|
May 28 2010, 06:21
|
Профессионал
    
Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082

|
Цитата(ViKo @ May 28 2010, 00:19)  Это - не триггер-защелка. Защелка (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 - May 28 2010, 06:24
|
|
|
|
|
May 28 2010, 09:24
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Во всяком случае, 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. Кстати... Цитата(bogaev_roman @ May 27 2010, 18:07)  assign out = in & en | out & !en; - Вот такая то оплошность быстро обнаружиться Это не оплошность, а осознанное решение. Ничего плохого в нем нет. Именно - триггер-защелка, применяется часто. Пример - 74HC373 - Octal 3-State Noninverting Transparent Latch. Бывают защелки "полезные", а бывают "непредусмотренные"
|
|
|
|
|
May 28 2010, 10:03
|
Профессионал
    
Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079

|
Цитата(bogaev_roman @ May 28 2010, 10:21)  Так что то о чем говорил des333 - это latch, то о чем писал я -flip-flop and latch в общем случае, и речь шла немного о разных вещах. Ну, я думал, по контексту темы все поняли, что имеется в виду та защелка, которая latch. Цитата(ViKo @ May 28 2010, 13:24)  Это не оплошность, а осознанное решение. Ничего плохого в нем нет. Именно - триггер-защелка, применяется часто. Пример - 74HC373 - Octal 3-State Noninverting Transparent Latch. Бывают защелки "полезные", а бывают "непредусмотренные"  Altera рекомендует не использовать latch вообще.
--------------------
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|