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

Инициализация синалов. VHDL

В данном частном случае можно сделать инициализацию под дефайном, т.е. если код для синтеза, то инициализацию не делать, если для симулятора - то делать. В верилоге это что-то вроде `ifndef SYNTHESIS, при этом дефайн SYNTHESIS глобальный, что позволяет легко переключать весь проект между синтезируемым и симулируемым. Как в VHDL такое делается, я не помню..

К сожалению, и я не знаю, и коллеги.

 

вот нет что бы использовать vcom/vlog +initreg+0 и vsim +initreg+0 всякие ресеты вводят, логику раздувающие ....

vlog +initreg+0 и vsim +initreg+0 - такое есть. А вот для VHDL к сожалению нет ничего похожего(ну или я не нашёл, хоть и искал).

 

В частности, если у регистра сдвига явно прописан сигнал сброса, то синтезатор не сможет имплементировать этот регистр в примитиве "SLICEM SRL Shift Register" и сделает все на FFs. /См. UG474, page 50/

 

Точно так же, если двух-/одно-портовая память реализована с использованием templates и у регистра порта адреса явно прописан сигнал сброса, то синтезатор не сможет имплементировать эту память в примитиве BRAM.

Это, ИМХО, больше смахивает на "костыли". На то есть атрибуты синтеза.

 

SIGNAL zzz_OOUT : std_logic:='0';

чем так плохо объявлять сигнал?

Отвечу за себя: исторически сложилось, что старался нигде не использовать начальную инициализацию. И чтобы разом изменить идеологию надо нечто большее, чем особенности работы одной конкретной софтины(в частности Моделсим).

На данный же момент объективных причин не использовать инициализацию я не вижу - FPGA её поддерживают, не используя при этом дополнительные ресурсы. Видимо придётся всё же использовать. :(

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


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

Слышал, что для ASIC эта фишка не сработает. Но так как не программировал, то не знаю.

про ASIC речь в вопросе не шла. кстати тоже точно не знаю что там происходит.

в Xilinx всегда была возможность задать начальное значение триггера. в схемном редакторе - через атрибуты, вроде init обзывался, точнее не скажу, время схемного ввода давно ушло =)

на VHDL - способом указанным мной выше.

более того, я этот способ честно украл позаимствовал у самого Xilinx. там так все примитивы где-то в шаблонах были описаны. соответственно и на симуляции никаких ХХХ не появляется никогда.

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

 

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

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


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

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

Перенос шаблонов С на verilog/VHDL приводит к неприятным ошибкам.

 

позаимствовал у самого Xilinx

Практика показывает, что вендорский код далёк от идеального. Я сейчас говорю не о конкретно этом примере (странно, что вопрос об инициализации вызвал такое обсуждение), а вообще. Кривые конструкции встречаются как в rtl так и в C исходниках. Sad but true.

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


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

В частности, если у регистра сдвига явно прописан сигнал сброса, то синтезатор не сможет имплементировать этот регистр в примитиве "SLICEM SRL Shift Register" и сделает все на FFs
А сдвиговые регистры вообще не нуждаются в сбросе )) Они и так выплюнут всю грязь со временем.

 

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


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

А сдвиговые регистры вообще не нуждаются в сбросе )) Они и так выплюнут всю грязь со временем.

Они не "выплюнут всю грязь со временем", если всегда сдвигать на длину сдвигового регистра

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


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

А сдвиговые регистры вообще не нуждаются в сбросе )) Они и так выплюнут всю грязь со временем.

Если они не циклические.

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


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

Ну в таком случае они нуждаются в сбросе, и на SRL их не реализовать при всём желании )))

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


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

Ну в таком случае они нуждаются в сбросе, и на SRL их не реализовать при всём желании )))

почему, например в ПСП частые сбросы бывают вредны - serjj привел пример ПСП генератора

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


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

почему, например в ПСП частые сбросы бывают вредны

Ну дык. Надо всё в меру. Если генератор free-run, то сбрасывать его только в самом начале, если он используется для генерации длинных преамбул, то сбрасывать его нужно перед каждой посылкой (per frame).

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


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

Просто я за эту цитату зацепился:

В частности, если у регистра сдвига явно прописан сигнал сброса, то синтезатор не сможет имплементировать этот регистр в примитиве "SLICEM SRL Shift Register" и сделает все на FFs.

Получается, для LFSR, действительно, сброс по включению нужен. А дальше не нужен. Его можно реализовать и на SRL, но явный сброс прописывать нельзя в силу вышеприведённой цитаты. Поэтому и поможет инициализация.

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


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

Инициализация нужна всегда, если в схеме или алгоритме есть обратная связь.

Тот же счетчик: это сумматор с регистром и обратной связью. Если не инициализировать,

то его состояние в данный момент - непредсказуемо, т.е. "Х".

Схема SRL16 построена вокруг LUT и поэтому может быть инициализирована из

файла прошивки типа:

signal SRL_Vect: std_logic_vector(0 to 15):=x"ABCD";

и SRL16 тоже не будет работать предсказуемо,

если будут обратные связи, но не будет инициализации,

например, в схеме LSFR.

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


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

Ну я примерно про это и хотел сказать постом выше. Вопрос был, в частности, зло или не зло инициализация без сброса. Пришли к выводу, что с точки зрения оптимальной реализации (когда надо сделать на SRL) сброс должен отсутствовать. Но для реализации некоторых схем (LFSR) задавать начальное состояние всё же надо. Остаётся только инициализация.

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


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

1. Под какой кристалл пишите?

Xilinx, Altera... или вообще ASIC. Наприм., Xilinx гарантирует при заливке конфигурации 0-ые значения регистров. Надо читать рекомендации вендора.

 

2. Какие конструкции поддерживает синтезатор?

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

Тут варианты прямо в коде писать инициализировать или через атрибуты (наприм. init для Xilinx).

 

3. А важна ли инициализация для Вашей модели вообще (собственно этот вопрос должен быть первым)?

Тут уже накидали разные примеры.

 

4. Всегда можно инициализацию провести в автомате (универсально... да, ресурсы съест).

 

5. Что делать в моделировании?

Есть ключики которые выставляют нужные значения.

 

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


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

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

 

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

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


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

В тему читал отчеты НАСА под названием "наши уроки", они в открытом доступе лень ссылку искать.

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

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

Вывод "программист не виноват". Комиссия пришла к решению "написать инструкцию согласно которой порты FPGA должны быть проинициализированы".

Наши уроки... :)

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


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

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

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

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

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

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

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

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

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

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