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

Есть у нас девайс на FPGA, крутятся там FSM-ы, работает он в обсчем. Ну а теперь вот требуется вести лог состояний всех стейт-машин в этом реальном устройстве (в железе всмысле): записывать последние N состояний, вести учёт состояниям FSM ну и так далее. 07.gif По запросу с ПК - считывать эти данные...
1111493779.gif
Для меня это более чем удивительно конечно wacko.gif , но хотелось бы узнать - это вообсче то где то применяется для FPGA? Если да - то где, как, зачем (всё же интересно) и где можно посмотреть правильную реализацию этого самого логирования..
Если нет - то как бы это объяснить красиво, что так не делают ??
Artem_Petrik
Такое полезно разве что при отладке. В этом случаепросто выел регистр state на signal tap, и все. Чтоб постоянно мониторить надо было - не встречал. Впрочем ситуации бывают разные, может и полезно бывает.

Реализовывать, на мой взгляд, проще так же как и в signal tap сделано. Выводим все подлежащие мониторингу сигналы на один из портов двухпортового ОЗУ, формируем сигнал разрешения записи и счетчик адреса. А со второго порта считываем результат, когда надо.
Elresearch
blink.gif Сделать то не сложно (если есть свободные ресурсы в FPGA), если просят, но зачем вопрос открытый wink.gif
Kuzmi4
2 Artem_Petrik - в принципе так и думал сделать для запоминания последних состояний (или скорей всего фифошку поставлю), а вот со счётчиком этих самых состояний как быть ??
2 Elresearch - ну нужно посмотреть на эти состояния вживую людям наверно...

Из ожидаемых последствий, кроме как падение времянки, может быть что-то из разряда подводных камней ??
Elresearch
Цитата(Kuzmi4 @ Sep 23 2009, 17:21) *
а вот со счётчиком этих самых состояний как быть ??

так если на каждом клоке записывать в память зачем Вам счётчик? или Вы хотите соптимизировать и писать только по изменению состояния + счётчик сколько в каком состоянии был клоков?
Kuzmi4
По изменению не получится - нужен именно лог последних N состояний машины (тут фифо видимо) + счётчик сколько раз после ресета стейт-машина была в этом состоянии..
Elresearch
и на какой частоте Вам предлагают это сделать? зная частоту + количество состояний можно оценить какое фифо Вам понадобиться и возможно идея лога себя изживёт wink.gif
Kuzmi4
2 Elresearch - эта идея вообсче мне с самого начала не нравится... А частота тут не при чём - лог пока ожидается как запись при последних N изменений состояний машин (их там несколько - одни постоянны, вторые меняются) в циклический буфер и всё (N -пока задаётся параметром).
Со счётчиками есть идея (сама суть этих счётчиков в оригинале - достоверно писать сколько в каком состянии машина была без задержки) но она мне кажется кривоватой...
Elresearch
Так от частоты и будет зависеть Ваш "счётчик состояния от ресета" сколько разрядов на каждое состояние (а то ведь переполниться и конец достоверности) + кол-во состояний вот Вам и затраты wink.gif
Kuzmi4
Я вас недопонял наверное - пока остановились на 32-х разрядах, сказали что пока хватит им.

Да и реально переходы в состояниях по приходу данных на девайс начинаются, так что им точно для начала хватит (если нулевые стейты повыкидывать или сделать их побольше разрядными)..
Artem_Petrik
Цитата(Kuzmi4 @ Sep 23 2009, 16:21) *
в принципе так и думал сделать для запоминания последних состояний (или скорей всего фифошку поставлю), а вот со счётчиком этих самых состояний как быть ??

Ну, фифо конечно понятие растяжимое, но я все же уточню. Обычное FIFO как бы не рассчитано на то, что будет переполнение, и, обычно, ведет себя в этом случае неподходяще для этого случая.

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

Счетчик состояний - самое простое. Делаем регистр, в который записываем старое значение STATE. Если новое равно старому - счетчик инкрементируется, если не равно - обнуляется. Также, если не равно, инкрементируется указатель записи. Вроде все.
Kuzmi4
И снова здравствуйте biggrin.gif
В обсчем как оно мне не нравилось, а всё таки заваял я этот логер (правда это только логер изменяющихся состояний).
Прицепил
Нажмите для просмотра прикрепленного файла
Кому будет интересно - глянте, интересны мнения laughing.gif
(Обновил чуток: 02 -> 03, теперь вроде всё есть и работает как нужно)
des00
Цитата(Kuzmi4 @ Nov 14 2009, 12:17) *
Кому будет интересно - глянте, интересны мнения laughing.gif


ИМХО кое где сумбурно написано, кое где излишне усложненно и перерасход ресурса и если бы вы были моим подваном за такое описание КА "уши бы я вам пооткрутил" (с) старый мульт. Естественно это все на мой вкус и цвет. smile.gif
Kuzmi4
2 des00 - ну так я и выложил сюда, чтоб послушать мнения laughing.gif
А подетальнее можно - что именно сумбурно, "излишне усложненно "- это где?, чем описание КА страшное, .. ??
des00
Цитата(Kuzmi4 @ Nov 16 2009, 02:40) *
"излишне усложненно "- это где?,


блок wr_logger, логика однократного срабатывания после сброса. Вы городите подобие КА, которое тут ну совершенно не к месту. ИМХО проще сделать так :
Код
if (rst)
  pwr_srl <= 2'b01;
else
  pwr_srl <= (pwr_srl << 1);
..
pwr_on_sig <= pwr_srl[1];


Цитата
чем описание КА страшное, .. ??


кодирование состояний у вас в голове и это цифры, которые нужно помнить и анализировать. Куда нагляднее читать в коде что то вроде STATE_INIT_RAM_CLEAR/STATE_RAM_CLEAR чем мифические 4'd02/4'd03 и т.д.

Цитата
что именно сумбурно


совершенно лишнее использование макросов для задания границ счетчиков, есть ненужный перерасход ресурса и комменты стоят странно, часть фсм полностью расписана вплоть до примитивных действий (что ИМХО не нужно), другая часть вообще не комментирована.
des00
PS. Вспомнил основную причину сумбурности, на мой взгляд, вашего кода. У вас плавает стиль в пределах одного и того же модуля. ИМХО если вы используете какой-либо стиль описания, то придерживайтесь его хотя бы в одном модуле, а то у вас намешано и Паскаль и Кемел и тип с подчеркиваниями %)
Kuzmi4
2 des00 - не понял что есть
Цитата
намешано и Паскаль и Кемел и тип с подчеркиваниями
можете на пальцах объяснить ?
vik0
ЭтоСтильПаскаль
вотЭтоКэмел
а_это_с_подчеркиваниями
iosifk
Цитата(Kuzmi4 @ Sep 23 2009, 16:24) *
.... Ну а теперь вот требуется вести лог состояний всех стейт-машин в этом реальном устройстве (в железе всмысле): записывать последние N состояний, вести учёт состояниям FSM ну и так далее. 07.gif По запросу с ПК - считывать эти данные...
....

Когда то давно я делал аналогичную штуку для шаговой отладки автомата. На хосте делал кнопку "шаг"
, и по получению посылки от этой кнопки разрешал один клок. Если на входе автомата что-то было, то происходил переход в другое состояние...
А логер тоже делал. И статью об этом писал. А вот все вместе, как у Вас - не делал.
Есть еще такая возможность - делать сигнатуры. Допустим, Вам надо отследить, попадает ли автомат в какое -либо состояние. Так вот в том состоянии автомат должен чем то себя проиндицировать или сохранить об этом информацию... Если процесс циклический, то можно перебирать отслеживаемое состояние одно за другим...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.