oval
Свой-
Постов
260 -
Зарегистрирован
-
Посещение
Весь контент oval
-
Вопрос по Verilog'у
oval опубликовал тема в Языки проектирования на ПЛИС (FPGA)
Господа, знатоки Verilog'а, подскажите или посоветуйте, где прочитать, что означает вот такая конструкция на Verilog'е: `ifdef M pcke <= repeat (1) @(negedge pclk) cke; `else #0 pcke = cke; `endif В особенности интересно вот это: #0 pcke = cke; Есть ли эквивалентная конструкция? Заранее спасибо -
Если Вы устанавливали полный пакет (дистрибутив allproducts.exe), то исходники библиотеки syncad_vhdl_lib должны лежать в каталоге \lib\vhdl и \lib\verilog для VHDL и Verilog соответственно. Просто нужно создать эту библиотеку и откомпилировать с этих исходников. Кстати, если не изменяет память, в TestBencher'е где-то была даже кнопка "Compile TestBencher libraries" (или подобная), которая делала все автоматически. Разумеется, прежде надо настроить TestBencher на работу с ModelSim. Удачи.
-
Плата захвата
oval ответил Vincent Vega тема в Работаем с ПЛИС, области применения, выбор
Вот какие варианты решения задачи пришли в голову: 1. Если требуется все реализовать на опорной частоте входного потока (т. е. 50МГц), тогда ставим два микросхемы SDRAM. Поочередно пишем то в одну, то в другую. Пока в одну пишем, другую регенерируем и наоборот. При этом не обязательно переключаться на другую микросхему после записи одной страницы. Главное здесь не превысить максимально допустимое время между последовательными регенерациями. Например, можем писать в одну до истечения максимально допустимого времени между циклами регенерации, параллельно циклически (непрерывно) производим полную регенерацию (всех строк всех банков) другой микросхемы. Еще лучше: делим максимально допустимый период регенерации для данного типа микросхемы (часто 64ms) на общее количество строк в микросхеме. Получаем время, через которое будем переключать между микросхемами и выполнять команду регенерации. Т. е. цикл доступа к одной микросхеме будет состоять из (к примеру): открываем все банки, последовательно пишем данные (в разные банки и разные строки), далее закрытие всех банков (PrechargeAll), далее команда регенерации (AutoRefresh). Смена микросхемы происходит перед закрытием всех банков текущей микросхемы. Вообщем, управление микросхемами осуществляется с наложением команд. Параллельно с принятием потока, можно умудряться еще и читать из микросхемы, в которую в данный момент не идет запись входного потока (разумеется, каналы управления и данных микросхем разделены). Схема хороша с точки зрения экономии энергии и не требует никаких буферов FIFO. Кстати, пока микросхема не используется ее можно еще и в SelfRefresh загнать. Данные храняться и энергия экономиться. 2. Если использовать одну микросхему, то придется поднимать тактовую частоту и ставить буфера FIFO. Проще сделать 100МГц и синхронно к опорной, тогда не придется мудрить с полностью асинхронными буферами FIFO. Можно найти и время для параллельного чтения, но потребуется механизм арбитража. Сложность управления памятью соответственно возрастет. Потребление схемы будет выше. Вот. Удачи. -
Идею понял, но каким образом она увеличивает стабильность схемы (т. е. параметр MTBF (Mean Time Between Failures)) так и не понял. Переключение то выхода триггера Q0 попрежнему остается асинхронным по отношению к clk. Следовательно, Q1 может оказаться в метастабильном состоянии с не меньшей вероятностью, чем если просто подать сигнал ND на вход Q1. Вообщем, такое решение встречаю впервые. Думаю триггер Q0 здесь не несет никакой полезной функции, поскольку его выход попрежнему остается асинхронным по отношению к clk. Допустим, сигнал ND формируется где-то в другом тактовом домене, через сколько бы последовательных триггеров того тактового домена он не проходил (хоть даже через несколько разных асинхронных по отношению к clk) "синхроннее" к clk он не станет. Заменяем тактирование триггера Q0 на clk и подаем ND на его вход, вот стандартная (правда одноуровневая) схема синхронизации, которая приводится во всех документах, которые я видел по данной теме. Таким образом, Q0 синхронизирует появление метастабильного состояния по отношению к clk. Для относительно малых частот одного уровня синхронизации (т. е. триггера Q0)достаточно, для больших частот может потребоваться еще один уровень синхронизации. Все зависит от характеристик технологии (от параментра времени нахождения триггера в метастабильном состоянии). Вот что на этот счет когда-то писала Altera: an042.pdf
-
А как тогда работают все Xilinx'овы модели компонентов BlockRAM и основанных на них (FIFO, etc)? Содержимое памяти --- это динамический список, переменные, его описывающие (не shared), декларированы в процессе. <{POST_SNAPBACK}> Вы правы. Я специально проверил (написал тест). Действительно, присвоение начального значения переменной происходит только в цикле инициализации моделирования. Историю присвоения значений переменной нельзя посмотреть, т. к. эти присвоения происходят последовательно в одно и то же модельное время. Но для описания синтезируемых моделей я бы не рекомендовал стиль описания с использованием переменных таким образом. Типовые шаблоны описания схем обычно всегда приводятся в документации к средствам синтеза. Я бы придерживался их. PS: забыл, бывает, давно это было, всех деталей не упомнишь. Спасибо за поправку.
-
Насчет схемы от makc, я не совсем понял идею, поэтому никаких выводов делать не буду. По поводу своей, как только период тактового сигнала станет меньше, чем минимальный допустимый период (т. е. то, что было 113МГц), то логика работы схемы нарушиться, и это правильно. Речь идет о временном моделировании естественно. Для логического все равно. Все равно, я не понял идею. Мне не понятна функция триггера Q0. Насчет включения, я так и предполагал. Элементов больше, доменов два, толку ноль, но может я чего-то не понимаю. PS: Если длительность импульса на ND меньше одного периода clk, то схема может его и не заметить.
-
Ничего подобного. Переменная существует всегда. Да, возможно, с точки зрения выделения памяти и других внутренних особенностей системы моделирования она и существует всегда, но с точки зрения VHDL и цикла моделирования она уничтожается и создается вновь. Это очень важный момент, его необходимо четко себе представлять. Советую Peter J. Ashenden "The Designer's Guide to VHDL". Лучше книги не найти. Все профессионалы обращаются к ней. Переменные можно и нужно использовать, только там, где нужно, и использовать правильно. Никаких некоторых глюков не будет, если четко представляешь себе, что делаешь и понимаешь разницу между сигналом и переменной.
-
Я разрисовал Ваш вариант схемы и у меня возникло несколько вопросов: 1. Куда на нее подается входной асинхронный сигнал (сигнал ND)? 2. Для чего используется триггер Q0? Если вход триггера Q1 (т. е. выход Q0) является асинхронным (может переключаться в произвольный момент времени) по отношению к clk, то очевидно, что это все равно что подавать асинхронный входной сигнал (ND) непосредственно на вход Q1, т. е. степень стабильности схемы по сравнению с моим вариантом ничем не отличается. Так в чем же идея?
-
Понятно. Для этой технологии (Virtex-II) полученные результаты временного анализа - явный бред. Особенно 454 и 607МГц, если учитывать к тому же добавление буферов ввода/вывода. Кстати, 113МГц для моего варианта схемы - это возможно реально. А что за различия? Логика работы не должна меняться в любом случае. Ничего, все приходит с опытом. Главное точно понимать, что делаешь и как работает.
-
Описанная логика работы верна. Я работал с вариантами схем, использующими как внешние подтягивающие резисторы, так и встроенные в ПЛИС. Проблем не встречал. Встроенные в ПЛИС Xilinx высокоомные (помоему около 100кОм). Все зависит от расстояния (длины дорожки) от кнопки до входа ПЛИС, если рядом, то достаточно встроенного в ПЛИС резистора, если расстояние большое (например, кнопка удалена на проводе), то необходим внешний резистор 1кОм и даже до 200Ом было дело ставили для обеспечения достаточной помехоустойчивости линии. Вообщем все зависит от расположения кнопки и окружения линии связи кнопка-ПЛИС.
-
Написано все верно. И синтезатор тоже прав. Он просто оптимизирует схему, т. к. оба выхода функционально эквивалентны. Иногда действительно может потребоваться сохранение одинаковых элементов (для, например, выдерживания временных или нагрузочных параметров схемы), в этом случае нужно использовать специальные атрибуты или директивы синтезатора, чтобы запретить оптимизацию. По моему опыту это требуется крайне редко, думаю Вам не стоит этим заморачиваться. Но понимать почему так, надо обязательно. PS: никакая вставка буферов и т. д. не поможет, умный синтезатор все равно все лишнее выкинет.
-
Помоему код вообще написан неправильно. Выполнение кода процесса вызывается каждый раз по событию на сигнале clock (следует из списка чувствительности процесса). Каждый раз, как только на clock возникает событие выполняется инициализация переменной count и ей присваивается значение 0. Если событие на clock является передним фронтом, то count увеличивается на 1, то есть приобретает значение 1. Следующее условие count = 1000000 не выполняется никогда, т. к. переменная count уничтожается по завершении выполнения процесса и создается вновь при каждом входе в процесс по событию на clock. Переменной здесь пользоваться бессмысленно, тем более если схему нужно получить в железе. Можно пользоваться shared variable, она действительно подобно сигналу может хранить значение при выходе из процесса, но это несинтезируемая конструкция. Нужно использовать сигнал count. Для меня удивительно, что приведенный код вообще как-то работал. Помоему дело здесь в самом коде.
-
Действительно, если сигнал ND асинхронен по отношению к CLK, то в общем случае требуется его подтактирование. При этом все зависит от отношения частот самого CLK и частоты переключения ND. Для малых частот достаточно одного уровня (триггера) подтактирования. Для больших частот может потребоваться два или даже три уровня подтактирования. Можно играть с фронтами CLK для схемы подтактирования (синхронизации). Можно подтактировать и непосредственно выход, т. е. DRY. Современная элементная база имеет очень высокую степень защиты от метастабильных состояний и очень быстро выходит из этого состояния. Но все же принебрегать этим я бы не рекомендовал. Я обычно использую не более двух уровней подтактирования, чаще даже один. Для сокращения времени передачи сигнала из одного тактового домена в другой обычно использую оба фронта тактового сигнала. Пока с проблемами метастабильности не сталкивался, хотя работал даже с технологиями ASIC. По поводу полученных после синтеза тактовых частот схем, странно, слишком уж большая разница. Зачастую средства синтеза сильно врут, пока не задашь аккуратно временные ограничения. А для какой технологии синтезируете?
-
Обычно я поступаю следующим образом: signal DRY_int : std_logic_vector(1 downto 0); BEGIN p_Main : process(RST1, CLK) begin if RST1 = '0' then DRY_int <= (others => '0'); --Async reset elsif Falling_Edge(CLK) then -- Clocked by falling edge of CLK DRY_int <= ND & DRY_int(1); --Two bit shift register end if; end process p_Main; DRY <= DRY_int(1) and not DRY_int(0); -- Set output DRY END arch;