Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: Триггер или защёлка

Триггер или защёлка 5 года 11 мес. назад #7652

  • vadim1
  • vadim1 аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 7
  • Спасибо получено: 1
Надеюсь, я правильно понял, защёлка - тот же триггер но с сигналом enable.

Осваиваю verilog. Но наверное, вопрос больше по железу.

Бывает, одну и ту же логику можно записать так, что будет синтезирован или триггер или защёлка.

Пример:
//`define REG 1

module reg_or_latch(clk, x, a, b);
	input clk, x, a;
	output reg b;

`ifdef REG

	always @ (posedge clk)
		if (x) // это будет синтезировано как сигнал enable защёлки
			b <= a;

`else

	wire ab;
	assign ab = a && x || b && !x;
	always @ (posedge clk)
		b <= ab;

`endif
endmodule

Надо ли стремиться к решениям типа 2, чтобы был сгенерирован именно триггер? С точки зрения электрической нагрузки или, скажем, ресурса? С точки зрения вероятности ошибок в логике?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Триггер или защёлка 5 года 11 мес. назад #7653

  • nckm
  • nckm аватар
  • Не в сети
  • Администрация форума
  • Администрация форума
  • Сообщений: 112
  • Спасибо получено: 34
Вообще-то всегда, когда присвоение идет в always блоке с posedge clk (или negedge clk) будет синтезирован тригер. В этом легко убедиться, если посмотреть после компиляции проекта в квартусе меню Tools => Netlist Viewers => RtlViewer
В вашем примере в виде if(x) не превращает эту конструкцию в защелку. Там так же будет тригер.

Защелка - в моем понимании это нечто другое..
Вот к примеру

reg [1:0]a;
reg [7:0]b;
always @*
if( a==0)
b = 5;
else
if( a==1)
b=6;
else
if(a==2)
b=7;

Здесь, во-первых, нет posedge clk, значит эта логика не синхронная, а просто логическая функция. Однако, переменная "a" двухбитная, а if рассматривают не все варианты, не известно, что присваивать в переменную "b" если a==3. Значит синтезатор будет ставить "защелку", то есть latch, который будет удерживать в переменной "b" предыдущее присвоенное значение, если вдруг "a" станет равно 3

Так вот вот этот latch который появится в результате - на мой взгляд не хорошо. Нужно избегать таких логических функций, которые могут обернуться защелками.
Quartus на защелки выдает предупреждение Warning. Да и симуляция защелок не очень хорошо идет.

А если always@( posedge clk) - тут защелки не будет.
Спасибо сказали: vadim1

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Триггер или защёлка 5 года 11 мес. назад #7655

  • vadim1
  • vadim1 аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 7
  • Спасибо получено: 1
nckm, спасибо!
На вашем примере в первые увидел подписи "latch" в RTL-viewer.
А ведь уже занимаюсь месяца 3. Вот что значит не системное изучение предмета!..

Но по сути вопрос не в этом. Ладно, не защёлка, а регистр с сигналом enable. Надо ли избегать этого сигнала, за счёт дополнительной комбинаторной логики на входе регистра?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Триггер или защёлка 5 года 11 мес. назад #7656

  • nckm
  • nckm аватар
  • Не в сети
  • Администрация форума
  • Администрация форума
  • Сообщений: 112
  • Спасибо получено: 34
Я думаю специально избегать сигнала Enable не нужно, да скорее всего вы и не сможете его избежать, ведь использовать его или нет скорее зависит не от вас, а от синтезатора и библиотечных элементов из которых синтезатор строит конечную схему.
Например, вот структурная схема логического элемента FPGA Cyclone IV



У этого логического элемента есть на триггере специальный сигнал Enable, Таким образом, если он будет задействован, то это даже сэкономит ресурсы ПЛИС, не будут вместо Enable использоваться LUT.

В статье marsohod.org/verilog/153-verilogpictflop есть пример триггера который с сигналом Enable и показано, как он может выглядеть по разному в RTLviewer.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
Время создания страницы: 0.117 секунд
Работает на Kunena форум