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

Проблема с машиной состояний

Проблема в том, что отрабатывая циклы, машина повисат. При том что она выполняет одну у туже операцию. Я долго пытался разобраться. И обнаружил вот что:

1) Машина должна сменить состояние по условию и выставить по нему же необходимые сигналы.

2) Сигналы устанавливаются, но перехода не происходит.

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

4) При смене Симплифая, а XST. Всё разаботало. Но После добавления наворотов, опять начала повисать.

 

При этом идеальная модель и ПОСФИТ модель работаю отлично.

 

Подскажите, что это может быть и как с этим бороться.

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


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

Маловато информации, чтобы что-то посоветовать. Входы автомата синхронизируются тем же тактовым сигналом, что и автомат? Вытаскивайте наружу состояния, входы, тактовый сигнал!!! (обязательно) и смотрите. Как правило чудес не бывает и причина обязательно найдется.

 

P.S. Код неплохо бы посмотреть.

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


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

Проблема в том, что отрабатывая циклы, машина повисат. При том что она выполняет одну у туже операцию. Я долго пытался разобраться. И обнаружил вот что:

1) Машина должна сменить состояние по условию и выставить по нему же необходимые сигналы.

2) Сигналы устанавливаются, но перехода не происходит.

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

4) При смене Симплифая, а XST. Всё разаботало. Но После добавления наворотов, опять начала повисать.

 

При этом идеальная модель и ПОСФИТ модель работаю отлично.

 

Подскажите, что это может быть и как с этим бороться.

Если при разных перекомпиляциях машина виснет, ТО:

1. Один из сигналов, который управляет переходом в другое состояние скорее всего асинхронный.

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

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

2. Попытаться считать состояние автомата - убедиться, что это запрещенное.

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

4. Посетить сайт www.sunburstdesign.com/papers взять статью

Coding And Scripting Techniques For FSM Designs With Synthesis-Optimized, Glitch-Free Outputs

 

Удачи!

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


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

Если при разных перекомпиляциях машина виснет, ТО:

1. Один из сигналов, который управляет переходом в другое состояние скорее всего асинхронный.

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

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

2. Попытаться считать состояние автомата - убедиться, что это запрещенное.

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

4. Посетить сайт www.sunburstdesign.com/papers взять статью

Coding And Scripting Techniques For FSM Designs With Synthesis-Optimized, Glitch-Free Outputs

 

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

 

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

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


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

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

 

Золотые слова!!! Была беда с этим - DLL-ка в ПЛИС от плохого клока сначала конвульсировала, пропуская импульсы на выходе, а потом тихо умирала переставая что-либо выдавать вообще. Так что клок нужно смотреть в первую очередь.

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


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

Вытаскивайте наружу состояния, входы, тактовый сигнал!!! (обязательно) и смотрите.

P.S. Код неплохо бы посмотреть.

 

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

 

С кодом позорится не хочу.

 

1. Один из сигналов, который управляет переходом в другое состояние скорее всего асинхронный.

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

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

2. Попытаться считать состояние автомата - убедиться, что это запрещенное.

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

4. Посетить сайт www.sunburstdesign.com/papers взять статью

Coding And Scripting Techniques For FSM Designs With Synthesis-Optimized, Glitch-Free Outputs

 

Удачи!

 

1) Констрейнт есть. Должен успевать добегать, т.к. синтезатор говорит, что в заданную частоту я укладываюсь.

2) Я не говорю что оно запрещенное, мне кажется он просто не переходит. Я не могу все состояния закодировать - ног отладки не хватает.

3) у меня в каждом состояни, где осуществляется условный переход, учитывается что при не выполнении условий, машинавываливаться в начальное состояние.

4)... почитаю.

 

 

Сейчас вообще сказка: У меня условие выставляется (проверенно), а машина переходит не в то состояние. Хотя, условия выполняемого перехода не выполняются. Бьюсь головой об стену - не понимаю.

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


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

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

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

 

1) Констрейнт есть. Должен успевать добегать, т.к. синтезатор говорит, что в заданную частоту я укладываюсь.

Для асинхронного сигнала ограничение по периоду тактового сигнала смысла не имеет. Чтобы смысл появился, необходимо прежде всего все входы привязать к тому клоку, на котором живет автомат (конечный автомат - это по русски машина состояний, а то глаз режет). Вы ведь так и не ответили на вопрос - входы чем тактируются?

 

С кодом позорится не хочу.

...

Сейчас вообще сказка: У меня условие выставляется (проверенно), а машина переходит не в то состояние. Хотя, условия выполняемого перехода не выполняются. Бьюсь головой об стену - не понимаю.

Ну и зря не хотите, позор невелик, не такое видали. А голову поберегите - может пригодиться :biggrin: .

 

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

 

Удачи!

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


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

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

 

С кодом позорится не хочу.

 

Могу еще добавить.

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

Б. последний и самый сильный удар - вспомнить про LOC'и и залочить весь автомат в том состоянии, когда он работает. Тоесть насильно привязать к кристаллу... Если частота не предельная для кристалла и ресурсов хватает - то дальше дело должно пойти проще...

Удачи!

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


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

Б. последний и самый сильный удар - вспомнить про LOC'и и залочить весь автомат в том состоянии, когда он работает. Тоесть насильно привязать к кристаллу... Если частота не предельная для кристалла и ресурсов хватает - то дальше дело должно пойти проще...

 

IMHO совет очень вредный. Если не работает - значит этому есть причина. Не найдя её нельзя быть уверенным в том, что схема все-таки работает после магических заклинаний. Либо код кривой, либо разводка платы кривая, либо спаяно криво, либо синтезатор глючит, либо кристалл битый или перемаркированный. Последние причины начиная с глюков синтезатора встречаются, но редко.

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


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

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

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

 

Как бы ему стразу их ужесточить, без вывода сигналов Ж))

 

1) Констрейнт есть. Должен успевать добегать, т.к. синтезатор говорит, что в заданную частоту я укладываюсь.

Для асинхронного сигнала ограничение по периоду тактового сигнала смысла не имеет. Чтобы смысл появился, необходимо прежде всего все входы привязать к тому клоку, на котором живет автомат (конечный автомат - это по русски машина состояний, а то глаз режет). Вы ведь так и не ответили на вопрос - входы чем тактируются?

 

Весть проект тактируется, только 1 клоком. Входные сигналы все завязаны на клок.

И проблема не в том, что машина пропускает такт... а втом что сигнал установлен, а она висит.

 

С кодом позорится не хочу.

Ну и зря не хотите, позор невелик, не такое видали. А голову поберегите - может пригодиться :biggrin: .

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

 

Удачи!

 

Текст... как-нить выложу. Ща хочу мега систему сделать - разделить автомат на 3 части. Т.к. до этого он по сути делал 3 различный цикла оперций. Сейчас хочу в 3 процесса раскадать. А общие сигналы сделать с з-мя состояниями. Т.к. на выходе они правильно подтянуты.

 

Если получится - и всё заработает может и выкладывать не буду.

 

P.S. ща диплом пишу. не когда этим заниматься.

 

 

Могу еще добавить.

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

 

Можно тут поподробней. Я не знаком с таким. У меня только внешний с кучкей проводов. :biggrin:

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


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

Могу еще добавить.

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

 

Можно тут поподробней. Я не знаком с таким. У меня только внешний с кучкей проводов.

 

У Альтеры и у Ксайлинкса есть встроенные лог анализаторы, которые поставляются вместе с пакетом их софта.

А как это работает (встроенный лог анализатор) - можете посмотреть статьи у меня на сайте.

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


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

У Альтеры и у Ксайлинкса есть встроенные лог анализаторы, которые поставляются вместе с пакетом их софта.

А как это работает (встроенный лог анализатор) - можете посмотреть статьи у меня на сайте.

 

Описание Логического Анализатора (предварительное) - нашел такую статью, оно? Не могу сразу смортреть, т.к. у нас на инетнет машине даже офиса нет.

 

 

 

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

 

process(TSCLK, reset)

begin

 

if TSCLK'event and TSCLK = '1' then

if reset = '0' and reset1 = '0' then

state1 <= reset_state1;

fifo_rd_en_in <= '0';

wr_in <= 'Z';

rd_in <= 'Z';

en_fifo_in <= '0';

HBR_in <= '1';

else

case state1 is

 

when reset_state1 =>

fifo_rd_en_in <= '0';

en_fifo_in <= '0';

wr_in <= 'Z';

rd_in <= 'Z';

 

if empty = '0' and HBG = '1' then

HBR_in <= '1';

state1 <= HBG_state1;

else

HBR_in <= 'Z';

end if;

 

when HBG_state1 =>

 

if HBG = '0' then

wr_in <= '1';

rd_in <= '1';

 

if empty = '0' then

state1 <= start_write;

fifo_rd_en_in <= '1';

en_fifo_in <= '1';

HBR_in <= '0';

else

HBR_in <= '1';

state1 <= reset_state1;

end if;

 

elsif HBG = '1' then

fifo_rd_en_in <= '0';

en_fifo_in <= '0';

wr_in <= 'Z';

rd_in <= 'Z';

HBR_in <= '0';

end if;

 

 

when start_write =>

HBR_in <= '0';

wr_in <= '0';

RD_in <= '1';

fifo_rd_en_in <= '0';

en_fifo_in <= '1';

state1 <= write;

 

when write =>

wr_in <= '1';

rd_in <= '1';

fifo_rd_en_in <= '0';

en_fifo_in <= '1';

HBR_in <= '0';

state1 <= end_write;

 

when end_write =>

wr_in <= '1';

rd_in <= '1';

fifo_rd_en_in <= '0';

en_fifo_in <= '1';

HBR_in <= '1';

state1 <= reset_state1;

 

when others =>

state1 <= reset_state1;

 

end case;

end if;

end if;

end process;

 

Проблемный участок кода выделен жирным. Сегодня я 3 раза пересинтезировал проект и 3 раза получил разный результат - не меня кода... за исключенем, того что выводы на диды поменял местами. :cranky:

 

Что получил, сигнал fifo_rd_en_in <= '1' - не выставляется, хотя машина тут делает переход. Была и другая проблема, когда выставлялся сигнал, но не переходила машина.

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


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

Я бы сделал так:

 
-- Функция переходов автомата
STM_TR : process (STATE1, ...)
begin
  case state1 is
    when reset_state1 =>
      if empty = '0' and HBG = '1' then
        state1_next <= HBG_state1;
      else                        
          state1_next <= reset_state1;
      end if;
    when HBG_state1 =>
      if empty = '0' then
        state1_next <= start_write;
      else
        state1_next <= reset_state1;
      end if;
    when start_write =>
      state1_next <= write;
    when write =>
      state1_next <= end_write;
    when end_write =>
      state1_next <= reset_state1;
    when others =>
      state1_next <= reset_state1;
  end case;    
end process;

-- Функция выходов автомата
STM_OUT : process (STATE1, ...)
begin
  case state1 is
    when reset_state1 =>
      fifo_rd_en_in <= '0';
      en_fifo_in <= '0';
      wr_in <= 'Z';
      rd_in <= 'Z';
      if empty = '0' and HBG = '1' then
        HBR_in <= '1';
      else
        HBR_in <= 'Z';
      end if;
    when HBG_state1 =>
      if HBG = '0' then
        wr_in <= '1';
        rd_in <= '1';
        if empty = '0' then
          fifo_rd_en_in <= '1';
          en_fifo_in <= '1';
          HBR_in <= '0';
        else
          HBR_in <= '1';
        end if;
      elsif HBG = '1' then
        fifo_rd_en_in <= '0';
        en_fifo_in <= '0';
        wr_in <= 'Z';
        rd_in <= 'Z';
        HBR_in <= '0';
      end if;
    when start_write =>
      HBR_in <= '0';
      wr_in <= '0';
      RD_in <= '1';
      fifo_rd_en_in <= '0';
      en_fifo_in <= '1';
    when write =>
      wr_in <= '1';
      rd_in <= '1';
      fifo_rd_en_in <= '0';
      en_fifo_in <= '1';
      HBR_in <= '0';
    when end_write =>
      wr_in <= '1';
      rd_in <= '1';
      fifo_rd_en_in <= '0';
      en_fifo_in <= '1';
      HBR_in <= '1';
  end case;    

end process;

-- Процесс синхронизации
STM_SYNC : process(TSCLK)
begin

  if TSCLK'event and TSCLK = '1' then
    if reset = '0' and reset1 = '0' then
      state1 <= reset_state1;
    else
      state1 <= state1_next;
    end if;
  end if;
end process;

 

Только функцию выходов в виде Case я теперь не оформляю, if-ами короче, просто так проще поправить было. Если нужно какие-то выходы триггерами делать, конечно нужно будет немного еще переделать. И еще - третье состояние не всегда уместно внутри микросхемы применять.

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


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

Только функцию выходов в виде Case я теперь не оформляю, if-ами короче, просто так проще поправить было. Если нужно какие-то выходы триггерами делать, конечно нужно будет немного еще переделать. И еще - третье состояние не всегда уместно внутри микросхемы применять.

 

Собственно вопрос один: Чем это принципиально отличается от того, что написал я?

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

 

Но я попробую Ваш вариант.

 

Сейчас ещё начал глючить второй кусок стэйт машины....

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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