реклама на сайте
подробности

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


Знающий
****

Группа: Свой
Сообщений: 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


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
andrewkrot
сообщение Aug 10 2010, 05:54
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 306
Регистрация: 11-11-04
Из: Москва
Пользователь №: 1 106



Пока не выложите хоть кусок кода никто Вам не поможет. Мое мнение = асинхронщина.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 10 2010, 06:02
Сообщение #3


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



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


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Aug 10 2010, 06:24
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 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


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
andrewkrot
сообщение Aug 10 2010, 07:00
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 306
Регистрация: 11-11-04
Из: Москва
Пользователь №: 1 106



А что в качестве клока используете?
Go to the top of the page
 
+Quote Post
tema-electric
сообщение Aug 10 2010, 07:03
Сообщение #6


Местный
***

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



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

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

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

Сообщение отредактировал tema-electric - Aug 10 2010, 07:20


--------------------
Кто сказал МЯУ?
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Aug 10 2010, 07:17
Сообщение #7


Знающий
****

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




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

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


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
tema-electric
сообщение Aug 10 2010, 07:33
Сообщение #8


Местный
***

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



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


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


--------------------
Кто сказал МЯУ?
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Aug 10 2010, 08:24
Сообщение #9


Знающий
****

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



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

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

вот уже в логе синтеза обнаружил:
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>.


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
tema-electric
сообщение Aug 10 2010, 08:30
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 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.

-----------------
Ну вот и вылазят догадки smile.gif
Цитата
Using one-hot encoding for signal <row_cnt_inc>.


Сообщение отредактировал tema-electric - Aug 10 2010, 08:32


--------------------
Кто сказал МЯУ?
Go to the top of the page
 
+Quote Post
Boris_TS
сообщение Aug 10 2010, 09:01
Сообщение #11


Злополезный
****

Группа: Свой
Сообщений: 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) избавиться от этого сообщения.
Go to the top of the page
 
+Quote Post
des00
сообщение Aug 10 2010, 09:12
Сообщение #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) *
вот уже в логе синтеза обнаружил:
и еще ето:

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


--------------------
Go to the top of the page
 
+Quote Post
tema-electric
сообщение Aug 10 2010, 10:05
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 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


--------------------
Кто сказал МЯУ?
Go to the top of the page
 
+Quote Post
Boris_TS
сообщение Aug 10 2010, 10:15
Сообщение #14


Злополезный
****

Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188



Цитата(tema-electric @ Aug 10 2010, 14:05) *
А на сколько правомерна такая замена? std_logic кодируется не только по 0 и 1. У него 9 значений. И все остальные получатся неопределенными.

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

Для моделирования замена не равнозначная (тут, по идеи, на others надо ловушки вешать, явно описав все правильные состояния),.. а вот для синтеза - полностью эквивалентная. (Вообще-то для case'ов я использовал перечисляемые типы, и соответственно явно указывал все возможные комбинации. Если же вместо одной из комбинация написать others, то появляется сей неприятный XST Info.)
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Aug 10 2010, 19:53
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 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

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


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01496 секунд с 7
ELECTRONIX ©2004-2016