|
Непонятное поведение Флип-Флопа при синтезе Хилинх версии 10.1, Значение сбрасывается раньше времени |
|
|
|
Aug 10 2010, 04:10
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
Значит так, кода много будет вставлять объясню так.
Ест несколько регистров (флип-флопов с Enable) которые контролируются мультиплексорами. Ну и есть автомат управления который всем етим управляет через мультиплексоры, т.е. читает значения выводов регистров, и в зависимости от етих значений переходит в соответствующие положения и изменяет ети регистры..опять таки не напрямую конечноже а через мультиплексоры.
Так вот, когда я все ето дело симуировал, а потом реализовывал на EDK 9.1 то на чипе потом все работало так как хотел.
А теперь, с версией 10.1 у меня какие то странности! А именно:
Есть например один регистр, и автомат управления следит когда его вывод будет равен 768..в етом случае автомат управления должен записать в него 0 через мультиплексор ну и сделать другие определенные действия. Но етого не происxодит! т.к. после того как вывод регистра достигает значения 13 он сбрасывается на 0! Ну и соответственно автомат управления не переходит в нужное состояние которое достигается после значения 768.
Странное явление, и повторю еще раз именно с версией софта Xilinx 10.1 !!
Ест какие соображения?
И еще...регистр етот 10 битовый! И что интересно, у меня еще есть несколько регистров которые примерно так работают..но они не сбрасываются раньше времени и с ними все нормально... а они примерно 5-6 бит... т.е. етот самый длинный как бы.. может сдесь что я недоглядел?... хотя чтоже тут особенного...
спасибо
Сообщение отредактировал BlackOps - Aug 10 2010, 04:14
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Aug 10 2010, 06:24
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
ок ну вот фрагмент мультиплексора с регистром: Код -- 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 - Aug 10 2010, 06:29
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
|
Aug 10 2010, 07:03
|

Местный
  
Группа: Свой
Сообщений: 309
Регистрация: 18-04-08
Из: Томск
Пользователь №: 36 887

|
Может у вас настройки сред разные? Одна соптимизировала, другая нет ... В одной фиттер впихнул ненужное, а в другой не впихнул. Сравните количество ресурсов потребляемое в разных средах в конечном виде и делайте выводы с помощью rtl вьювера схем, или Technology map вьювера. Но второе - это уже жескач конечно.  Ещё как дополнение, если уж совсем всё плохо и не понятно, то можно провести моделирование схемы (rtl) и затем при необходимости конечную (gate level). ПС: хотелось бы увидеть побольше кода. Не совсем понятно, что за типы вы там используете .... вектора std_logic или signed, unsigned. Может ISE арифметику вам по разному синтезировал ...
Сообщение отредактировал tema-electric - Aug 10 2010, 07:20
--------------------
Кто сказал МЯУ?
|
|
|
|
|
Aug 10 2010, 07:33
|

Местный
  
Группа: Свой
Сообщений: 309
Регистрация: 18-04-08
Из: Томск
Пользователь №: 36 887

|
Цитата(BlackOps @ Aug 10 2010, 14:17)  да уж...надо будет может в настройках поковыряться...тока знать бы что именно могло бы быть связано именно с етим... Выше там добавил в месадж  . Увы не знаток ISE. Если найдете разницу в утилзации ресурсов количество регистров/логических ячеек. То смотреть надо на опции синтезатора и фиттера ... И повырубать или повключать всякого рода оптимизации, как они у вас были. Если там всё гуд ... синтезатор с его репликацией логики мог увеличить вам быстродествие ))). Стратегию синтеза ... площадь, скорость, баланс.
--------------------
Кто сказал МЯУ?
|
|
|
|
|
Aug 10 2010, 08:30
|

Местный
  
Группа: Свой
Сообщений: 309
Регистрация: 18-04-08
Из: Томск
Пользователь №: 36 887

|
Цитата(BlackOps @ Aug 10 2010, 14:51)  значит так...а данные простые стд_логик_вектор... ничего особенного....да и кодирую я всегда в таком стиле, поменьше разных заморочек а больше на регистровом уровне... разве что +/- оставляю как есть...а остальное нет.
поетому незнаю почему тут такое дело...ну и как я уже говорил в аналогичном виде у меня и другие регистры работают которые меньше размером...и проблем никаких... да весь код у меня такоы...разве что автомат управления большой который остальными сигналами манипулирует...а в обшем всеми етими парами регистр-мультиплексор управляет только етими двумя сигналами. Отступление: Для 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 - Aug 10 2010, 08:32
--------------------
Кто сказал МЯУ?
|
|
|
|
|
Aug 10 2010, 09:01
|
Злополезный
   
Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188

|
Цитата(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) избавиться от этого сообщения.
|
|
|
|
|
Aug 10 2010, 09:12
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(BlackOps @ Aug 9 2010, 23:10)  Есть например один регистр, и автомат управления следит когда его вывод будет равен 768..в етом случае автомат управления должен записать в него 0 через мультиплексор ну и сделать другие определенные действия. Но етого не происxодит! т.к. после того как вывод регистра достигает значения 13 он сбрасывается на 0! Ну и соответственно автомат управления не переходит в нужное состояние которое достигается после значения 768.
Странное явление, и повторю еще раз именно с версией софта Xilinx 10.1 !! Узнали что не работает с помощью ChipScope? Что показывает временное моделирование? Какой результат в 12 ой версии исе? Цитата(BlackOps @ Aug 10 2010, 03:24)  вот уже в логе синтеза обнаружил: и еще ето: Ничего страшного в этом нет, исе увидел что два бита нужно подать на отдельную логику, из которой нужно сформировать сигнал сброса и входного переноса и изменил кодирование этих двух бит, что бы выиграть в этом месте.
--------------------
|
|
|
|
|
Aug 10 2010, 10:05
|

Местный
  
Группа: Свой
Сообщений: 309
Регистрация: 18-04-08
Из: Томск
Пользователь №: 36 887

|
Цитата(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;
Сообщение отредактировал tema-electric - Aug 10 2010, 10:28
--------------------
Кто сказал МЯУ?
|
|
|
|
|
Aug 10 2010, 19:53
|

Знающий
   
Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121

|
значит так..такое кодирование попробовал: Код -- 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вобшем покопаюсь еще посмотрю что можно изменить
--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|