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

Детский вопрос по присваиванию

1 час назад, vitzap сказал:

нструкцию save_reg=ram_read_data; оформить в виде комбинационной логики

То, что вы предлагаете, не комбинационная логика ни разу, а latch. А делать латчи в ПЛИС плохой тон.

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


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

26 minutes ago, andrew_b said:

не комбинационная логика ни разу, а latch

Драсте приехали. Конструкция типа always @ (*) в комбинации с блокирующим присваиванием "=", впринципе подразумевает чистую комбинаторику. Никаких летчей там нет и быть не может (для летча нужно неблокирующее присваивание).

И использовать летчи - не плохой тон, а просто нужно знать где их можно/нужно использовать, а где нет.

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


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

3 часа назад, Nick_K сказал:

Драсте приехали.

И вам не хворать.

3 часа назад, Nick_K сказал:

Конструкция типа always @ (*) в комбинации с блокирующим присваиванием "=", впринципе подразумевает чистую комбинаторику.

Вы видели предложенный код:

 always @(*)
   if (условие)
       save_reg = ram_read_data; 

Что должно быть, если "условие" == 0? Или вы хотите сказать, что это будет банальный мультиплексор, в котором выход заведён на второй вход:

 always @(*)
   if (условие)
       save_reg = ram_read_data;
   else
       save_reg = save_reg;

 

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


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

1 hour ago, andrew_b said:

Что должно быть, если "условие" == 0? Или вы хотите сказать, что это будет банальный мультиплексор, в котором выход заведён на второй вход:


 always @(*)
   if (условие)
       save_reg = ram_read_data;
   else
       save_reg = save_reg;

 

Всё верно данный код реализует обычный мельтиплексор.

Но если поменять список чувствительности со "*" на "условие", тогда может синтезироваться летч (зависит от настроек и хитрости синтезатора).

Либо если немножко видоизменить код :smile:

 always @(*)
   if (условие)
       save_reg <= ram_read_data;
   else
       save_reg <= save_reg;

Также получим защёлку. Как говорится: найдите одно существенное отличие :wink:

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


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

1 час назад, Nick_K сказал:

Всё верно данный код реализует обычный мельтиплексор.

Ужасно. Как почти всё в Верилоге.

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


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

Приветствую

5 hours ago, Nick_K said:

Всё верно данный код реализует обычный мельтиплексор.

Но если поменять список чувствительности со "*" на "условие", тогда может синтезироваться летч (зависит от настроек и хитрости синтезатора).

Либо если немножко видоизменить код :smile:

В обоих  случаях  (и с (*) и с каким либо сигналом в списке) будет синтезирован latch. 
Так как  latch синтезируется  если в списке чувствительности  нет  события  по клоку,  а в  теле процедуры переменная не получит какого либо нового значения значения в одной из веток условий.

 

Удачи! Rob.

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


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

5 часов назад, Nick_K сказал:

Всё верно данный код реализует обычный мельтиплексор.

Грубо ошибаетесь. Вам уже сказали, но и я добавлю:

Если в списке чувствительности нет фронта клока, а в теле есть save_reg = save_reg; (без разницы = или <=) то у вас получится комбинационная логика с обратной связью - т.е. latch.

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


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

22 hours ago, andrew_b said:

Ужасно. Как почти всё в Верилоге.

На самом деле не всё так плохо, так что не стоит паниковать) Хотя я допустил сильную ошибку и обьяснение ниже.

21 hours ago, RobFPGA said:

В обоих  случаях  (и с (*) и с каким либо сигналом в списке) будет синтезирован latch. 

Я решил перепроверить и увы ошибся. И Вы так же - ибо будет синтезирована комбинаторика в любом из приведённых случаев.

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

Для получения Latch'а нужно одно из значений оставить неинициализированым и неприсвоеным. Нагляднее ниже:

module dig_top(
	input clk_i,
	input en_i,
	input [0:7] data_i,
	output [0:7] data_o,
	output rdy_o
	);

	reg [0:3]	data_reg;	// вызов на летч
	reg [0:3]	data_s;		// вызов на комбинаторику

	always @(*)
		if (en_i)			// неполное описание значений - Летч (также нет init'а)
			data_s <= data_i[0:3];

	always @(*)				// полное описание условий - комбинаторика
		if (en_i)
			data_reg <= data_i[0:3];
		else
			data_reg <= data_i[4:7];

	assign data_o = {data_s, data_reg};
	assign rdy_o = en_i;

endmodule

image.thumb.png.067d0e30630de3a39498f24da5f2ab23.png

И дело тут не в списке чувствительности или условии.

18 hours ago, dvladim said:

вас получится комбинационная логика с обратной связью - т.е. latch

Для общего образования, летч - это не комбинационная логика. Летчи и Флопы - это секвенциональная логика (sequential), а вот всё остальное - комбинационная (луты, мультиплексоры, буфферы, гейты и т.д.).

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


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

Приветствую!

42 minutes ago, Nick_K said:

Я решил перепроверить и увы ошибся. И Вы так же - ибо будет синтезирована комбинаторика в любом из приведённых случаев.

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

Для получения Latch'а нужно одно из значений оставить неинициализированым и неприсвоеным. Нагляднее ниже:

Хитрец вы однако.  Вы же  не тот код проверяете что был изначально.  Изначально под else было  присвоение  переменной самой себе. Поэтому я и писал что "если нет присвоения нового значения в одной из веток".    

46 minutes ago, Nick_K said:

Для общего образования, летч - это не комбинационная логика.

Latch  это в первую очередь  функционал.  При желании можно и на логике  latсh нарисовать.  

Удачи! Rob.

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


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

5 часов назад, Nick_K сказал:

Для общего образования, летч - это не комбинационная логика.

Да что вы говорите.

Вот с точки зрения Qu latch - это комбинационная схема с обратной связью. Т.е. комбинационная схема выходы которой определяются не только входами.

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


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

Проблема оказалась не в моем коде, а как раз в том ram_read_data, который являлся выходом памяти, сгенерированной Block memory generator. После удаления сгенерированного блока и генерации нового все стало работать как и положено в теории.

 

Всем огромное спасибо за помощь!!!

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


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

5 hours ago, dvladim said:

Qu latch - это комбинационная схема с обратной связью

Значит это не элемент памяти, а какой-то набор комбинаторики (типа мультиплексор с обратной связью). Физически именно летч и флоп - это элемент с памятью и множество более продвинутых тулов считают именно так (например Conformal при LEC).

9 hours ago, RobFPGA said:

Изначально под else было  присвоение  переменной самой себе.

Да, упустил это. Видно от жары мозги начали закипать уже.

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


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

Приветствую.

15 hours ago, Nick_K said:

Значит это не элемент памяти, а какой-то набор комбинаторики (типа мультиплексор с обратной связью). Физически именно летч и флоп - это элемент с памятью и множество более продвинутых тулов считают именно так (например Conformal при LEC).

Функционально и D триггер это тоже  набор  элементов логики. 
Можно сделать аналог D триггера на 4-6 элементах nand3.  В Vv 6-ти элементный синхронный D триггер синтезится в 4-ре  LUT4 


Только  вот стандартный тамйминг-анализатор для FPGA будет ругается  на такое  так как он не рассчитан на анализ с комбинаторными петлями.  С хард. триггерами проще - для них есть  готовые тайминг модели и соответственно на них можно обрывать петли. 

 

Удачи! Rob.

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


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

16.07.2021 в 04:11, Nick_K сказал:

Значит это не элемент памяти, а какой-то набор комбинаторики (типа мультиплексор с обратной связью)

О как!

А чем же будут отличаться мультиплексор с обратной связью, латч и описание вида assign q = en ? d : q;

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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