FPGA. Чтоб работало как часы
Разобравшись с азами арифметики, я сказал себе, что настала пора помигать светодиодом по-взрослому - не с помощью кнопок, а чтобы оно само мигало. Для этого требуется подключить к микросхеме FPGA кварцевый осциллятор, но кварцевого осциллятора с выходом LVTTL у меня пока ещё не было, так что я решил попробовать посмотреть, что получится при использовании кварцевого резонатора. Я прочитал в Сети, что работать будет плохо, но особой точности мне для данной задачи не требовалось, поэтому я сказал себе, что плохое мигание светодиодом будет в любом случае лучше, чем ждать, пока откроется магазин (дело было ночью). И вот что у меня получилось.
Запуск с помощью сенсорного кварца
Кварцевый резонатор я подключил к микросхеме FPGA Cyclone к входу CLK1 по следующей схеме:
Для организации тактирования схемы я написал на языке 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):
В схему добавлена кнопка запуска BTN[0], но нажатие на кнопку позволяет только перевести генератор импульсов ClkGen в устойчивое состояние CLKO=1 (светодиод включается, но сама схема "висит"). После этого генератор импульсов можно запустить, потрогав кварц пальцем. При этом он срабатывает как сенсорная кнопка и генератор запускается.
В общем, что и говорить, результат не ахти какой, но если уж совсем никак, то кое-как оно всё-таки работает. Поэтому, чтобы работало как следует, я подключил к микросхеме FPGA кварцевый осциллятор.
Тактирование FPGA с помощью кварцевого осциллятора
Кварцевый осциллятор на 48 МГц я подключил к входу CLK0 микросхемы FPGA Cyclone по следующей схеме:
Убрав из блок-схемы кнопку запуска и генератор импульсов, я получил в результате следующую схему (скачать BDF):
В итоге всё прекрасно работает, светодиод мигает с частотой 2 Гц.
См. также
Автор: Андрей Шаройко <vanyamboe@gmail.com>