Jump to content

    
Sign in to follow this  
alexPec

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

Recommended Posts

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

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

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

Share this post


Link to post
Share on other sites
26 minutes ago, andrew_b said:

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

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

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

Share this post


Link to post
Share on other sites
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;

 

Share this post


Link to post
Share on other sites
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:

Share this post


Link to post
Share on other sites

Приветствую

5 hours ago, Nick_K said:

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

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

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

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

 

Удачи! Rob.

Share this post


Link to post
Share on other sites
5 часов назад, Nick_K сказал:

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

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

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

Share this post


Link to post
Share on other sites
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), а вот всё остальное - комбинационная (луты, мультиплексоры, буфферы, гейты и т.д.).

Share this post


Link to post
Share on other sites

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

42 minutes ago, Nick_K said:

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

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

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

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

46 minutes ago, Nick_K said:

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

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

Удачи! Rob.

Share this post


Link to post
Share on other sites
5 часов назад, Nick_K сказал:

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites
5 hours ago, dvladim said:

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

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

9 hours ago, RobFPGA said:

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

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

Share this post


Link to post
Share on other sites

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

15 hours ago, Nick_K said:

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

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


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

 

Удачи! Rob.

Share this post


Link to post
Share on other sites
16.07.2021 в 04:11, Nick_K сказал:

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

О как!

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this