andrew_b 14 14 июля, 2021 Опубликовано 14 июля, 2021 · Жалоба 1 час назад, vitzap сказал: нструкцию save_reg=ram_read_data; оформить в виде комбинационной логики То, что вы предлагаете, не комбинационная логика ни разу, а latch. А делать латчи в ПЛИС плохой тон. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 14 июля, 2021 Опубликовано 14 июля, 2021 · Жалоба 26 minutes ago, andrew_b said: не комбинационная логика ни разу, а latch Драсте приехали. Конструкция типа always @ (*) в комбинации с блокирующим присваиванием "=", впринципе подразумевает чистую комбинаторику. Никаких летчей там нет и быть не может (для летча нужно неблокирующее присваивание). И использовать летчи - не плохой тон, а просто нужно знать где их можно/нужно использовать, а где нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 14 июля, 2021 Опубликовано 14 июля, 2021 · Жалоба 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 14 июля, 2021 Опубликовано 14 июля, 2021 · Жалоба 1 hour ago, andrew_b said: Что должно быть, если "условие" == 0? Или вы хотите сказать, что это будет банальный мультиплексор, в котором выход заведён на второй вход: always @(*) if (условие) save_reg = ram_read_data; else save_reg = save_reg; Всё верно данный код реализует обычный мельтиплексор. Но если поменять список чувствительности со "*" на "условие", тогда может синтезироваться летч (зависит от настроек и хитрости синтезатора). Либо если немножко видоизменить код always @(*) if (условие) save_reg <= ram_read_data; else save_reg <= save_reg; Также получим защёлку. Как говорится: найдите одно существенное отличие Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 14 июля, 2021 Опубликовано 14 июля, 2021 · Жалоба 1 час назад, Nick_K сказал: Всё верно данный код реализует обычный мельтиплексор. Ужасно. Как почти всё в Верилоге. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 14 июля, 2021 Опубликовано 14 июля, 2021 · Жалоба Приветствую 5 hours ago, Nick_K said: Всё верно данный код реализует обычный мельтиплексор. Но если поменять список чувствительности со "*" на "условие", тогда может синтезироваться летч (зависит от настроек и хитрости синтезатора). Либо если немножко видоизменить код В обоих случаях (и с (*) и с каким либо сигналом в списке) будет синтезирован latch. Так как latch синтезируется если в списке чувствительности нет события по клоку, а в теле процедуры переменная не получит какого либо нового значения значения в одной из веток условий. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 16 14 июля, 2021 Опубликовано 14 июля, 2021 · Жалоба 59 minutes ago, RobFPGA said: будет синтезирован lath Latch, ваще-то.. )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvladim 0 14 июля, 2021 Опубликовано 14 июля, 2021 · Жалоба 5 часов назад, Nick_K сказал: Всё верно данный код реализует обычный мельтиплексор. Грубо ошибаетесь. Вам уже сказали, но и я добавлю: Если в списке чувствительности нет фронта клока, а в теле есть save_reg = save_reg; (без разницы = или <=) то у вас получится комбинационная логика с обратной связью - т.е. latch. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 15 июля, 2021 Опубликовано 15 июля, 2021 · Жалоба 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 И дело тут не в списке чувствительности или условии. 18 hours ago, dvladim said: вас получится комбинационная логика с обратной связью - т.е. latch Для общего образования, летч - это не комбинационная логика. Летчи и Флопы - это секвенциональная логика (sequential), а вот всё остальное - комбинационная (луты, мультиплексоры, буфферы, гейты и т.д.). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 15 июля, 2021 Опубликовано 15 июля, 2021 · Жалоба Приветствую! 42 minutes ago, Nick_K said: Я решил перепроверить и увы ошибся. И Вы так же - ибо будет синтезирована комбинаторика в любом из приведённых случаев. При полном описании каждого значения "условия", либо присутствии значения "else" будет синтезироваться чистейшая комбинаторика-мультиплексоры. Для получения Latch'а нужно одно из значений оставить неинициализированым и неприсвоеным. Нагляднее ниже: Хитрец вы однако. Вы же не тот код проверяете что был изначально. Изначально под else было присвоение переменной самой себе. Поэтому я и писал что "если нет присвоения нового значения в одной из веток". 46 minutes ago, Nick_K said: Для общего образования, летч - это не комбинационная логика. Latch это в первую очередь функционал. При желании можно и на логике latсh нарисовать. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvladim 0 15 июля, 2021 Опубликовано 15 июля, 2021 · Жалоба 5 часов назад, Nick_K сказал: Для общего образования, летч - это не комбинационная логика. Да что вы говорите. Вот с точки зрения Qu latch - это комбинационная схема с обратной связью. Т.е. комбинационная схема выходы которой определяются не только входами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexPec 3 15 июля, 2021 Опубликовано 15 июля, 2021 · Жалоба Проблема оказалась не в моем коде, а как раз в том ram_read_data, который являлся выходом памяти, сгенерированной Block memory generator. После удаления сгенерированного блока и генерации нового все стало работать как и положено в теории. Всем огромное спасибо за помощь!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 16 июля, 2021 Опубликовано 16 июля, 2021 · Жалоба 5 hours ago, dvladim said: Qu latch - это комбинационная схема с обратной связью Значит это не элемент памяти, а какой-то набор комбинаторики (типа мультиплексор с обратной связью). Физически именно летч и флоп - это элемент с памятью и множество более продвинутых тулов считают именно так (например Conformal при LEC). 9 hours ago, RobFPGA said: Изначально под else было присвоение переменной самой себе. Да, упустил это. Видно от жары мозги начали закипать уже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 16 июля, 2021 Опубликовано 16 июля, 2021 · Жалоба Приветствую. 15 hours ago, Nick_K said: Значит это не элемент памяти, а какой-то набор комбинаторики (типа мультиплексор с обратной связью). Физически именно летч и флоп - это элемент с памятью и множество более продвинутых тулов считают именно так (например Conformal при LEC). Функционально и D триггер это тоже набор элементов логики. Можно сделать аналог D триггера на 4-6 элементах nand3. В Vv 6-ти элементный синхронный D триггер синтезится в 4-ре LUT4 Только вот стандартный тамйминг-анализатор для FPGA будет ругается на такое так как он не рассчитан на анализ с комбинаторными петлями. С хард. триггерами проще - для них есть готовые тайминг модели и соответственно на них можно обрывать петли. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvladim 0 17 июля, 2021 Опубликовано 17 июля, 2021 · Жалоба 16.07.2021 в 04:11, Nick_K сказал: Значит это не элемент памяти, а какой-то набор комбинаторики (типа мультиплексор с обратной связью) О как! А чем же будут отличаться мультиплексор с обратной связью, латч и описание вида assign q = en ? d : q; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться