FPGA. Чтоб работало как часы

Разобравшись с азами арифметики, я сказал себе, что настала пора помигать светодиодом по-взрослому - не с помощью кнопок, а чтобы оно само мигало. Для этого требуется подключить к микросхеме FPGA кварцевый осциллятор, но кварцевого осциллятора с выходом LVTTL у меня пока ещё не было, так что я решил попробовать посмотреть, что получится при использовании кварцевого резонатора. Я прочитал в Сети, что работать будет плохо, но особой точности мне для данной задачи не требовалось, поэтому я сказал себе, что плохое мигание светодиодом будет в любом случае лучше, чем ждать, пока откроется магазин (дело было ночью). И вот что у меня получилось.

Запуск с помощью сенсорного кварца

Кварцевый резонатор я подключил к микросхеме FPGA Cyclone к входу CLK1 по следующей схеме:

Схема подключения кварцевого резонатора к FPGA Cyclone

Для организации тактирования схемы я написал на языке Verilog модуль ClkGen (скачать):

module ClkGen(clkIN, clkOUT);

input clkIN;

output clkOUT;


wire clkOUT;


assign clkOUT = ~clkIN;


endmodule

Для того, чтобы светодиод мигал с частотой меньше, чем частота тактирования (в моём случае частота кварцевого резонатора составляла 20 МГц), я написал на языке Verilog модуль делителя частоты входных импульсов clkdiv (скачать):

module clkdiv(

input wire clkIN,

output reg clkOUT = 1'b0

);

parameter clkfreq = 20000000; // Входная частота, Гц

parameter outfreq = 2; // Выходная частота, Гц


integer count = 0;


always @ (posedge clkIN)

if (count == 0) begin

clkOUT <= ~clkOUT;

count <= (clkfreq / (2*outfreq)) - 1;

end

else

count <= count - 1;


endmodule

В модуле используются параметры, задающие входную и выходную частоты импульсов, чтобы его можно было использовать в блок-схемах Quartus II в количестве нескольких экземпляров, не копируя код модуля (clkdiv1, clkdiv2 и т.п.). Ведь кварцевый осциллятор обычно используется один, а частот в схеме устройства обычно нужно много разных.

Схема получилась следующая (скачать BDF):

Схема мигания светодиодом с помощью кварцевого резонатора 20 Мгц

В схему добавлена кнопка запуска BTN[0], но нажатие на кнопку позволяет только перевести генератор импульсов ClkGen в устойчивое состояние CLKO=1 (светодиод включается, но сама схема "висит"). После этого генератор импульсов можно запустить, потрогав кварц пальцем. При этом он срабатывает как сенсорная кнопка и генератор запускается.

В общем, что и говорить, результат не ахти какой, но если уж совсем никак, то кое-как оно всё-таки работает. Поэтому, чтобы работало как следует, я подключил к микросхеме FPGA кварцевый осциллятор.

Тактирование FPGA с помощью кварцевого осциллятора

Кварцевый осциллятор на 48 МГц я подключил к входу CLK0 микросхемы FPGA Cyclone по следующей схеме:

Схема подключения к FPGA Cyclone кварцевого осциллятора

Убрав из блок-схемы кнопку запуска и генератор импульсов, я получил в результате следующую схему (скачать BDF):

Блок-схема мигания светодиодом с частотой 2 Гц

В итоге всё прекрасно работает, светодиод мигает с частотой 2 Гц.

Автор: Андрей Шаройко <vanyamboe@gmail.com>