Очередная серия про ПЛИС и отладочную плату Френки. Предыдущие серии 1, 2, 3. Сделать контроллер елочных гирлянд не просто, а очень просто! Hello World на ПЛИС — это помигать светодиодом. А "С новым годом" на ПЛИС — это помигать несколькими светодиодами. Принцип прост, как и в предыдущих статьях: создаем счетчик, который делит частоту тактового генератора, выбираем биты из слова счетчика, для получения нужной скорости. Несколько бит из этого слова дадут нам определенный шаг отображения (в зависимости от количества выбранных бит 1, 2, 4, 8 и т.д. шагов). В зависимости от номера шага задаем значения для N светодиодов. Для управления реальной гирляндой, можно взять какой-нибудь shield с электромагнитным реле. У меня оказался вот такой, на 8 реле. Схема подключения. Принципиальная схема. При обычном чередовании лампочек, мы на первом шаге зажигаем четные лампочки, а на втором — нечетные. Шагов 2, поэтому из слова счетчика нам потребуется всего один бит. Номера лампочек на каждом шаге зададим словом — константой.
 Огоньку, чтобы пробежать через 8 лампочек, нужно 8 шагов. Для этого из слова счетчика нужно выбрать 3 бита (2^3 = 8). Стоит заметить, что вывод у нас получается инвертированным, так как для включения реле, мы должны выдать 0.
 То же самое, что и в первом варианте, только объединим лампочки парами.
 Это вариация одиночного бегущего огонька, но тут потребуется в два раза меньше шагов
 Это самая интересная часть. Для того, чтобы сгенерировать псевдослучайную посделовательность, я использовал LFSR. Примеры кода можно прямо брать по этой ссылке. Я взял на наименьшее количество бит. Алгоритм уже проверенный, но почему-то он никак не хотел работать! Причина оказалась в том, что в регистре не должно быть нулевого значения, а при включении ПЛИС там получается ноль в каждом бите. Но я же применил секцию Initial!!! В общем, за не любовью читать документацию, истина пришла через опыты. На ПЛИС серии EPM7000 не работают секции initial. Та же проблема, кстати, была и на Lattice 4064. Все это дает основания полагать, что в более крупных ПЛИС класса Cyclone, блоки initial, генерируются в какой-то дополнительный hardware кусок. А для того, чтобы сделать инициализацию в EPM я добавил еще один счетчик для генерации сигнала сброса. При поступлении этого сигнала, регистрау генератора псевдослучайной последовательности присваивается изначальное значение. После этого "генератор" заработал. Из соображений экономии ресурсов, я не стал создавать по генератору на каждый бит. Скорее всего, не хватило бы ресурсов. Дело в том, что генератор может выдавать следующее значение на кадом такте, а обновлять лампочки нам нужно не на каждом такте, поэтому один генератор используется для заполнения значений всех лампочек. У нас еще остались ресурсы ПЛИС, поэтому мы можем взять старшие биты счетчика и использовать их для переключения типа бегущих огоньков. Проще, когда типов будет 2, 4, 8, но у нас их пять. Поэтому, я их буду перебирать 4 из них, а в промежутках между ними вставлю пятый вариант (вернее первый). В общем, тут поле для экспериментов. Свободные ресурсы еще есть, потому что потрачено 58 ячеек из 64х. Казалось бы, бессмысленный проект, но позволил узнать про такие нюансы, как неработоспособность initial на этой серии. Раньше я считал, что это в целом особенность производителя (Lattice, Xilinx или Altera). А из комментариев выяснилось, что количество перепрошивки данной ПЛИС всего около 100 раз. Новые знания приходят, значит все это не зря! Инженер программист