Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонятное поведение Флип-Флопа при синтезе Хилинх версии 10.1
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
BlackOps
Значит так, кода много будет вставлять объясню так.

Ест несколько регистров (флип-флопов с Enable) которые контролируются мультиплексорами. Ну и есть автомат управления который всем етим управляет через мультиплексоры, т.е. читает значения выводов регистров, и в зависимости от етих значений переходит в соответствующие положения и изменяет ети регистры..опять таки не напрямую конечноже а через мультиплексоры.

Так вот, когда я все ето дело симуировал, а потом реализовывал на EDK 9.1 то на чипе потом все работало так как хотел.

А теперь, с версией 10.1 у меня какие то странности! А именно:

Есть например один регистр, и автомат управления следит когда его вывод будет равен 768..в етом случае автомат управления должен записать в него 0 через мультиплексор ну и сделать другие определенные действия. Но етого не происxодит! т.к. после того как вывод регистра достигает значения 13 он сбрасывается на 0! Ну и соответственно автомат управления не переходит в нужное состояние которое достигается после значения 768.

Странное явление, и повторю еще раз именно с версией софта Xilinx 10.1 !!

Ест какие соображения?

И еще...регистр етот 10 битовый! И что интересно, у меня еще есть несколько регистров которые примерно так работают..но они не сбрасываются раньше времени и с ними все нормально... а они примерно 5-6 бит... т.е. етот самый длинный как бы.. может сдесь что я недоглядел?... хотя чтоже тут особенного...

спасибо
andrewkrot
Пока не выложите хоть кусок кода никто Вам не поможет. Мое мнение = асинхронщина.
Maverick
добавлю/поясню к предыдущему сообщению - нужна схема или описание на HDL.
BlackOps
ок ну вот фрагмент мультиплексора с регистром:

Код
  -- Row counter register

  row_counter_reg: entity work.dffn
           generic map (
                          n   =>  10
                       )
           port map (    
                       clk    =>  clk,
                       en     =>  row_cnt_reg_en,
                       rst    =>  rst,
                       d      =>  row_cnt_reg_in,
                       q      =>  row_cnt_reg_out
                    );

    -- Row counter register control Mux
    with row_cnt_inc select
        row_cnt_reg_in       <=     row_cnt_reg_out when "00",
                                    row_cnt_reg_out + 1 when "01",
                                    "0000000000" when "10",
                                    (others => '0') when others;


для управления использую row_cnt_reg_en и row_cnt_inc.

в поле чувствительности процесса автомата управления сигнал row_cnt_reg_out, в зависимости от его значения поднимаю row_cnt_reg_en и ставлю нужное значение на row_cnt_inc

ну а еслиб асинхронщина была то и с версией софта 9.1 проблемы бы были..

п.с. автомат управления работает на том же клоке что и регистры
andrewkrot
А что в качестве клока используете?
tema-electric
Может у вас настройки сред разные? Одна соптимизировала, другая нет ... В одной фиттер впихнул ненужное, а в другой не впихнул. Сравните количество ресурсов потребляемое в разных средах в конечном виде и делайте выводы с помощью rtl вьювера схем, или Technology map вьювера. Но второе - это уже жескач конечно. smile.gif

Ещё как дополнение, если уж совсем всё плохо и не понятно, то можно провести моделирование схемы (rtl) и затем при необходимости конечную (gate level).

ПС: хотелось бы увидеть побольше кода. Не совсем понятно, что за типы вы там используете .... вектора std_logic или signed, unsigned. Может ISE арифметику вам по разному синтезировал ...
BlackOps

клок, ну ето уже системный клок на котором все работает, стабильный нормальный..с етим проблем нет.

да уж...надо будет может в настройках поковыряться...тока знать бы что именно могло бы быть связано именно с етим...
tema-electric
Цитата(BlackOps @ Aug 10 2010, 14:17) *
да уж...надо будет может в настройках поковыряться...тока знать бы что именно могло бы быть связано именно с етим...


Выше там добавил в месадж wink.gif. Увы не знаток ISE. Если найдете разницу в утилзации ресурсов количество регистров/логических ячеек. То смотреть надо на опции синтезатора и фиттера ... И повырубать или повключать всякого рода оптимизации, как они у вас были. Если там всё гуд ... синтезатор с его репликацией логики мог увеличить вам быстродествие ))). Стратегию синтеза ... площадь, скорость, баланс.
BlackOps
значит так...а данные простые стд_логик_вектор... ничего особенного....да и кодирую я всегда в таком стиле, поменьше разных заморочек а больше на регистровом уровне... разве что +/- оставляю как есть...а остальное нет.

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

вот уже в логе синтеза обнаружил:
INFO:Xst:2117 - HDL ADVISOR - Mux Selector <row_cnt_inc> of Case statement line 0 was re-encoded using one-hot encoding. The case statement will be optimized (default statement optimization), but this optimization may lead to design initialization problems. To ensure the design works safely, you can:
- add an 'INIT' attribute on signal <row_cnt_inc> (optimization is then done without any risk)

и еще ето:
Using one-hot encoding for signal <row_cnt_inc>.
tema-electric
Цитата(BlackOps @ Aug 10 2010, 14:51) *
значит так...а данные простые стд_логик_вектор... ничего особенного....да и кодирую я всегда в таком стиле, поменьше разных заморочек а больше на регистровом уровне... разве что +/- оставляю как есть...а остальное нет.

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


Отступление: Для std_logic_vector, лучше вообще не использовать арифметику. Нервы целей будут. Ибо он изначально непонятно какой ... то-ли знаковый то-ли беззнаковый. Не пользую даже в ситуациях "ничего особенного". signed и unsigned такие же вектора, только фокусов не будет. И конвертятся они в std_logci_vector и обратно простым приведением типов.

Мне кажется тот код который вы привели, он работает нормально. У вас приходит row_cnt_inc на сброс. И тут вы выбрали способ кодирование состояний автомата не очень хорошо и оно может быть не совпадает с предыдущей версией ISE. А выбор способа кодирования определяет оптимизацию по утилизации регистров и быстродействие автомата. Исследуйте процесс формирования row_cnt_inc от регистров состояния автомата в rtl вьювире схемы. Если там целый табор этих регистров, значит вам просто не хватает быстродействия.

ПС: вы так ничего и не сказали про утилизацию ресурсов в разных версиях ISE.

-----------------
Ну вот и вылазят догадки smile.gif
Цитата
Using one-hot encoding for signal <row_cnt_inc>.
Boris_TS
Цитата(BlackOps @ Aug 10 2010, 12:24) *
вот уже в логе синтеза обнаружил:
INFO:Xst:2117 - HDL ADVISOR - Mux Selector <row_cnt_inc> of Case statement line 0 was re-encoded using one-hot encoding. The case statement will be optimized (default statement optimization), but this optimization may lead to design initialization problems. To ensure the design works safely, you can:
- add an 'INIT' attribute on signal <row_cnt_inc> (optimization is then done without any risk)

и еще ето:
Using one-hot encoding for signal <row_cnt_inc>.

Если хочется победить Xst:2117 - HDL ADVISOR, то попробуйте заменить (others => '0') when others на (others => '0') when "11". При использовании case отказ от when others => мне помог (в ISE 10.1SP3) избавиться от этого сообщения.
des00
Цитата(BlackOps @ Aug 9 2010, 23:10) *
Есть например один регистр, и автомат управления следит когда его вывод будет равен 768..в етом случае автомат управления должен записать в него 0 через мультиплексор ну и сделать другие определенные действия. Но етого не происxодит! т.к. после того как вывод регистра достигает значения 13 он сбрасывается на 0! Ну и соответственно автомат управления не переходит в нужное состояние которое достигается после значения 768.

Странное явление, и повторю еще раз именно с версией софта Xilinx 10.1 !!

Узнали что не работает с помощью ChipScope? Что показывает временное моделирование? Какой результат в 12 ой версии исе?
Цитата(BlackOps @ Aug 10 2010, 03:24) *
вот уже в логе синтеза обнаружил:
и еще ето:

Ничего страшного в этом нет, исе увидел что два бита нужно подать на отдельную логику, из которой нужно сформировать сигнал сброса и входного переноса и изменил кодирование этих двух бит, что бы выиграть в этом месте.
tema-electric
Цитата(Boris_TS @ Aug 10 2010, 16:01) *
попробуйте заменить (others => '0') when others на (others => '0') when "11".


А на сколько правомерна такая замена? std_logic кодируется не только по 0 и 1. У него 9 значений. И все остальные получатся неопределенными.

Если я не ошибаюсь конечно.

И по идее правильней бы всё это выглядело как-то так ...

Код
    -- Row counter register control Mux
    with row_cnt_inc select
        row_cnt_reg_in       <=     row_cnt_reg_out when "00",
                                    row_cnt_reg_out + 1 when "01",
                                    (others => '0') when "10",
                                    (others => '0') when "11",
                                    (others => '-') when others;
Boris_TS
Цитата(tema-electric @ Aug 10 2010, 14:05) *
А на сколько правомерна такая замена? std_logic кодируется не только по 0 и 1. У него 9 значений. И все остальные получатся неопределенными.

Если я не ошибаюсь конечно.

Для моделирования замена не равнозначная (тут, по идеи, на others надо ловушки вешать, явно описав все правильные состояния),.. а вот для синтеза - полностью эквивалентная. (Вообще-то для case'ов я использовал перечисляемые типы, и соответственно явно указывал все возможные комбинации. Если же вместо одной из комбинация написать others, то появляется сей неприятный XST Info.)
BlackOps

значит так..такое кодирование попробовал:
Код
    -- Row counter register control Mux
    with row_cnt_inc select
        row_cnt_reg_in       <=     row_cnt_reg_out when "00",
                                    row_cnt_reg_out + 1 when "01",
                                    (others => '0') when "10",
                                    (others => '0') when "11",
                                    (others => '-') when others;


тоже не сработало... тоже самое.

проверяю в ЧипСкопе... той машини где была версия 9.1 установлена у меня уже нету...только тот код который там исправно работал использую тут...

как видели синтесайзер еще советовал использовать ИНИТ атрибут... посмотрю тепер стоит ли...или всетаки еще че в кодировании поменять.

а ИНИТ тут описан:
http://www.xilinx.com/itp/xilinx7/books/da...cgd0100_61.html

вобшем покопаюсь еще посмотрю что можно изменить
VladimirB
Цитата(BlackOps @ Aug 10 2010, 10:24) *
ок ну вот фрагмент мультиплексора с регистром:
для управления использую row_cnt_reg_en и row_cnt_inc.
в поле чувствительности процесса автомата управления сигнал row_cnt_reg_out, в зависимости от его значения поднимаю row_cnt_reg_en и ставлю нужное значение на row_cnt_inc
ну а еслиб асинхронщина была то и с версией софта 9.1 проблемы бы были..
п.с. автомат управления работает на том же клоке что и регистры


Вот недавно сами парились с FSM - поведенчески все моделировалось, всё тактировалось одной частотой -
но периодически FSM подвисал в неопределённом состоянии. Галочки в ISE, типа FSM safe implementation "помогали" в виде уменьшения вероятности подвисаний в 2-3 раза. Оказалось, что в одном состоянии из 30 возможных в FSM использовался для ожидания внешний сигнальчик, который был асинхронным. Устранилось всё его синхронизацией.

Поищите - может всё таки и вас чего-нить такое завалялось (или выложите проект или его часть побольше, чтоб другие поискали). А на версию ISE сваливать все грехи неправильно. ИМХО ISE 10.1@SP3 самый стабильный релиз ISE на сегодня. Из новых версий только 11.4-11.5 ещё ничего, но там с EDK какие-то глюки .

З.Ы. Ещё вы ничего про констреинты не упомянули, тип ПЛИС и величину тактовой частоты.


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

синхронизовал..теперь уже все нормально! (как же я его так упустил...)

но всеравно интерестно как ето в версии софта 9.1 СП3 все проходило... видимо настроен там был синтесайзер по другому.

спасибо всем за советы!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.