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

Проблема с CPLD

Здравствуйте.

С FPGA и CPLD дело имею уже достаточно времени, но выполняя казалось бы легкую задачу, столкнулся с проблемой. Обо всем по порядку.

Небольшое описание схемы. CoolRunner CPLD, XC2C64A. 8 выходов, которые подают на другую платку выходной код. 3 управляющих входа, от которых зависит выходной код. На выходе стоят светодиоды для проверки правильности кода. На еще один вход заведена кнопка, чтобы проверять этот код (предполагалось , как альтернативная тактовая). На платку заводится синус, который подается на преобразователь синус-прямоугольник, а оттуда на вход основной тактовой. Сброса нет! Думаю, это самое важное.

Задача. Выдавать на выход необходимый код, 16 состояний(после последнего состояния возврат к первому), в зависимости от управляющих входов.

Написал быстренько код на верилоге, промоделировал - все вроде как работает.

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

Не понимаю в чем дело. На выходе преобразователя, который формирует тактовую, по умолчанию идет 2,4В . Игрался с IOSTANDART - ничего не помогает. Ощущение, что проблема в отсутствии сброса, как такового. Пробовал сброс от кнопки, подавая синус, но проблема все равно присутствует.

Может кто подскажет в чем дело?

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

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


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

Полагаю, что у вас есть дизайне некоторый конечный автомат. И похоже на то, что этот автомат по какой-то причине переходит в запрещённое состояние и зависает в нём. Входы в вашей схеме асинхронные. Тут и метастабильность может быть, и гонки.

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

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


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

Тактовую частоту после преобразователя осциллографом посмотрите. Предполагаю, там есть звон на фронтах и срезах.

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


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

Может кто подскажет в чем дело?

Отлажен ли код в симуляторе при помощи тестбенча?

Без тестирования, даже самая простая казалось бы задача, может стать тяжелым адом :)

Игнорирование анализа таймингов тоже может "помочь" в умножении страданий.

Хорошо бы код приложить, он ведь простой и не содержит чего-то секретного?

 

промоделировал - все вроде как работает

Не увидел сразу, код тестбенча тоже желателен.

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


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

Так-же хочу обратить внимание, что даже отлаженный в симуляторе код не даёт гарантии работоспособности схемы, поскольку не все проблемы можно выявить на этапе симуляции. Например, неправильное пересечение клоковых доменов (в том числе и приём асинхронных сигналов), на сколько мне известно, никакими симуляторами не моделируется. Да и правильная организация асинхронного сброса (если он присутствует) так-же остаётся на совести разработчика, и опять-же тут симулятор вряд-ли поможет. Хотя Quartus, если покопаться в его настройках, может выдавать предупреждения, но проверка там так себе.

Изменено пользователем Flip-fl0p

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


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

Спасибо всем за ответы. Все сигналы до преобразователя и после , естественно, проверял. Тестбенч простой был - просто, чтобы убедиться, что автомат заводится и выдает на выходы необходимые значения. Проблема была в начальных состояниях выходного регистра. Сам код на верилоге - always блок, с автоматом состояний. initial блоком вначале напрямую задавал стартовое значение выходного регистра. Но потом изменил на сброс с помощью флага, т.е. его стартовое значение в initial блоке задал равным 1, а уже в always блоке при флаге равном 1 сбрасывал как регистр состояний, так и выходной, заодно там же этот флаг сбрасывал. После этого Зависания ушли. Все стало работать, как надо.

Я не гуру. Поэтому может быть и неправильно сделал, но работает. Если сделал неправильно, готов получить ...совет, как правильно :maniac:

До этого просто не работал с логикой без внешней линии сброса. Теперь будет маленький, но опыт :biggrin:

 

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


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

Поэтому может быть и неправильно сделал, но работает. Если сделал неправильно, готов получить ...совет, как правильно :maniac:

До этого просто не работал с логикой без внешней линии сброса. Теперь будет маленький, но опыт :biggrin:

Чтобы сделать вывод о правильности описания схемы необходимо для начала увидеть это описание схемы. Иначе все советы как делать правильно будут лишь общими советами, без указания конкретной ошибки, если такова присутствует.

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


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

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

 

 

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

 

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

 

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

 

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

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

 

 

 

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


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

Я не гуру
А я не-телепат, приятно познакомиться :)

Не стесняйтесь, выкладывайте код и тестбенч, в первом же моем сообщении просил, все его смогут посмотреть, может сразу будет видно что не так было, и действительно сейчас проблема ушла, либо просто повезло что она перестала проявляться? Просто не хорошо завершать тему "да там всё просто было, ерунда", ведь кто-то другой наткнется на такой финал и пожелает Вам доброго здравия :)

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


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

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

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

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

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

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

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

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

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

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