FPGA chips

Изучаем САПР 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-триггера.

А что, если нам нужно передать не одиночный сигнал, а группу сигналов, сигналы шины?

Синхронизатор для группы сигналов, Clock Domain Cross

Я сделал вот такой простейший проект в Altera Quartus II.
Четырехбитные данные со входа data[3:0] фиксируются тактовой частотой clk в четырехбитном триггере A. Зафиксированные в триггере A данные затем пересекают клоковый домен и далее фиксируются тактовой частотой clk2 в следующем четырехбитном триггере B, далее в четырехбитном триггере C и, в конечном итоге, поступают на выход out[3:0].

Похоже, что все правильно, правда? Мы ведь установили в принимающем клоковом домене синхронизаторы для каждого из четырех сигналов данных. Но все ли здесь хорошо?

В языке Verilog HDL для описания синхронизаторов сигналов, пересекающих клоковый домен (CDC, Clock Domain Cross) используются очень простые конструкции. Это понятно, ведь синхронизатор это просто два (редко три) последовательных триггера.


module synchronizer(
   input wire signal,
   input wire clk,
   output wire signal_sync
);

reg a,b;

always @(posedge clk)
begin
   b<=a;
   a<=signal;
end

assign signal_sync = b;

endmodule


Я хочу рассказать об одной проблеме, которая встречается часто при разработке цифровых устройств, но о существовании которой многие забывают или даже вообще не подозревают.
фиксация асинхронного сигнала в триггере
Наши проекты для ПЛИС цифровые, большинство процессов внутри нее происходят синхронно с тактовой частотой подключенного генератора. Тем не менее, сама микросхема принимает сигналы из внешнего мира и часто эти сигналы асинхронны к нашей тактовой частоте.

Здесь возможны проблемы...

PCB платы Марсоход выполненное в PCAD2002
Для тех, кто изготавливает плату Марсоход самостоятельно вот здесь разводка платы, выполненная в более новом 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. Вы можете почитать его комментарии к статье о проекте.

Тогда уже я стал разбираться, и теперь появилось время рассказать подробнее о проблеме и ее решении.