Программируемая логика - это не так уж и сложно. Разберемся вместе.
Ответить

Как перестать использовать защелки?

Чт сен 07, 2017 01:26:08

Приветствую.
Начал изучать verilog, но не могу избавиться от "сишной" привычки использовать if без else :) . Везде пишут, что это недопустимо, т.к. приводит к синтезу защелки (latch), надо обязательно ставить else или делать инициализацию. Это все понятно, но проблема именно в том, что данная конструкция "есть событие - меняем переменную, нет события - оставляем как было" очень удобная, но приходится постоянно выкручиваться и каждый раз что-то изобретать, чтобы ее не использовать. Вроде как старый инструмент отобрали, а новый не выдали - очень некомфортно :) . Что посоветуете?

Re: Как перестать использовать защелки?

Сб сен 09, 2017 08:39:41

использовать if без else :) . Везде пишут, что это недопустимо, т.к. приводит к синтезу защелки (latch)
Это допустимо, например в обыкновенном счетчике с разрешением счета:
Код:
always @(posedge clk) begin
  if (enable) begin
    cnt <= cnt + 1'b1;
  end
end
Защелки - это триггеры со статическим управлением, соответственно они появляются там где присваивание происходит не по фронту тактового сигнала. Например RS-триггер:
Код:
always @(S, R, C, Q)
  if(C) begin
    Q <= (~R & Q) | S;
  end else begin
    Q <= Q;
  end
end
Такое действительно не желательно, потому что затрудняет временной анализ САПР-у и создает значительные задержки.
Для того чтобы этого не происходило, достаточно в блоках always делать присваивание только по фронту тактового сигнала и не использовать блокирующие присваивания. Если требуется описать комбинационную логику отдельно, то хорошим вариантом будет использовать assign, а не always.

Что посоветуете?
Изучить основы синтеза цифровых устройств на бумажке. Советую прорешать примеры из https://librusec.pro/b/474613 или чего-нибудь похожего.
Ответить