Комментарии 20
Большое спасибо за статью! Хотелось бы больше узнать о подводных камнях в реализации более-менее сложных стейт машин.
Еще такой вопрос: есть некая шина данных и её клок. Насколько я понимаю, клокать данные нужно не синхронно с их изменением, а в середине data eye. Этого можно добиться несколькими вариантами. Например на нечетных тактах выкладывать данные на шину, а на четных дергать клок. Вроде как еще есть вариант с DCM, а именно брать два синхросигнала, смещенных на 90° и по запаздывающему синхронизировать данные.
Хотел бы услышать ваши коментарии по этому поводу. Не совсем понимаю, как надо делать. В чем грабли и т. д.
Спасибо.
Еще такой вопрос: есть некая шина данных и её клок. Насколько я понимаю, клокать данные нужно не синхронно с их изменением, а в середине data eye. Этого можно добиться несколькими вариантами. Например на нечетных тактах выкладывать данные на шину, а на четных дергать клок. Вроде как еще есть вариант с DCM, а именно брать два синхросигнала, смещенных на 90° и по запаздывающему синхронизировать данные.
Хотел бы услышать ваши коментарии по этому поводу. Не совсем понимаю, как надо делать. В чем грабли и т. д.
Спасибо.
Все сильно зависит от временных параметров вашего устройства. Простейший случай (для малых скоростей) — клокать данные не по фронту, а по спаду того же самого клока. Потом перещелкиватьт фронтом. Более сложный случай — смотреть задержки сигналов и двигать фазу клока в оптимальное место.
в синхронных схемах, как правило все всегда делается по фронту.
Если на шине выставляются данные по фронту, то и принимаются по фронту.
Если на шине выставляются данные по фронту, то и принимаются по фронту.
Да, вариант с синхронизацией по спаду я тоже пробовал, но была какая-то проблема, про которую я уже забыл. То ли не хотело синтезировать, то ли еще что-то.
Игры с фазой сигнала это уже шаманство какое-то. Хоть DCM&PLL позволяют это делать, но я всегда думал что этот функционал используется скорее для подгонки фронтов на входе в устройство, и для устранения clock skew.
Ведь если схема изменится, либо PAR по другому разложит, то придется опять все пересматривать.
Игры с фазой сигнала это уже шаманство какое-то. Хоть DCM&PLL позволяют это делать, но я всегда думал что этот функционал используется скорее для подгонки фронтов на входе в устройство, и для устранения clock skew.
Ведь если схема изменится, либо PAR по другому разложит, то придется опять все пересматривать.
представьте себе шину, значение на которой устанавливается по фронту.
Вы хотите надежно зафиксировать это значение в регистре и выбираете момент «посередине периода» (видимо для надежности), например по спаду. Теперь ваш регистр выдает свой сигнал дальше, следующей логике, но он сдвинут по фазе. Следующий регистр, который будет фиксировать уже это значение должен так же принять его по середине? То есть вы думаете для следующего в цепочке регистре нужно опять сдвигать фронт, теперь уже на четверть периода основной частоты?
Нет и нет, только по фронту. Все регистры в простой синхронной схеме работают по фронтам.
Вы хотите надежно зафиксировать это значение в регистре и выбираете момент «посередине периода» (видимо для надежности), например по спаду. Теперь ваш регистр выдает свой сигнал дальше, следующей логике, но он сдвинут по фазе. Следующий регистр, который будет фиксировать уже это значение должен так же принять его по середине? То есть вы думаете для следующего в цепочке регистре нужно опять сдвигать фронт, теперь уже на четверть периода основной частоты?
Нет и нет, только по фронту. Все регистры в простой синхронной схеме работают по фронтам.
Если вы посмотрите спецификацию какого-нибудь SPI-интерфейса (у внешней микросхемы, будь то ЦАП, АЦП или какая-нибудь экзотика), то в 90% случаев вы увидите, что «данные выставляются по фронту, принимаются по спаду» или наоборот. Это то решение, которое малыми усилиями позволяет избежать головной боли.
Нет, конечно. Я так не думал. Когда все происходит в рамках ПЛИС, проблем нет. Просто есть устройства, где явно нарисована временна́я диаграмма с запаздыванием клока относительно установки данных. Почему и спросил, как такое обычно разруливается. Если можно было бы просто выставить значения на шину и тут же дернуть выходной клок, так вообще проблем не было бы.
Да, вот вы сказали про скорости. А что делать в случае высоких требований к скорости? Если чередование в тактах уже недопустимо ввиду снижения пропускной способности в 2 раза.
Не совсем понимаю, что вы имеете ввиду под чередованием в тактах. Вы дублируете пути в тракте данных и создаете multicycle path? Не могли бы нарисовать картинку для пояснения вашей проблемы.
Мне понравилась статья: красивые картинки, описание код-синтез и т.п. Но, честно говоря, таких статей тут не мало. Почему-то все останавливаются на описании счетчика и морганием светодиодом, что по сути одно и то же. Видно же, что Вы по уровню ушли вперед от этого. Конечно, никто не заставляет Вас описывать свои большие проекты. Но смысл FPGA, что они инструмент и у него масса применений. Существует масса направлений развития этой темы. Если вы занимаетесь ЦОС, то расскажите как делаются FIR, IIR, CIC фильтры, как делать децимацию и интерполяцию; если вы занимаетесь обработкой видео, то расскажите о реализации различных алгоритмов в железе; если вы занимаетесь интерфейсами, то расскажите о FSM Мура и Мили, о конвееризации; если ethernet, то формирование udp/tcp пакеты и реализации MAC уровня. Это было бы гораздо интереснее читать, хотя бы мне. Я понимаю, что некоторые темы сложные для объяснения, но всегда можно найти какой-то промежуточный уровень, когда еще писать не много, но и понимать это нужно для дальнейшего. Не страшно, что многие люди не поймут, это узконаправленная тема.
Извините за такое излияние, еще раз скажу, что статья мне понравилась. Бы было полезно добавить, как отличаются "<=" и "=" в testbanch`ах. И про wire, через которые удобно описывать комбинаторику как раз через "=", а reg через "<=".
Извините за такое излияние, еще раз скажу, что статья мне понравилась. Бы было полезно добавить, как отличаются "<=" и "=" в testbanch`ах. И про wire, через которые удобно описывать комбинаторику как раз через "=", а reg через "<=".
Спасибо за комментарий.
Изначально я думал написать небольшое введение для своих студентов, но в процессе понял что взялся за слишком широкую тему. И без объяснения множества подводных камней ничего не выйдет. Поэтому буду как раньше плясать у доски и исправлять глупые баги =)
Хорошо, попробуем копнуть глубже. Пока ехал в метро понял что у меня есть материал по нескольким темам. Буду искать время чтобы оформить и выложить.
Изначально я думал написать небольшое введение для своих студентов, но в процессе понял что взялся за слишком широкую тему. И без объяснения множества подводных камней ничего не выйдет. Поэтому буду как раньше плясать у доски и исправлять глупые баги =)
Хорошо, попробуем копнуть глубже. Пока ехал в метро понял что у меня есть материал по нескольким темам. Буду искать время чтобы оформить и выложить.
Вы правы, но есть проблема: Чтобы рассказать «как делаются FIR, IIR, CIC фильтры, как делать децимацию и интерполяцию» надо сперва объяснить, что такое «FIR, IIR… и т.д.» А это в первую очередь «матан», объянять который здесь затруднительно и весьма трудозатратно…
откровенно говоря, не так нужен матан в описании фильтров. Весь ЦОС это умножение с накоплением. Если посмотрите мои созданные темы, то найдете описание ких фильтра без формул вообще. Смысл ких фильтра — перемножить пары чисел и их сложить.
вот здесь есть описание нескольких проектов для ПЛИС: http://marsohod.org/index.php/projects
там и USB, и видеоигра, простой процессор и т.д.
там и USB, и видеоигра, простой процессор и т.д.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Проектирование синхронных схем. Быстрый старт с Verilog HDL