Timmy 1 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба на IXBT оказались дизайнеры лучше. Они видать работали и им некогда было глупостями маятся:)... Я вот тоже так подумал, кто будет решать дурацкие задачки? Правильно, только дураки:). вопрос о том где описано поведение while остается открытым... как-то уж очень чуднО выходит. как только d1 становится 1, мы проваливаемся в while и сидим там пока оно не станет 0, это ок. как только к d1 добавляется d2, мы проваливаемся во второй while и сидим там, даже если первый while перестал выполняться, то есть даже когда d1 стало обратно 0. И также с 3 while, и как только мы провалились в него q начинает молотить... и теперь даже если убрать d1 и d2 ничего не остановится... Поведение вериложного while в этом смысле нисколько не отличается от поведения сишного, всё очень просто. Ещё один способ обеспечить симулируемость без полного перелопачивания алгоритма - это добавить ожидания по сигналам: module tst1( output reg q=0, input d1, d2, d3, clk ); always @(d1) while(d1) @(d2 or ~d1) while(d2) @(d3 or ~d2) while(d3) @(posedge clk) q <= ~q; endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба "Бой" устроил в ответ на это: http://forum.ixbt.com/topic.cgi?id=48:9544-67#2035 И задачку специально подобрал не на сложность или знание, а на понимание Верилога - как видно, она оказалась чрезвычайно проста для тех кто действительно понимает Верилог. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба Leka вы вредный троль... опытный, но все же троль... не то чтобы это упрек или оскорбление, это констатация факта... Поведение вериложного while в этом смысле нисколько не отличается от поведения сишного, всё очень просто. кроме всего вокруг... ломается идиология... ну да ладно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба @(d2 or ~d1) while(d2) А в чем, если не секрет, суть инверсии d1 внутри @(), если нету ни posedge, ни negedge ? PS Интересная задачка была на развитие мозгов в правильном направлении понимания языка. Жаль, только с отпуска прилетел... Уже все всё решили, осталось только посмотреть на готовенькое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба А в чем, если не секрет, суть инверсии d1 внутри @(), если нету ни posedge, ни negedge ? Это я путаюсь между VHDL и Verilog. В VHDL в подобной конструкции будет завершение ожидания по уровню, а в Verilog - только по обоим фронтам. Тогда этот код неправильный, а правильно как-то так: module tst1( output reg q=0, input d1, d2, d3, clk ); always begin if(!d1) @(d1); while(d1)begin if(!d2) @(d2 or d1); while(d2)begin if(!d3) @(d3 or d2); while(d3) @(posedge clk) q <= ~q; end end end endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба Тогда этот код неправильный Правильный, просто "~" внутри "@(...)" лишние. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 12 августа, 2014 Опубликовано 12 августа, 2014 · Жалоба Правильный, просто "~" внутри "@(...)" лишние. Неправильный, так как он не предотвращает зацикливание while, который, в отличие от always, не будет ждать следующего дельта-цикла перед повтором. Правильней так: module tst1( output reg q=0, input d1, d2, d3, clk ); always begin if(!d1) @(d1); while(d1)begin if(!d2) @(d2 or negedge d1); while(d2)begin if(!d3) @(d3 or negedge d2); while(d3) @(posedge clk) q <= ~q; end end end endmodule Нужны if-ы или нет, не совсем очевидно, лучше не рисковать:). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 14 августа, 2014 Опубликовано 14 августа, 2014 (изменено) · Жалоба Тут, помимо q, извращённым способом определены ещё 3 триггера, назову их d1t,d2t,d3t(у каждого выход .q), условия установки/сброса следующие: d3t.reset = ~d3 && posedge clk d3t.set = d2t.q && d3 d2t.reset = ~d2 && ~d3.q d2t.set = d1.q && d2 d1t.reset = ~d1 && ~ d2.q d1t.set = d1 Сплошная асинхронщина, в некоторых ПЛИС нет RS триггеров, придётся на LE слепить:). Хотя, это можно как то и упростить, наверное, но думать лень, задача дурацкая. У меня неправильно в tst2(): условия установки/сброса "повторно" должны проверяються не раньше, чем будет "пройден" весь always. А тут правильно. Изменено 14 августа, 2014 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Мур 1 5 сентября, 2014 Опубликовано 5 сентября, 2014 · Жалоба egorman44 Знакомая ситуация :(. Долго, муторно и, зачастую, бессмысленно. Но вариантов нет. Вам привели хороший пример про ручку и карандаш, и про то, то нужно время. IMHO, необходимо (последовательно): - выделить ВСЕ сигналы и процессы в таблицу; - в таблицу внести столбики куда сигналы входят, откуда и куда идут с кратким описанием Вашего понимания их назначения; - нарисовать блок-схему устройства и перенести (физически скопировать в квадратики) на неё код (как САПР); - нарисовать машины состояний; - нарисовать диаграммы изменения сигналов; - нарисовать временные диаграммы сигналов; - написать тест-бенч и проверить правильность работы RTL; - создать контрольные примеры; - скорее всего, местами переписать код - если нет тестового окружения, то писал его либо гений, либо разгильдяй. Второе наиболее вероятно. После постараться дать "пинка под зад" руководителю, поскольку если проект не документирован и без контрольных векторов, то это не руководитель. Совсем. Этот ответ мне понравился больше всего, только хочу дополнить, чтобы автоматизировать процесс... В подобном случае мне приходилось прибегать к ActiveHDL, который по коду специальным инструментом(я сейчас за чужим компом не могу точнее указать) рисовал квадратики со связями. Это первое. Любой проект имеет набор тестбенчей, которые позволяют увидеть во времени взаимодействие полученных квадратиков(модулей). Тогда в Модел-Симе можно уточнить для себя нюансы поведения любого составляющего. Если этого нет,- придется написать бенч самому, основываясь на том ТЗ, что был изначально. Только пройдя этот путь можно быть уверенным в понимании логики, а значит и возможности смены кода на свой. К тому же тест-бенч уже под рукой! =) Кстати, (для ленивых) в Моделсиме можно на ходу менять руками некоторые состояния(тоже не помню точно, а глянуть тут не могу). Бывает очень выручает... ...Если есть железо под рукой, есть отличная возможность под JTAGом смотреть реальные процессы исследуемого кода. В крайнем случае,- выводить сигналы на контрольные пины (их закладывают с запасом для контрорля осцилографом=) и частенько для подпаек добавленных компонент к макету) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Мур 1 5 сентября, 2014 Опубликовано 5 сентября, 2014 · Жалоба Следствием этих мучений может быть собственный опыт при создании нового проекта. Я лично по ходу написания проекта в произвольной форме пишу текст, где отражаю ключевые моменты. Как можно подробнее. В итоге, через какое-то время, этот текст становится огромной ценностью. Даже для себя =). Уже чистовик в конце пишется легче и приятнее. "Делть нужно все вовремя!" Если бы такие черновики оставались от каждого,- экономия сил была бы колоссальной! Не ленитесь! Следите, чтобы свой код не стал "чужим"! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gotcha 0 30 сентября, 2014 Опубликовано 30 сентября, 2014 · Жалоба понять ТЗ; обложить тестами, начиная с топового и заканчивая отдельными модулями; в процессе "вкуривания" комментировать код; Помогают еще разные фичи тулов: просмотр иерархии, схематик вью... Имея хорошее покрытие тестами, вносить изменения не так боязно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Мур 1 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба Хм... Я в подобных случаях для не знакомых мне VHDL-проектов (желательно рабочих) пользуюсь инструментом в ActiveHDL,- CODE2GRAPHICS conversion Wizard. В итоге можно будет глянуть функциональную блок-схему со связями с понятной иерархией. Так легче потом разбираться... .....А вообще HDL можно ли назвать программированием? Я всегда для программистов контроллеров объясняю, что мы пишем свои пожелания и не факт, что именно так оно и будет реализовано. Да и этап оптимизации проекта у классических программеров отсутствует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aaron 1 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба Ни разу не vhdl-программист, но вот сейчас закупаем Sigasi studio, которая очень уж удобная - вот там между кодом и графами скакать оперативно да разбираться в коде самое оно для целей топикстартера! Можно бесплатную демо-версию у них запросить, дают без проблем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Мур 1 31 марта, 2017 Опубликовано 31 марта, 2017 · Жалоба Ни разу не vhdl-программист, но вот сейчас закупаем Sigasi studio, которая очень уж удобная - вот там между кодом и графами скакать оперативно да разбираться в коде самое оно для целей топикстартера! Можно бесплатную демо-версию у них запросить, дают без проблем. Я делал попытку год назад обзавестись. У меня они постоянно в рассылке. И что, теперь можно сделать еще попытку? попробую... Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться