Jackov 1 21 сентября, 2015 Опубликовано 21 сентября, 2015 (изменено) · Жалоба Салют. Синтезируем простенький автомат: module Test(output reg [1:0]State, output reg [3:0]Out, input C); always @(posedge C) begin case(State) 0: begin State <= 2'd1; Out <= 4'b0001; end 1: begin State <= 2'd2; Out <= 4'b0010; end 2: begin State <= 2'd3; Out <= 4'b0100; end 3: begin State <= 2'd2; Out <= 4'b1000; end default: begin State <= 0; Out <= 4'b0000; end endcase end endmodule Как видим 0-е и 1-е состояние выполняется один раз, потом цикл 2-3-2-3-2-3-2-3.... Синтезатор Квартуса 9.1 нас осчастливил следующим: Warning: Output pins are stuck at VCC or GND Warning (13410): Pin "State[1]" is stuck at VCC Warning (13410): Pin "Out[0]" is stuck at GND Warning (13410): Pin "Out[1]" is stuck at GND По этим ворнингам можно понять, что были выкинуты 0-е и 1-е состояния. При этом, если засинтезировать такой автомат, где используются не все состояния регистра State, то всё норм. module Test(output reg [1:0]State, output reg [2:0]Out, input C); always @(posedge C) begin case(State) 0: begin State <= 2'd1; Out <= 3'b001; end 1: begin State <= 2'd2; Out <= 3'b010; end 2: begin State <= 2'd2; Out <= 3'b100; end default: begin State <= 0; Out <= 3'b000; end endcase end Методом научного тыка нашёл решение проблемы, в настройках синтезатора нужно снять опцию "Power-Up don't care". Кто-нибудь может сказать что происходит? Изменено 21 сентября, 2015 пользователем Jackov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 21 сентября, 2015 Опубликовано 21 сентября, 2015 · Жалоба а как вы в первом листинге в нулевое состояние попадаете? а никак. вот синтезатор считает, что вы в него никогда не попадаете. и оптимизирует. hint: попадать туда нужно по сигналу сброса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 21 сентября, 2015 Опубликовано 21 сентября, 2015 · Жалоба hint: попадать туда нужно по сигналу сброса. Это да, согласен. Но вроде, если ничего не путаю, Альтера гарантирует, что в начале работы все триггеры будут в нуле. Да и второй код почему отрабатывает нормально? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 21 сентября, 2015 Опубликовано 21 сентября, 2015 · Жалоба HDL - это язык описания оборудования. синтезатор волен исполнять то что написано любым удобным ему способом. если вы чего-то не описали, значит будет так, как задано в алгоритме синтезатора по умолчанию. при снятии галки "Power-Up don't care" вам повезло, что ваше нулевое состояние совпадает с тем, что синтезатор устанавливает по-дефолту регистры в 0. причем, никто не сможет запретить разработчикам quartus поменять это дефолтное поведение через две версии. в результате чего ваш ранее работавший проект может перестать работать. конкретно в quartus при отключении галки "Power-Up don't care" после загрузки sof непосредственно перед переходом в user-mode регистры устанавливаются в то состояние, которое описано в initial. у вас блока initial нет - поэтому берется дефолт синтезатора. однако использование initial является дурным тоном для RTL. поэтому рекомендуется использовать сброс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 21 сентября, 2015 Опубликовано 21 сентября, 2015 · Жалоба однако использование initial является дурным тоном для RTL. Ага и давайте опишите мне со сбросом ROM блок.... Синтезатор Квартуса 9.1 нас осчастливил следующим: А сейчас последний не 15 случаем? Если пойти еще дальше, то там вообще автоматы придется описывать в 2 этапа, с комбинаторной логикой отдельно. Думаю тут конкретно старый квартус просто не распознал автомат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 21 сентября, 2015 Опубликовано 21 сентября, 2015 · Жалоба Ага и давайте опишите мне со сбросом ROM блок.... я-таки стесняюсь спросить, а зачем он вам такой нужен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 21 сентября, 2015 Опубликовано 21 сентября, 2015 · Жалоба синтезатор волен исполнять то что написано любым удобным ему способом. если вы чего-то не описали, значит будет так, как задано в алгоритме синтезатора по умолчанию. Как же я не описал? Я описал состояния с 0-го по 3-е. Я же не просто так их написал, они мне нужны! Какое право он имел выкинуть первые два? С одной стороны его можно понять, он не знает с какого состояния должен начать работу автомат, но с другой стороны Альтера гарантирует, что все триггеры будут установлены в ноль, значит компилятор тоже об этом знает, а раз так, то и выкидывать он ничего не должен, потому что он обязан сообразить, что автомат будет исполнятся из 0-го состояния. поэтому рекомендуется использовать сброс.Тогда этот сброс надо делать либо от кнопки, что не всегда возможно, либо специально ставить микросхему сброса в духе RC-цепочки, что, как я думаю, тоже неправильно, ПЛИС должна быть самодостаточна (в разумных пределах). Конечно можно использовать виртуальные пины, но это уже костыли. Однако, почему второй код рабочий - непонятно. А сейчас последний не 15 случаем? Если пойти еще дальше, то там вообще автоматы придется описывать в 2 этапа, с комбинаторной логикой отдельно. Думаю тут конкретно старый квартус просто не распознал автомат.Кстати да, обычно кружочки в RTL-вивере рисует, а тут просто схему. Начиная с 10 версии Квартусы какие-то нехорошие пошли, глючные и тормознутые, хотя 13-15 не пробовал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 22 сентября, 2015 Опубликовано 22 сентября, 2015 · Жалоба Как же я не описал? Я описал состояния с 0-го по 3-е. Я же не просто так их написал, они мне нужны! Какое право он имел выкинуть первые два? Он ничего не "должен". Это ваша задача описать схему правильно. Есть определенные правила, которые нужно соблюдать. С одной стороны его можно понять, он не знает с какого состояния должен начать работу автомат, но с другой стороны Альтера гарантирует, что все триггеры будут установлены в ноль, значит компилятор тоже об этом знает, а раз так, то и выкидывать он ничего не должен, потому что он обязан сообразить, что автомат будет исполнятся из 0-го состояния. Он не должен думать за вас. Тогда этот сброс надо делать либо от кнопки, что не всегда возможно, либо специально ставить микросхему сброса в духе RC-цепочки, что, как я думаю, тоже неправильно, ПЛИС должна быть самодостаточна (в разумных пределах). Конечно можно использовать виртуальные пины, но это уже костыли. Сделайте синхронный сброс. Или просто опишите правильно схему. Однако, почему второй код рабочий - непонятно. Как раз тут всё понятно. Его логика в первом примере такая: из состояний 2 и 3 в 0 или 1 никак не попадешь. Поэтому так как нет сброса, то можно предположить, что начинаем во 2 или 3 и поэтому оптимизируем состояния 0 и 1. Во втором случае состояние 0 оптимизировать нельзя, так как в него можно попасть. А в 1 можно попасть из 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 22 сентября, 2015 Опубликовано 22 сентября, 2015 · Жалоба я-таки стесняюсь спросить, а зачем он вам такой нужен? таблица синусов очень распространенное назначение. мне нужен чтобы развернуть времянку управления ICAP там 78 команд по 18 бит, что их в регистрах хранить. да, конечно, можно корку сгенерить и файл подсунуть, но верилог должен мочь описывать такое железное явление как блок памяти, и он может. Начиная с 10 версии Квартусы какие-то нехорошие пошли, глючные и тормознутые, хотя 13-15 не пробовал. ну это не аргумент. Самый последний брать не надо, а какой-то из новых с патчами вполне нормально работает. Ваш то пишет на вашу конструкцию что он нашел автомат? Как раз тут всё понятно. Его логика в первом примере такая: из состояний 2 и 3 в 0 или 1 никак не попадешь. Поэтому так как нет сброса, то можно предположить, что начинаем во 2 или 3 и поэтому оптимизируем состояния 0 и 1. Во втором случае состояние 0 оптимизировать нельзя, так как в него можно попасть. А в 1 можно попасть из 0. Да как раз ничего не понятно 1 автомат: 0 - 1 - 2 - 3 - 2 - 3... 2 автомат: 0 - 1 - 2 - 2 - 2 - 2... и в обоих есть дефалт, конечно в 1 сучае дефалт недостижим потому что все состояния заняты, и переход в 0 явно отрезается. Но и во втором случае дефолт недостижим, так как нет перехода в него. Так что единственное здравое объяснение поведения - это некорректное решение по оптимизации синтезатора. И получается он рассматривает схему с начальным состоянием 11 почему-то, только так можно объяснить почему он выкинул 0, 1 состояние, и почему он считает что State[1] зажать на питание. Тогда этот сброс надо делать либо от кнопки, что не всегда возможно, либо специально ставить микросхему сброса в духе RC-цепочки, что, как я думаю, тоже неправильно, ПЛИС должна быть самодостаточна (в разумных пределах). Конечно можно использовать виртуальные пины, но это уже костыли. Вот тут вы не правы, у вас наверняка в ПЛИС есть PLL и внешний клок. Всей этой байде надо настроиться и начать считать и выдавать правильный, ровный клок. Даже если нет PLL все равно генератору надо раскачаться, у многих плис после загрузки конфигурации есть возможность выбрать задержку до появления сигнала готовности. Это все не спроста. Чтобы вся схема в ПЛИС начала корректно работать, ей нужен общей правильный старт. В блоке ПЛЛ - есть сигнал LOCK, в добавок к этому сигналу надо сделать маленький счетчик, который получив сигнал LOCK досчитает по клоку до какого-то значения, и снимет сброс со всей схемы. Это стандартное и правильное решение. В итоге у вас вся схема стартанет разом, по нормальному клоку, из понятного состояния. Можно в целом и по LOCK сразу без счетчика сбрасываться, но в начальный момент на некоторых ПЛИС он может беситься... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 22 сентября, 2015 Опубликовано 22 сентября, 2015 · Жалоба Да как раз ничего не понятно 1 автомат: 0 - 1 - 2 - 3 - 2 - 3... 2 автомат: 0 - 1 - 2 - 2 - 2 - 2... и в обоих есть дефалт, конечно в 1 сучае дефалт недостижим потому что все состояния заняты, и переход в 0 явно отрезается. Но и во втором случае дефолт недостижим, так как нет перехода в него. Так что единственное здравое объяснение поведения - это некорректное решение по оптимизации синтезатора. И получается он рассматривает схему с начальным состоянием 11 почему-то, только так можно объяснить почему он выкинул 0, 1 состояние, и почему он считает что State[1] зажать на питание. Я могу только предполагать, но, возможно, он решил, что ему легче начать с состояния 2 или 3 так как описания сброса не было. А default он отбросил по понятным причинам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 22 сентября, 2015 Опубликовано 22 сентября, 2015 · Жалоба интересно, а если в исходном коде написать output reg [1:0]State = 0, то есть явно задать начальное значение, что будет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 22 сентября, 2015 Опубликовано 22 сентября, 2015 · Жалоба интересно, а если в исходном коде написать output reg [1:0]State = 0, то есть явно задать начальное значение, что будет... Я не уверен, что это корректный синтаксис (никогда не видел такого). Может, в initial? А лучше сделать нормальный сброс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serhiy_UA 1 22 сентября, 2015 Опубликовано 22 сентября, 2015 · Жалоба .... Но вроде, если ничего не путаю, Альтера гарантирует, что в начале работы все триггеры будут в нуле. Могли бы указать, где это у Альтеры прописано. На всякий случай, может пригодится. Для сброса, например софт-процессора, подходит сигнал locked от мега-функции ALTPLL. Проверено много раз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 22 сентября, 2015 Опубликовано 22 сентября, 2015 · Жалоба Я не уверен, что это корректный синтаксис (никогда не видел такого). Может, в initial? А лучше сделать нормальный сброс. я не могу точно отослать к главам стандарта, но вроде бы reg [15:0] MyReg = 0; и reg [15:0] MyReg; initital begin MyReg = 0; end Эквивалентны. во всяком случае ISE и Квартус одних из последних версий на это не ругаются, и задают значения регистров. как просили, естественно можно и не 0. Можно ли это сразу задать в скобках модуля я не верен, потому что в скобках я всегда объявляю только имена, а уже входы, выходы, регистры, я расписываю ниже. Я даже где то видел упоминание что wire [15:0] MyWire = signal; эквивалентно заданию через assign, но на это у меня синтезатор ругнулся, и я не стал копать, возможно это уже систем верилог. Для сброса, например софт-процессора, подходит сигнал locked от мега-функции ALTPLL. Проверено много раз. да собственно использования этого сигнала для сброса рекомендуется и в описании, и если я не ошибаюсь для альтеры там еще дано уточнение что надо сделать некую задержку, потому что первое время этот сигнал несколько раз появляется и пропадает, так как PLL настраивается. В ксалинксе для сброса проца модулю еще дополнительно выжидает паузу, думаю у альтеры тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 22 сентября, 2015 Опубликовано 22 сентября, 2015 · Жалоба Но вроде, если ничего не путаю, Альтера гарантирует, что в начале работы все триггеры будут в нуле.Не гарантирует. Смотрим вашу опцию 'Power-Up don't care': A logic option that causes registers that do not have a Power-Up Level logic option setting to power up with a don't care logic level (X). When Power-Up Don't Care is turned on, the Compiler determines when it is beneficial to change the power-up level of a register to minimize the area of the design.Т.е. у вас State изначально в X, а не в 0. If this option is turned on, the register powers up with the logic level most appropriate for the design И синтезатор имел полное право стартануть автомат из любого состояния (что он и сделал) http://quartushelp.altera.com/14.0/mergedP...p_dont_care.htm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться