Jump to content

    

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

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

 

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

 

А вот второй вопрос правильно ли я использую синхронный ресет? Должен ли я его применять через 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

Share this post


Link to post
Share on other sites
У Альтеры тоже без проблем осциллятор, мегафункция ALTINT_OSC.

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

 

Share this post


Link to post
Share on other sites
Вы не поверите как влияет отсутствие интернета на продуктивность работы.

 

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

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

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

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

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

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

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

oe_sg8002 = init_done && config_done

power_up.v

Share this post


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

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

Share this post


Link to post
Share on other sites

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

 

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

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

 

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

Share this post


Link to post
Share on other sites
Мне кажется их вообще надо считать недопустимыми.

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

Share this post


Link to post
Share on other sites
А стандарту так не кажется.

 

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

 

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

 

Share this post


Link to post
Share on other sites
только с точки зрения читабельности и понимабельности...

 

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

post-78485-1392217264_thumb.jpg

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

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

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

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

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

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

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

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

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

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

 

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

TestCLK.rar

Share this post


Link to post
Share on other sites
Я тут покумекал немного и теперь предлагаю решение всех проблем. ))

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

 

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

 

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

Share this post


Link to post
Share on other sites

 

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

 

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

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

Share this post


Link to post
Share on other sites
а попробовали бы такое сделать в мичети для актела (проазик, да и все остальное)

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

 

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

 

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

 

 

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

 

 

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

 

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

Share this post


Link to post
Share on other sites
кольцевой генератор это 2 инвертора друг за другом?

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this