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

Начальные значения

Правильно ли выполнена синхронизация? Вроде нет ошибок, сделал по книжке.

 

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

 

А вот второй вопрос правильно ли я использую синхронный ресет? Должен ли я его применять через if?

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

 

И я бы не стал ставить ключ на клок. Лучше применить асинхронный резет глобально, но не вставлять в глобальные клоковые пути лишние коммутаторы. В некоторых ПЛИС они есть предразведенные, например DCS в латисе, но много где и нету. Да и синтезатор не догадается поставить на этот ключ специально придуманный для этого блок.

 

И ещё как бы вопрос по использованию else в коде. Когда его надо применять а когда нет?

 

ну так просто подумайте...

 

если написать

 

if (a) b<=c;

else b<=d;

 

то это будет аналогом

 

begin

b<=d;

if (a) b<=c;

end

 

а вот такое - это чистое b<=d; так как чтобы там в if не было, потом безусловно заменяется на d

 

begin

if (a) b<=c;

b<=d;

end

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


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

У Альтеры тоже без проблем осциллятор, мегафункция ALTINT_OSC.

А где её найти? Я на Циклоне 4 сижу, под Квартусом 9.1, чёта нету такой.

 

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


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

Вы не поверите как влияет отсутствие интернета на продуктивность работы.

 

Проектировать надо систему. Опираясь на те или иные возможности кристаллов.

Если рассматривать FPGA фирмы Альтера, будем считать что связка FPGA - загрузочное ПЗУ нареканий не вызывает.

По включению питания имеем интервал времени до перехода кристалла в пользовательский режим (интервал конфигурации и инициализации)

Причем при использовании N кристаллов на плате, предусмотрена возможность перехода в пользовательский режим этих кристаллов одновременно.

Дополнительно в FPGA регистры устанавливаются в 0, что позволяет синтезатору устанавливать любое значение по умолчанию (инверсия на входе

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

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

oe_sg8002 = init_done && config_done

power_up.v

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


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

А где её найти? Я на Циклоне 4 сижу, под Квартусом 9.1, чёта нету такой.

В более свежем квартусе, видимо...

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


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

а я на входе клока поставил клоковый буфер с выключателем, прям компонентом готовым, и ура:) ...

 

мне вот такие конструкции

begin
b<=d;
if (a) b<=c;
end

 

очень не нравятся, получается в b надо и d запихать и c, если случилось а. Не логично как-то. Мне кажется их вообще надо считать недопустимыми. В любом случае для читаемости, я через else это напишу.

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


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

Мне кажется их вообще надо считать недопустимыми.

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

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


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

А стандарту так не кажется.

 

стандарт - разработчик вашей школы, для него кажется недопустимо:)... но это мне не мешает:)))...

 

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

 

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


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

только с точки зрения читабельности и понимабельности...

 

К читабельности это отношения особо не имеет. Описания разных схем читаются лучше в разных написаниях. Бывает такая завернутая многоуровневая логика, которая на else выглядит крайне запутано, а раскрытая в последовательно стоящие куски становится очень даже понятной и красивой. Просто язык (а значит, и стандарт) знать надо, и будет все хорошо читабельно.

 

Я не говорю уже о длинных логических конструкциях, строящихся в циклах for или generate for, как например всякие там арбитры с круговыми динамическими приоритетами.

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


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

Хорошая получилась беседа, классическая прям Знайки с Незнайкой, как в книге "телевидение? это очень просто!" :rolleyes:

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


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

Я тут покумекал немного и теперь предлагаю решение всех проблем. ))

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

Чтобы не замыливать суть, язык не используем, рисуем графикой.

post-78485-1392217264_thumb.jpg

И так, что мы имеем на генераторе, если он не вышел на режим?

Имеем нестабильную амплитуду и нестабильную частоту. Как это будет выглядеть в ПЛИСе? Я так полагаю, что-то вроде коротких и частых пичков и/или метастабильность.

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

Задача этой конструкции сформировать импульс вменяемой длительности, если входящий пичёк слишком короткий - триггер не среагирует, если достаточный, то триггер даст импульс.

Чтобы избежать возможных метастабильностей ставим вторую такую ступень "inst2". Сразу вопрос: обязательно ли метастабильность давить триггерами, или можно несколькими в подряд инверторами?

Сформированного импульса должно хватить для перекидывания Т-триггера "inst3", выход этого триггера является тактовым сигналом для счётчика. Счётчик у меня 3-х разрядный, в реальности понятное дело, время работы счётчика должно превышать время выхода генератора на режим Т.к. импульсы от Д-триггера "inst2" могут идти достаточно часто, то и Т-триггер "inst3" будет переключатся быстро, от чего счётчик может забарахлить. Если так, то ставим ещё один Т-триггер (на схеме отсутствует), на Т-вход - единицу, на СLK-вход - выход "inst3", таким образом поделим частоту в 2 раза. Понятное дело частота не ахти какая, но всё таки должна быть сносной для работы счётчика.

Счётчик отсчитав от нуля в верх нужное кол-во тактов блокирует сам себя, "открывая" элемент "И", на который к этому времени будет поступать уже стабильная частота.

Точно не уверен, но скорее всего элемент "И" "откроется" не синхронно с тактовой частотой, а раз так, то нужен сигнал сброса, его обеспечивает батарея Д-триггеров. На ногу VCC подаём питание, она же лог 1. Если на Д-вход триггера просто посадить константу, то Квартус - собака его сминимизирует, потому подаём константу из вне. Эта батарея Д-триггеров давит возможную метастабильность и даёт 2-3 такта синхронного сброса.

Понятно что схема собрана со всеми мыслимыми и немыслимыми нарушениями норм, но, я думаю, это ни на что не должно влиять.

Проект делал для первого Циклона под Квартусом 9.1 Веб, прикрепил.

 

Ну как-то так. Жду критики. ))

TestCLK.rar

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


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

Я тут покумекал немного и теперь предлагаю решение всех проблем. ))

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

 

Решение всех проблем тут совершенно другое - как минимум, отпинать, как максимум, убить, схемотехника, который эту систему делал. Но, если уж такая ситуация бы получилась в реальной жизни, я бы, наверное, сделал бы кольцевой генератор внутри ПЛИС, он гарантировано стартует со своей частоты, и от него бы сделал задержку старта.

 

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

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


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

 

подключив его к 1 схеме, ваш автомат ресетнется после старта, придет в начальное состояние, и через 16 клоков пойдет молотить.

 

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

много нового добавите к опыту

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


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

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

много нового добавите к опыту

 

поподробнее бы, и опыт был бы раньше

 

Решение всех проблем тут совершенно другое - как минимум, отпинать, как максимум, убить, схемотехника, который эту систему делал. Но, если уж такая ситуация бы получилась в реальной жизни, я бы, наверное, сделал бы кольцевой генератор внутри ПЛИС, он гарантировано стартует со своей частоты, и от него бы сделал задержку старта.

 

 

кольцевой генератор это 2 инвертора друг за другом?

 

 

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

 

и код грея еще сверху на все это для надежности через счетчик

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


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

кольцевой генератор это 2 инвертора друг за другом?

В терминологии FPGA - сколько-то LUT, соединенных последовательно, а выход последнего заведен на вход первого, которые, вместе взятые, представляет собой инвертор.

 

А 2 инвертора подряд это буфер, если его закольцевать, будет триггер шмитта.

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


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

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

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


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

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

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

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

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

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

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

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

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

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