Время распространения сигнала в ПЛИС

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

Добрый день.
Решил после контроллеров и микропроцессоров заняться ПЛИС, купил отладочную плату Nexys 2 с ксилинксовским спартаном, начал эксперементировать на VHDL.
Не могли бы вы прояснить один вопрос?
Грубо говоря, сколько действует событие risng_edge(...)? Сейчас поясню, что я имею в виду.

Предположим, у нас есть два блока, соединенных проводником. Оба тактируются от глобального тактового сигнала CLK (будем считать что он разведен правильно, через глоб. буферы, и к обоим блокам поступает без перекоса фазы).
Первый блок в process(CLK), допустим, выставляет некоторый бит информации на свой выходной if rising_edge(CLK).
Второй же, также в process(CLK) и if rising_edge(CLK) берет со входа эту инфу и как-то обрабатывает.
Как гарантировать правильное функционирование этой схемы? Ведь когда начинает нарастать напряжение на CLK, в какой-то момент оно начинает удовлетворять условию risng_edge(), а т.к. клок одинаков для всех блоков, они одновременно и сработают - но валидные данные-то поступят на вход второго блока только после dT1+dT2, где dT1 - время прохождения сигнала через блок 1, а dT2 время распространения от первого до второго блока!
Пусть даже не будем учитывать dT2, считая, что по проводникам сигнал пройдет очень быстро, но dT1 зависит только от структуры первого блока. Может быть такое dT1, что к тому моменту, как сигнал вычислится и выставится на выход, во втором блоке условие rising_edge() уже пройдет? Как правильно проектировать, чтобы избежать таких проблем?


Я смотрел пример, 8битный риск процессор на VHDL - меня очень интересовал блок регистров и АЛУ, а именно операции вида ADDI, допустим - "регистр R <= регистр R + I".
То есть необходимо из регистра подать значение на сумматор, вычислить результат, как-то его защелкнуть на выходе АЛУ, подать его на регистр, защелкнуть там.
Я-то думал что это сделано благодаря сдвинутым по фазе клоковым сигналам, когда по
rising_edge(CLK), допустим, энейблится выход регистра и АЛУ, а по rising_edge(CLK90) регистр отрубается от шины и в него защелкивается новое значение.
Но в примере не было сдвинутых по фазам клоков, поэтому я не очень понял, как они гарантируют, что все устройства будут работать именно с такими задержками.

Буду очень благодарен за помощь.
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Обычно (!!!), схемы для FPGA и CPLD разрабатывают как синхронные. Не рассматриваем случаи когда надо простую логику (и/или/не и прочее) в какой-то комбинации сделать.
Сдвиг фаз это уже или высший пилотаж или такое же извращение (на вкус и цвет... :) ).
Т.е. все действия/вычисления стартуют по фронту (пусть положительному), а остальное время отдаётся на выполнение и распространение сигнала.
То что вы описали про АЛУ допускает два варианта. Первый, по фронту запускаются все вычисления и к следующему фронту готов результат. Второй, это то что называют pipe или этапами (есть и др. названия). Например, если этапов 5 (они идут друг за другом и тактуются от одного источника, то результат будет получен через 5 тактов.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

Kavka писал(а): Т.е. все действия/вычисления стартуют по фронту (пусть положительному), а остальное время отдаётся на выполнение и распространение сигнала.
Но как же быть с тем что во втором блоке, допустим, написано следующее:
process(CLK, in1, in2)
begin
if rising_edge(CLK) then
out<=in1 and in2;
end if;
end procecc;

Ведь если и первый и второй блок стартанут вычисления по фронту, а в первом блоке, допустим, стоит умножитель (или любой другой элемент, который может внести серьезную задержку в распространение сигнала), то не получится ли так, что процесс второго блока успеет завершится, взяв какие-то левые значения с in1, in2, до того как первый блок закончит вычисления и обновит значения этих сигналов?
Друг Кота
Аватара пользователя
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Сообщение ELcat »

У Xilinx ICE`a вроде как нету симуляции с таймингами, тоесть модель рассматривается как идеальная. А вот у Altera`вского Квартуса такое удобство имеется. Может поищи примеры в квартусе и типа по образу и подобию...
Реклама
Эиком - электронные компоненты и радиодетали
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

ELcat, спасибо.
То есть, проблема вполне актуальна, я так понимаю. (Просто уже начали закрадываться мысли о секретной ксилинксовской джедайской технике, благодаря которой синтезатор сие как то сам разрешает =) )
Вы не скажете тогда, насколько грамотно решение со сдвигом фаз? То есть при необходимости тактировать от CLK + CLK90 + CLK180 - благо на кристалле есть аппаратное средство для получения таких тактовых сигналов. И, допустим, один этап вычислений выполнять по фронту CLK, второй по фронту CLK90, третий по фронту CLK180.
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Может вам вот это обсуждение поможет обрести ответ :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Сообщение ELcat »

Я тут могу только поделиться своим горьким опытом. Как-то в одном проектике я попытался соорудить линию задержки фронта на последовательной цепочке инверторов (такое видел люди делали в квартусе как пример и у них работало) для формирователя короткого импульса что-то типа одновибратора. Но не тут-то было. Шибко грамотная хилинсовская среда их скомпилировала "по грамотному" - просто посчитала видать количество инверсий и удалила "лишнее" :) вобщем нихрена не заработало, пришлось делать по другому на триггере.
Ra
Прорезались зубы
Сообщения: 231
Зарегистрирован: Сб май 19, 2007 18:39:33
Откуда: Москва

Сообщение Ra »

Большое всем спасибо, я в общем понял что сначала не совсем правильно подходил к программированию ПЛИС, по-прежнему мысля как в программировании контроллеров/микропроцессоров. Вроде сейчас более-менее разобрался и даже написал знакосинтезатор и вывод текста на VGA)
Друг Кота
Аватара пользователя
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Сообщение ELcat »

А какой чипсет мучаешь, если не секрет?
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»