Jump to content

    

Синтезатор минимизирует лишнего

я не могу точно отослать к главам стандарта, но вроде бы

 

reg [15:0] MyReg = 0;

и

reg [15:0] MyReg;
initital begin
  MyReg = 0;
end

Эквивалентны.

Да, только не "output reg [1:0]State = 0"

 

Share this post


Link to post
Share on other sites
...power-up level of a register to minimize the area of the design...

да я зря наехал, он сделал все корректно. Для минимизации взял и похерил состояние которые проскакивают, считая что автомат стартанул из другого состояния, причем не просто молча их похерил, а еще и варнинг написал. Молодец, на самом деле, все четко сделал.

 

Да, только не "output reg [1:0]State = 0"

 

вот так пишу, так можно.

 

module MyModule
   ( 
     ....
     out_reg,
     ....
    );

    output reg [15:0] out_reg = 0; 

endmodule

 

и можно добавлять в начале

#(
    parameter My_PARAM = 10, 
    .....)

 

хотя может именно в сигналах равно в скобках недопустимо...

Share this post


Link to post
Share on other sites
Сделайте синхронный сброс.
Да хоть какой сброс, от куда его подавать? От PLL, как советует тов. Голиков? Но в общем случае PLL может и не присутствовать в проекте.

 

Даже если нет PLL все равно генератору надо раскачаться, у многих плис после загрузки конфигурации есть возможность выбрать задержку до появления сигнала готовности.
А разве пока ПЛИС конфигурируется генератор не успеет выйти на режим?

 

ну это не аргумент. Самый последний брать не надо, а какой-то из новых с патчами вполне нормально работает.
Вполне аргумент. У меня комутер слабенький новые квартусы работают заметно медленнее. Да и тут периодически всплывают жалобы "Раньше проект нормально разводился, а на новом Квартусе уже не лезет в кристалл.", в технике есть хорошее правило "Работает - не трожь".

Ваш то пишет на вашу конструкцию что он нашел автомат?
Не знаю, в консоли ничего такого не пишет.

 

Могли бы указать, где это у Альтеры прописано.
Говорю же, точно не уверен, но помню, что что-то такое читал в документации на первый Циклон.

 

Не гарантирует. Смотрим вашу опцию 'Power-Up don't care':

Т.е. у вас State изначально в X, а не в 0.

И синтезатор имел полное право стартануть автомат из любого состояния (что он и сделал)

А, ну теперь ясно.

Хотя до сих пор не понимаю, почему второй код работает.

Share this post


Link to post
Share on other sites
Да хоть какой сброс, от куда его подавать? От PLL, как советует тов. Голиков? Но в общем случае PLL может и не присутствовать в проекте.

У Альтеры нет примитива startup?

Share this post


Link to post
Share on other sites
У Альтеры нет примитива startup?
Первый раз о таком слышу, можно по подробнее, где его искать?

 

Share this post


Link to post
Share on other sites
Первый раз о таком слышу, можно по подробнее, где его искать?

 

Я с Альтерой не работал, поэтому и спросил. У xilinx эти примитивы в наборе CONFIG/BSCAN в лампочке. В этом startup есть сигнал окончания конфигурации, бытовало мнение, что его можно завести как сброс для начальной установки. Возможно, это мнение ошибочно.

Share this post


Link to post
Share on other sites
Я с Альтерой не работал, поэтому и спросил. У xilinx эти примитивы в наборе CONFIG/BSCAN в лампочке. В этом startup есть сигнал окончания конфигурации, бытовало мнение, что его можно завести как сброс для начальной установки. Возможно, это мнение ошибочно.

Не ошибочно.

EOS - Active high output signal indicating the End Of Startup.

Именно этот сигнал постоянно используем для генерации общего ресета. В том числе и для PLL.

Share this post


Link to post
Share on other sites

у всех есть сигнал что бутиться закончили, после этого стОит еще счетчик для задержки сделать чтобы все клоки раскачались если надо, и потом общий сброс снять.

Share this post


Link to post
Share on other sites
Хотя до сих пор не понимаю, почему второй код работает.
Второй работает потому, что автомат циклически ходит по всем состояниям, и никакими начальными значениями State это не изменить. Т.е. синтезатор не имеет права выкидывать какие либо состояния, т.к. в любое из них можно попасть из любого другого.

 

 

Share this post


Link to post
Share on other sites

второй во 2 состоянии останавливается, если начать с него то кода еще меньше. С другой стороны дефалт у 2 автомата активный в отличии от 1...

 

 

а обнаружен автомат или нет это в репортах поглядеть можно, там даже написано как оно закодировалось, у альтеры оне хот обычно

Share this post


Link to post
Share on other sites
Салют.

 

Синтезируем простенький автомат:

Методом научного тыка нашёл решение проблемы, в настройках синтезатора нужно снять опцию "Power-Up don't care".

Кто-нибудь может сказать что происходит?

Сейчас напишу немного другое...

Я вот даю уроки по ПЛИС и первое, что я объясняю, так это то, что любая разработка для инженера это риск. И его задача в том, чтобы этот риск свести к минимуму. Потому как цель - это зарабатывание денег, а не написание разных файлов.

А потому первое, что нужно делать - это писать файлы совершенно каноническим образом, чтобы и симулятор и компилятор их воспринимали однозначно. И при этом результат был бы гарантирован.

А вот "изучение" криво написанного файла - этот то как раз и есть тупик. И он, файл этот, приводит к увеличению числа ошибок. В сложном проекте это приведет к лавинообразному нагромождению ошибок.

Так вот, в чем цель ТС? Поиграть файлами? Или нужен результат проекта? Если нужен результат, то берем описание автомата из шаблонов или из рекомендаций по языку и не выпендриваемся...

Share this post


Link to post
Share on other sites

Звучит мрачновато. Из серии "жизнь - это боль".

 

Но всё остальное правильно, конечно. Если работа не связана с тестированием средств моделирования и синтеза, то RTL-описание должно быть предельно понятным и разработчику, и синтезатору, и коллегам. Иначе это не описание, а фуфло.

 

любая разработка для инженера это риск.

Share this post


Link to post
Share on other sites
Второй работает потому, что автомат циклически ходит по всем состояниям, и никакими начальными значениями State это не изменить. Т.е. синтезатор не имеет права выкидывать какие либо состояния, т.к. в любое из них можно попасть из любого другого.
второй во 2 состоянии останавливается, если начать с него то кода еще меньше.
Вот именно, что он циклится во втором состоянии, 0-е и 1-е, также, как и в первом случае, недостижимы.

С другой стороны дефалт у 2 автомата активный в отличии от 1...
Он то активный, но как автомат может попасть в 3-е состояние, если по его логике он туда попасть не может? В результате сбоя, наводок, помех, воздействия радиации? Но если такое случится, мне кажется, уже никакой дефолт не поможет, ведь сбойнёт не только этот автомат, но и другие части схемы.

 

а обнаружен автомат или нет это в репортах поглядеть можно, там даже написано как оно закодировалось, у альтеры оне хот обычно
Прикрепил 3 файла с отчётами, ничего такого там вроде не пишут.

 

Так вот, в чем цель ТС? Поиграть файлами? Или нужен результат проекта? Если нужен результат, то берем описание автомата из шаблонов или из рекомендаций по языку и не выпендриваемся...
Имеет место факт, вот и интересно почему происходит именно так, а не иначе, и никаких выпендриваний здесь нет.

LCDTest.flow.rpt.txt

LCDTest.map.rpt.txt

LCDTest.map.summary.txt

Share this post


Link to post
Share on other sites

Задача ваша из полезнейшей категории: "почему неправильное RTL-описание синтезируется/работает не так, как я хочу? интернет, памагай!"

 

В соответствии с вашим RTL-описанием (первый листинг), начальное состояние регистра

reg [1:0] State

будет 2'bxx, т.е. "логическое неопределенное". Скажу больше, на любом времени моделирования значение будет 2'b1x.

 

Оптимизатор все это учел и из множества "начальных неопределенных" честно взял то значение, которое даст минимиальное количество триггеров и состояний в FSM.

 

Рекомендую вам научиться пользоваться средствами моделирования. Много вопросов отпадет, много времени удастся сэкономить, в том числе и в процессе самообразования. Пока вы не добъетесь правильной работы блока в симуляторе, включать средства синтеза смысла не имеет.

 

Успехов.

Share this post


Link to post
Share on other sites
Он то активный, но как автомат может попасть в 3-е состояние, если по его логике он туда попасть не может? В результате сбоя, наводок, помех, воздействия радиации? Но если такое случится, мне кажется, уже никакой дефолт не поможет, ведь сбойнёт не только этот автомат, но и другие части схемы.

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

 

Ксалинкс однозначно говорит задай параметр и так буду делать. Ставишь безопасный - добавлю состояния, ставиш небезопасный выкину лишнее. Как делает альтера я не знаю, совершенно спокойно она может проверять наличие активного дефолта, и использовать это как критерей генерации безопасного автомата.

 

Прикрепил 3 файла с отчётами, ничего такого там вроде не пишут.

я не очень искушен в квартусе, но сейчас в последних версиях там есть какие-то интерактивные отчеты, которые не файлы, а в среде открываются какие-то вкладочки, закладочки, и там все это написано, там есть прям закладка FSM и в ней все автоматы собраны.

 

 

Так вот, в чем цель ТС? Поиграть файлами? Или нужен результат проекта?

На самом деле исследование работы среды и почему она приняла то или иное решение также важно в понимание процесса, на мой взгляд, как и заучивание стандартных описаний. Это база и фундамент. ИМХО конечно.

Так что я вижу цель ТС разобраться почему оно так сработало, и в целом мы уже почти нашли ответ.

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this