МАРСОХОД

Open Source Hardware Project

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

ТЕМА: Предупреждение "Found combinational loop"

Предупреждение "Found combinational loop" 6 года 9 мес. назад #706

  • MichaelTLT
  • MichaelTLT аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 12
  • Спасибо получено: 0
Здравствуйте!
Мне нужно реализовать простую защелку. Я пишу следующий код:
always @*
	begin
		if (reset)
			data_out <= 8'h00;
		else
			begin
			if (ale)
				data_out <= data_in;
			end
	end

Вроде бы ничего необычного, однако при компиляции выдается пачка предупреждений типа
"Warning (332125): Found combinational loop of 2 nodes
Warning (332126): Node "data_out[7]$latch~9|[3]"
Warning (332126): Node "data_out[7]$latch~9|dataout"

Я не очень силен в английском. Наверно это предупреждение означает, что где-то образовалась обратная связь. Но в RTL viewer тоже не видно ничего подозрительного. В чем может быть дело и как от этого избавиться?

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

Re: Предупреждение "Found combinational loop" 6 года 9 мес. назад #707

  • nckm
  • nckm аватар
  • Не в сети
  • Администрация форума
  • Администрация форума
  • Сообщений: 88
  • Спасибо получено: 23
по своему опыту хочу сказать, что использование защелок нежелательно. Стараюсь их всячески избегать и использовать только синхронную логику. особенно большие проекты с защелками плохо, нестабильно работают.

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

Re: Предупреждение "Found combinational loop" 6 года 9 мес. назад #708

  • MichaelTLT
  • MichaelTLT аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 12
  • Спасибо получено: 0
Как же тогда поступить? Мне нужно связать микроконтроллер со статической памятью. А это делается через защелку. Ставить отдельную микросхему неспортивно.

Попробовал изменить код:
module decoder(
	input wire reset,
	input wire clock,
	input wire psen,
	input wire rd,
	input wire ale,
	input wire [7:0] data_in,
	output reg [7:0] data_out,
	output reg oe
	);
	
	always @(posedge clock)
	begin
		if (reset)
			data_out <= 8'h00;
		else
			begin
			if (ale)
				data_out <= data_in;
			end
	end
	
	always @*
	begin
		oe <= psen & rd;
	end
endmodule
Предупреждения исчезли, однако сгенерировалась жуткая схема:

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

Re: Предупреждение "Found combinational loop" 6 года 9 мес. назад #709

  • MichaelTLT
  • MichaelTLT аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 12
  • Спасибо получено: 0
Сейчас смотрю на старую материнскую плату. Там возле панелек для кэш-памяти стоят два регистра-защелки, несмотря на окружающие ПЛИСы.

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

Re: Предупреждение "Found combinational loop" 6 года 9 мес. назад #712

Ну, если ресет синхронный, да разрешение хранения, то так оно и будет.
Выведи ресет из цикла - сделай асинхронным. Будет легче.

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

Re: Предупреждение "Found combinational loop" 6 года 9 мес. назад #718

  • nckm
  • nckm аватар
  • Не в сети
  • Администрация форума
  • Администрация форума
  • Сообщений: 88
  • Спасибо получено: 23
вся схема должна быть синхронной, никаких защелок, только регистры - это залог работоспособности.
Я согласен с SOVA - можно сделать ресет ассинхронным - будет красивей

always @(posedge clock or posedge reset)
begin
if (reset)
data_out <= 8'h00;
else
if (ale)
data_out <= data_in;
end

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

  • Страница:
  • 1
Время создания страницы: 0.153 секунд

facebook  GitHub  YouTube  Twitter
Вы здесь: Начало Forum Наш форум Языки программирования Предупреждение "Found combinational loop"