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.


Вот раздобыл я себе интересную штуку - ультразвуковой датчик расстояния. Называется этот датчик HC-SR04.

Ультразвуковой дальномер HC-SR04

Его краткую документацию я уже положил в наш раздел для загрузки файлов -

. Ну и конечно первая мысль - попробовать подключить его к нашей плате Марсоход.

В этой статье я постараюсь рассказать про счетчики, про их описание на Verilog и их схемотехническое представление в RTLViever.

Счетчики широко применяются везде, где нужно посчитать число некоторых событий, да и не только для этого Smile

Двоичный счетчик.

Вот это просто двоичный счетчик. На входе данных группы триггеров стоит сумматор. Одно из слагаемых для сумматора - это предыдущее значение счетчика, а второе слагаемое - константа "единица".


reg [3:0]counter;
always @(posedge clk)
  counter <= counter + 1'd1;


Вот представление этого счетчика в RTLViewer:

схема двоичного счетчика

К сожалению симулировать такой счетчик не получится, так как симулятору не известно начальное значение регистров counter[3:0], значит он не сможет вычислить и все последующие значения счетчика. Чтобы провести симуляцию нам нужен двоичный счетчик с ассинхронным сбросом.

Вот простая задача: выделение момента изменения длительного сигнала.
Я выделил ее в отдельную статью, потому, что это весьма часто используемый технический прием. Такие вещи приходится писать довольно часто и уже почти не задумываешься над ними.

Идея в общем очень простая. Есть длительный сигнал signal. С некоторой частотой clk запоминаем его значение в регистре prev_signal. Потом сравниваем текущее значение сигнала signal и его предыдущее значение prev_signal. На основании этого "сравнения" выдаем результат.

Визуальные соответствия между написанным на Verilog коде и синтезируемой в аппаратуре логикой

Просто триггер (flip-flop).

Это просто регистр или триггер - он запоминает входные данные со входа d и подает их на выход q. Запоминание происходит в момент, когда сигнал тактовой частоты clk переходит из нуля в единицу (то есть в момент фронта сигнала clk). На языке описания аппаратуры Verilog это выглядит вот так:


reg q;
always @(posedge clk)
   q <= d;
  


  триггер

Обратите внимание, на временных диаграммах значение на выходе меняется только в момент фронта тактовой частоты:

временные сигналы триггера

 

Я тут затеялся написать серию статей "Verilog в картинках".

Идея в том, чтобы показать примеры кода на языке Verilog и примерное схемное представление того, что описывает этот код. Зачем это нужно? Да затем, что бездумно писать код на Verilog - это не правильно. Я и сам когда-то писал в стиле "как на C/C++" с длиннющими функциями со множественными вложенными if-else и так далее, но теперь понимаю, что был не прав. Каждая фраза написанная на Verilog отливается в конкретные триггера и логику. Мне думается, что это правильно - представлять себе "схему" того, что написал. Если же код длинный и путанный, то представить себе, что это он такое описывает довольно трудно.

Метод написания статей я выбрал следующий. Я буду писать кусочки кода на Verilog, компилировать их с помощью Altera Quartus II и затем смотреть, что получилось в программе Altera Quartus II RTLViewer.

Как запустить RTLViewer? В среде Quartus выбирайте пункт меню Tools / Netlist Viewer / RTL Viewer. Это очень полезная вещь - смотреть что получается с твоим проектом в RTLViewer. Иногда глядя в него понимаешь, что в коде не все хорошо или есть ошибки или описки.

Если Вам захочется копнуть еще глубже, что бы понять внутренности реализованных компонентов, то можно еще посмотреть Tools / Netlist Viewer / Technology Map Viewer - это еще более детальное представление реализованного проекта в микросхеме Альтеры.

Ну вот первая статья уже есть - про мультиплексоры. Будут и еще статьи про другие разные типовые компоненты схем.