Изучаем САПР Altera Quartus II / Intel Quartus Prime, язык описания аппаратуры Verilog HDL и кое-что про VHDL. Программируем FPGA Altera / Intel Cyclone III, Cyclone IV, MAX II, MAX10. Экспериментируем с платами разработчика FPGA серии Марсоход, Марсоход2, Марсоход3. А еще разбираемся с FPGA Gowin.
Мы знаем, что такое метастабильность D-триггера, и знаем, как с этим явлением бороться. Цифровая схема может иметь несколько блоков, тактируемых от разных генераторов. Это, так называемые клоковые домены. Для передачи сигнала из одного клокового домена в другой должны использоваться синхронизаторы – как минимум два последовательных D-триггера.
А что, если нам нужно передать не одиночный сигнал, а группу сигналов, сигналы шины?
Я сделал вот такой простейший проект в Altera Quartus II. Четырехбитные данные со входа data[3:0] фиксируются тактовой частотой clk в четырехбитном триггере A. Зафиксированные в триггере A данные затем пересекают клоковый домен и далее фиксируются тактовой частотой clk2 в следующем четырехбитном триггере B, далее в четырехбитном триггере C и, в конечном итоге, поступают на выход out[3:0].
Похоже, что все правильно, правда? Мы ведь установили в принимающем клоковом домене синхронизаторы для каждого из четырех сигналов данных. Но все ли здесь хорошо?
В языке Verilog HDL для описания синхронизаторов сигналов, пересекающих клоковый домен (CDC, Clock Domain Cross) используются очень простые конструкции. Это понятно, ведь синхронизатор это просто два (редко три) последовательных триггера.
Я хочу рассказать об одной проблеме, которая встречается часто при разработке цифровых устройств, но о существовании которой многие забывают или даже вообще не подозревают. Наши проекты для ПЛИС цифровые, большинство процессов внутри нее происходят синхронно с тактовой частотой подключенного генератора. Тем не менее, сама микросхема принимает сигналы из внешнего мира и часто эти сигналы асинхронны к нашей тактовой частоте.
Для тех, кто изготавливает плату Марсоход самостоятельно вот здесь разводка платы, выполненная в более новом PCAD2002. Она выполнена читателем "radar detector", за что ему большое спасибо.
Вот бывает так, что проект работает, вроде бы все нормально, но проходит время, возвращаешься к нему и находишь досадные ошибки. Сейчас речь пойдет о проекте ранее опубликованном на нашем сайте – это процессор reduced AVR.
В принципе, проблема в том проекте с самого начала была известна, и более того, на нее указывал мне лично наш читатель. В этом проекте Quartus II выдавал сообщение, что на сигнале тактовой частоты в проекте есть гейт (gate) и это якобы не хорошо:
Warning: Found 2 node(s) in clock paths which may be acting as ripple and/or gated clocks -- node(s) analyzed as buffer(s) resulting in clock skew Info: Detected ripple clock "altufm_none0:inst13|altufm_none0_altufm_none_ghp: altufm_none0_altufm_none_ghp_component|arclkena_reg" as buffer Info: Detected gated clock "altufm_none0:inst13|altufm_none0_altufm_none_ghp: altufm_none0_altufm_none_ghp_component|ufm_arclk" as buffer
Сказать по правде, в тот момент я не придал большого внимания этому предупреждению: работает проект да и ладно. Тем более, что исправить проблему не очень просто (позже объясню почему).
Совсем недавно другой наш читатель пожаловался, что у него не работает этот проект reduced AVR. Вы можете почитать его комментарии к статье о проекте.
Тогда уже я стал разбираться, и теперь появилось время рассказать подробнее о проблеме и ее решении.
Подробнее...