Перейти к содержанию
    

Непонятное поведение Флип-Флопа при синтезе Хилинх версии 10.1

Значит так, кода много будет вставлять объясню так.

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

спасибо

Изменено пользователем BlackOps

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пока не выложите хоть кусок кода никто Вам не поможет. Мое мнение = асинхронщина.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

добавлю/поясню к предыдущему сообщению - нужна схема или описание на HDL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ок ну вот фрагмент мультиплексора с регистром:

 

  -- 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 проблемы бы были..

 

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

Изменено пользователем BlackOps

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Изменено пользователем tema-electric

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

вот уже в логе синтеза обнаружил:

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>.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

 

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

 

-----------------

Ну вот и вылазят догадки :)

Using one-hot encoding for signal <row_cnt_inc>.
Изменено пользователем tema-electric

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот уже в логе синтеза обнаружил:

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) избавиться от этого сообщения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Узнали что не работает с помощью ChipScope? Что показывает временное моделирование? Какой результат в 12 ой версии исе?

вот уже в логе синтеза обнаружил:

и еще ето:

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

попробуйте заменить (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;

Изменено пользователем tema-electric

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

значит так..такое кодирование попробовал:

    -- 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

 

вобшем покопаюсь еще посмотрю что можно изменить

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...