• 0
    Переводить нужно не system gates, а logic cells. Вентили — это все, что содержится в SLICE — мультиплексоры цепочки CARRY, LUT-ы, триггеры и т.д. Чтобы сравнить Xilinx и Altera, в даташите первого смотрим на Logic Cells, а для второго Logic Elements (LE). Для микросхемы XC3S500E Logic Cells — 10,476. Но также следует учитывать технологию, по которой эти логические элементы сделаны. Начинка несколько отличается.
    Women's Day Gift by FPGA
  • 0
    Это уже расточительство семейного бюджета, супруга такое не одобрит :)
    Women's Day Gift by FPGA
  • 0
    Я думал про это. :)
    Но они, к сожалению, завязаны с LED-матрицей. Джампером переключается вывод либо на светодиоды, либо на индикаторы.
    Women's Day Gift by FPGA
  • +2
    Под децимацией понимается принцип разбиения исходной последовательности для обработки на бабочках. Советую почитать статьи с сайта dsplib, либо книгу Айфичера.
    Реализация узла БПФ с плавающей точкой на ПЛИС
  • +2
    Спасибо!
    Да, я только сейчас понял, что забыл указать самые важные параметры — производительность и задержка вычисления от входа до выхода (в тактах). Обязательно дополню этим статью.

    Связку БПФ+ОБПФ 64К удалось запустить на частоте 333МГц на ПЛИС типа Virtex-6 (SX315T). Работала стабильно и без сбоев. Ядра от Xilinx также на запускались на этой частоте, но по ресурсам существенно проигрывали. Выше этой частоты эксперименты не проводились, к сожалению. На Kintex-7 результаты многоканальной схемы аналогичные (но при NFFT = 8K). Другие ПЛИС использовались только для оценки разводки и таймингов, без реальной проверки в железе.
    Реализация узла БПФ с плавающей точкой на ПЛИС
  • –3
    Изначально — это «светлая идея», которая затем переросла в негласный стандарт компании.

    К сожалению, он не всеми соблюдается, но мы стремимся к единообразию и соблюдению определенных правил написания кода. В свое время я написал такой документ, но сами понимаете — протащить его наверх и сделать это стандартом крайне непросто. Несмотря на то, что многие поддержали эту идею, а коллективные обсуждения по этому вопросу возникали неоднократно. :)
    Как работает FIFO
  • 0
    Мы пишем задержки только после синхронных присвоений под CLK, поэтому они не накапливаются. При следующем защелкивании — она снова будет 1нс. Про 1ГГц — верно подмечено, нужно весь код заменить на что-то типа 0.1нс. Поэтому я в своих проектах ввел переменную td, которой присваивается значение этой задержки.
    Как работает FIFO
  • 0
    Интересная плата. И её для начала будет достаточно, освоить базовые вещи — самое то. К сожалению, микросхемы АЦП и ЦАП не управляются программно, так что с этим здесь не поиграться. а как показывает опыт — сложнее научиться управлять схемой и правильно менять параметры модуля в динамическом режиме, чем, например, обеспечить одинаковую фазу для многоканальных систем (о чем писалось выше в комментариях).
    Подключение АЦП к ПЛИС. Особенности, сложности, реализация
  • 0
    Все верно. Мы на своих аналоговых модулях используем генераторы Si570/571, после которых ставится разветвитель. Для 8/16-канальных схем это успешно работает и система запитывается одним когерентным источником тактовой. А в системах, где используется делитель внутри АЦП — все нетривиально, необходимо извращаться уже непосредственно в ПЛИС. К счастью, с такими микросхемами АЦП практически не работаем.
    Подключение АЦП к ПЛИС. Особенности, сложности, реализация
  • 0
    Смысл такой, что если АЦП работает в широком диапазоне частот дискретизации (от 10МГц до 500МГц, например), то на некоторых участках значения тактовой частоты начинаются искажения сигнала данных (совпадают фронты, к примеру). Для этого на помощь приходят IODELAY группы и именно они позволяют работать в широком диапазоне тактовых частот.

    Да, в JESD204B все иначе, но там и другие особенности, начиная от интерфейса передачи, заканчивая схемой подключения в ПЛИС и способами синхронизации и управления сигналом запуска многоканальных схем. Если тема JESD204B будет интересна, мог бы написать об этом в следующей статье.
    Подключение АЦП к ПЛИС. Особенности, сложности, реализация
  • 0
    Согласен во всём. Недавно проверял проект, где нужно было тактировать АЦП сигналом, прошедшим именно MMCM. На входе MMCM — 60МГц, на выходе 120МГц. И эта частота идет на АЦП. Хорошего мало, но работает, благо каналов всего АЦП всего два.
    Подключение АЦП к ПЛИС. Особенности, сложности, реализация
  • 0
    Да, для частот 40-200МГц можно тактироваться внутренним MMCM. Но нужно понимать, что для MMCM тоже нужен источник частоты, пусть и не привязанный к аналоговому модулю. Я с такими устройствами работал. Но практика показывает, что чем проще способ тактирования данных, тем лучше. То есть это способ без использования MMCM. До узла пересинхронизации FIFO частота идет напрямую с аналогового модуля, проходит BUFG/BUFIO и в таком виде тактирует синхронные элементы схемы.

    С высокоскоростными импульсами такого типа не сталкивался, но мне думается, что здесь необходимо иметь высокую разрешающую способность, то есть хорошие аналоговые характеристики узлов АЦП, а со стороны цифровой части — наличие накопителя данных большого объема, в который помещается принимаемый сигнал. А вообще для цифрового устройства совсем нет разницы, какой формы сигнал обрабатывать, если аналоговое устройство способно этот сигнал обнаружить и задетектировать.
    Подключение АЦП к ПЛИС. Особенности, сложности, реализация
  • 0
    Спасибо за замечания, поправлюсь! :)
    Про ISERDES согласен, но на практике практически не встречал таких микросхем АЦП. В обратную сторону, т.е. ЦАП — сплошь и рядом такое, а с АЦП либо параллельная шина LVDS, вписывающаяся в частоту обработки ПЛИС, либо сразу JESD204B.

    Все верно. На этот вопрос в рамках статьи я решил не отвечать, но в списке литературы сделал отсылку к документу, с которого можно начинать копать. :)

    Самое примитивное решение — запитать все АЦП одним источником тактовой частоты и попытаться использовать один клок АЦП на глобальном буфере, а не N штук на региональных. Для многоканальных АЦП с частотами дискретизации до 500МГц это спасало.
    Подключение АЦП к ПЛИС. Особенности, сложности, реализация
  • 0
    Понял! Собственно, мы стараемся делать аналогично, если частоты обработки переваливают за 300 МГц. Как правило, основные проблемы таймингов связаны с длинными путями распространения сигналов. Часто спасает добавление триггеров в цепочку, но есть места, где этого сделать невозможно (узлы с обратными связями, например). Кстати, в этом плане у Vivado есть несомненный плюс — она без всех этих размещений для относительно простых проектов старается сделать максимально «хорошо», и ручное размещение практически не требуется.

    Но! Живой пример (против Vivado): в проекте используется два контроллера PCI-e gen3 x8 и два контроллера памяти DDR3 для Virtex-7. ISE с минимальной расстановкой по кристаллу и ограничениями через pblocks разводит за час, а Vivado либо не разводит вообще, либо разводит в разы дольше, и по таймингам проект у неё свести не получается.
    Использование TCL в разработке на FPGA
  • +1
    Вы говорите о полностью ручной расстановке и трассировке логических вентилей в ПЛИС через FPGA Editor, или вы делали расстановку путём добавления pblock-s на floorplanning? Если первое, то это действительно круто. А второй способ — вроде как типичное средство достижения требуемых тактовых частот. Нам в проектах с рабочей частотой 350МГц хватало расстановки pblocks нужным образом, иначе от разводки к разводке частоты получались всегда разные. Плюс, еще есть такая штука как Promote partitions, когда закрепленные блоки удачно разведены на требуемую частоту, и в дальнейшем эта разводка и размещение используются для уменьшения времени сборки прошивки (при условии, что внутри этих блоков логика не менялась).
    Использование TCL в разработке на FPGA
  • 0
    Я сейчас редко пользуюсь Quartus, но в нем вообще никогда не имел проблем, все очень интуитивно. Может быть из-за того, что он мне сейчас для работы нужен раз-два в месяц. Но в нем даже прошивку зашить проще, если в JTAG-цепочке стоит две разные ПЛИС: Altera и Xilinx.
    Использование TCL в разработке на FPGA
  • 0
    Понял, спасибо!

    Приму на вооружение ваши советы по поводу скобок, действительно полезно и не даст запутаться. :)

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

    С batch-файлами действительно удобно. Мы как раз сейчас активно занимаемся автоматизацией проектирования (особенно для сложных проектов с объемом ресурсов ПЛИС >80%), чтобы не запускать ручками процессы, а прийти и увидеть картинку по лучшей разводке. :)
    Использование TCL в разработке на FPGA
  • +1
    Добрый день!

    С лицензиями все по-старому. ISE вообще имеет свойство от версии к версии становиться только хуже. Благо, разработка закончилась на версии 14.7. К счастью, со всеми косяками можно совладать и привыкнуть к этим «особенностям» среды. Да, она все ещё глючная, но Vivado не менее глючная, чем ISE.

    Кроме того, на Windows 10 вообще отказываются работать 64-битные приложения от Xilinx. Программирование через Impact вообще не работает. Приходится сидеть в 32-битных ISE, PlanAhead etc. а программировать через 32-bit ChipScope Analyzer. Создать из bit файла mcs можно только через командную строку или TCL скрипт. Загрузить mcs во флешку — средствами ISE вообще не получилось. Моделирование в ISim частенько отваливается и вылетает. Такие вот пироги.

    Если вы про FPGA Editor под Linux, то ответа не знаю, не пробовал.
    Использование TCL в разработке на FPGA
  • +1
    Спасибо за слайды! Очень часто ко мне обращаются студенты и начинающие разработчики в области цифровой микроэлектроники и радиотехники с вопросами «что читать, куда копать?». Всем без исключения я рекомендую определенный список литературы, и книга «Цифровая схемотехника и архитектура компьютера» стоит в первых рядах. :)
    Подарок на 1 сентября всем поклонникам цифровой схемотехники и архитектуры компьютера
  • 0
    Спасибо!
    Задам несколько вопросов, если не против.
    — Это дело привычки или есть какая-то особенность брать в фигурные скобки переменные?
    — Этим активно пользуюсь, не только в TCL :)
    — С процедурами — верно подмечено, я стараюсь так делать, если скрип разрастается до больших размеров. Вызов вложений тоже удобная штука (использую для стадий synthesis / implement). А вот дефайнами не пользовался. Можете пример привести?
    Использование TCL в разработке на FPGA
  • +1
    По поводу литературы и дополнительных навыков, которые могут потребоваться в той или иной степени разработчику на ПЛИС:

    Сфера ЦОС:
    — Эммануил С. Айфичер, Барри У. Джервис. Digital Signal Processing: A Practical Approach
    — Рабинер и Голд. Теория и практика цифровой обработки сигналов.

    Также при углублении в область ЦОС на ПЛИС очень полезно будет на начальном этапе ознакомиться с даташитами на IP-ядра от тех вендоров, с которыми будете работать. В даташитах подробно описаны основные моменты, без сильного углубления в теорию. Дополнительный плюс таких IP-ядер — легкость моделирования и отладки.

    High Speed Trancsivers:
    — High-Speed Serial I/O Made Simple от Xilinx.

    Книга позволяет получить первичное представление о гигабитных трансиверах и их начинке, дает основные определения и описывает проблемы, возникающие при разработке интерфейсов передачи.
    Junior FPGA Design Engineer: как стать?
  • +2
    Тоже верно, требования везде разные. Даже на hh по вакансии можно заблаговременно предположить, где с железкой будешь иметь дело напрямую, а где хватит встроенных анализаторов (типа ChipScope для Xilinx).

    Кстати, насчет схемотехники. В нашем отделе давно сложилось правило, что опытный разработчик на ПЛИС должен не только прошивки делать и исключительно с ПЛИС работать на уровне написания/верификации кода для поставленной задачи, но еще и схемы рисовать с обоснованным выбором тех или иных компонентов. К счастью, без разводки платы, для этого есть отдел конструкторов. Такие вот дела. :)
    Junior FPGA Design Engineer: как стать?
  • +2
    Иван, спасибо за статью!

    Добавлю, что далеко не каждый Junior (и даже Middle) может похвастаться всем тем, что требуется из списка «Необходимо». Особенно, если после нескольких лет работы у человека начинается специализация в то или иное направление (реализация высокоскоростных интерфейсов или углубление в ЦОС, например). Получается, что существенную область разработки человек попросту игнорирует из-за специфики конкретно его работы.

    Меня часто спрашивают начинающие разработчики на ПЛИС (зачастую студенты старших курсов), что почитать, какие книжки нужно держать под рукой, что нужно уметь, знать, применять и куда расти. Когда я им вываливаю полный список того, что прочитал я или мои коллеги (и что ещё предстоит прочесть), то энтузиазм несколько угасает. Теперь в список для чтения ещё и вашу статью добавлю! :)

    Забавно, но у тех, кто ко мне обращается, тажке зачастую возникает вопрос: "FPGA vs WEB"? И практически всегда люди делают выбор в сторону того, что проще и в конечном счете позволяет иметь бОльшую гибкость. И это правильно.

    P.S. кстати, а где в требованиях умение пользоваться осциллографом? (с железками ведь работаем, как-никак) :)
    Junior FPGA Design Engineer: как стать?
  • 0
    А меня тут в моей последней статье активно ругали за активный велосипедизм применительно к FPGA. Хотя на мой взгляд, уж где-где, а в ПЛИС, которые умеют реконфигурироваться под любую задачу, такое раздолье для велосипедов! Более того, они успешно приживаются в крупных проектах и десятки лет живут своей жизнью, никому не мешая, но при этом оптимальным образом решая требуемые задачи. Так или иначе, все мои доводы в доказательство преимущества велосипеда перед стандартным решением для ПЛИС не дали эффекта. Но тем не менее, велосипеды были, есть и будут разрабатываться. :)
    Почему я пишу свои алгоритмы в 95% случаев, и буду и дальше разрабатывать кодовые велосипеды
  • +1
    По поводу PHY Serial RapidIO — интересное решение. Мы его тоже делали и даже используем для связи нескольких FPGA и DSP через RIO SWITCH. Но для SRIO намного сложнее реализация и ресурсов жрет, к сожалению, тоже много.
    Полноценный PCIE для Xilinx требует HARD блока и предварительной инициализации. В ПЛИС количество таких HARD-блоков ограничено и как правило задействовано для связи FPGA с компьютером.

    Да, мое решение применительно только к Xilinx, начиная с Virtex-4 и выше, хотя переделать под Altera несложно. Базовые ячейки у всех почти одинаковы. И IP-core от Xilinx тоже применимы только к Xilinx. :)

    Мы пока не встречались с такими проблемами, где наш велосипед не справляется. Повторюсь, PROTEQ успешно используется практически в каждом нашем проекте и решает определенный класс задач, который в своё время не смогла обеспечить Aurora. И да, мы используем стандартные решения. В своих проектах мы применяем полностью стандартизированные решения (PCIe, DDR, SRIO, и т.д.), несмотря на то, что для каждого из этих решений у нас есть свой велосипед. Где-то подойдет велосипед, где-то стандарт. Все зависит от задачи.
    Custom floating point format on FPGA
  • +1
    Субнормальные числа не используются, т.к. в процессе выполнения любых операций на выходе результат приводится к нормализованному виду, т.е старший бит мантиссы, который я называю "скрытым" равен 1 для ненулевого числа. Например, число "0х1" в формате fp23 запишется как {0x10, 0, 0x0000}, где битовые поля — {exp, sign, mant}. Причем, числа с меньшей экспонентой успешно поддерживаются.
    Пример: число 0.5, представленное как {0xF, 0, 0x0000} правильно обработается, и все математические операции с таким числом дадут корректный результат. Проверить можно просто по следующей формуле: 2(EXP-32)*(2^16+MAN).

    Также следует учитывать, что на входе преобразователя FIX2FLOAT данные строго целочисленные, но путём совсем небольшого шаманства в VHDL-коде можно фиксированную точку сместить в любое место. В реальном проекте числа меньше 0х1 в формате FP23 я использовал для хранения поворачивающих коэффициентов при реализации БПФ.
    Custom floating point format on FPGA
  • +1
    На практике в таких вещах получается, что шумы квантования в любом случае меньше, чем даёт шум АЦП. То есть цифровой частью ну никак не улучшить аналоговую, если динамический диапазон маленький. Пролезающие в полосу шумы точно также усиливаются, как и полезный сигнал. В наших задачах точности формата FP23 было "за глаза".

    К реализации специфического формата плавающей точки я, кстати, пришел не сразу. В первую очередь, мне не понравились монстрообразные IP-ядра от Xilinx, которые жрали очень много места, а на выполнение операций затрачивалось много тактов. Затем после оценки типовых задач по ЦОС стало ясно, что нет смысла копировать стандарт IEEE 754 в полной мере. Причина кроется в избыточности. Например, реализация сумматора «по стандарту» не обеспечит высоких скоростей без использования DSP48-узлов, которых в ПЛИС постоянно не хватает. Кастомный FP23 сумматор не требует DSP48-узла. Умножитель по стандарту требует 3 DSP48 блока, кастомный – всего один. Можно прикинуть, во сколько вырастет «бабочка» для проекта БПФ. А если учесть, что для реализации БПФ бабочек нужно log2(NFFT), то разница по ресурсам колоссальна. Сюда можно добавить RAMB память для хранения поворачивающих коэффициентов и линий задержки. FP32 и FP23 отличаются в 1.5 раза.

    PHY PCI-e не формирует пакеты данных. Он не обеспечивает надежную передачу с исправлением ошибок. До кучи у него значительно ниже скорость передачи, чем у PROTEQ. Закономерный вопрос: почему Xilinx в свое время сделали Aurora, а не пользовались стандартными решениями? Это тоже велосипед со своими фичами и особенностями. В защиту PROTEQ приведу ещё один аргумент. Он позволяет передавать данные как по оптике, так и по печатной плате от ПЛИС к ПЛИС. Ограничений нет никаких. Посмотрите публикацию о PROTEQ моего коллеги по этому вопросу. В ней приведено реальное сравнение с Aurora / PCIe.

    Вы можете и дальше утверждать, что велосипеды — зло, и нужно оставаться в рамках стандартов. Но лично моя практика и опыт моих товарищей-разработчиков говорит об обратном.
    Custom floating point format on FPGA
  • +6
    Во-первых, быстрее не получится. При таких затратах ресурсов скорость для fp16 и "велосипеда" практически одинакова. Но точность fp16 гораздо хуже. Также, например, при реализации БПФ на 64К-128К точек, в связи с интегральной природой алгоритма БПФ, у fp16 наступит переполнение. Итог — неверный результат на выходе.

    Во-вторых, в идеале нужно смотреть на реальные проекты с забитой ПЛИС на 70-80%, тогда есть смысл сравнить в боевом режиме. Я делал "велосипед #2" — формат fp18 и сравнивал с fp23. Поверьте — разницы по скорости практически нет, а по достижимой точности — солидно. По ресурсам отличие на 15%. Но даже fp18 пригодился в свое время на Virtex-4 для реализации схемы все того же БПФ.

    В-третьих, "велосипеды" конкретно на FPGA успешно справляются в прикладных задачах, где не требуется универсальности. Зачастую разработчикам приходится заниматься изобретением велосипедов, поскольку действительно крутые IP-ядра бесплатно вам никто не отдаст. Я знаю реальные примеры, когда так называемый "велосипед" намного круче стандартный протоколов.

    Дабы не быть голословным, приведу пример. Открытое ядро PROTEQ моего коллеги. Обеспечивает высокую скорость передачи данных по MGT линиям с требуемой надежностью. Занимает мало ресурсов ПЛИС и самое главное — быстро восстанавливается после возникновения ошибки. Протокол Aurora курит в сторонке, а PROTEQ в различных его вариациях успешно внедряется во многих наших разработках на ПЛИС.
    Custom floating point format on FPGA
  • 0
    У моих статей на гиктаймсе просто убрали хаб FPGA и все, сюда ничего не вернулось (даже песочная статья, размещенная изначально на хабре). Но администрация обещала все пернести назад сюда. Сижу в ожидании новогоднего подарка от хабра :)
    Возвращение блудных хабов
  • 0
    Да, вы правы. Пожалуй, добавлю ссылку в статью :)
    Генераторы хаоса на ПЛИС
  • 0
    Исправлено.
    Генераторы хаоса на ПЛИС
  • 0
    Если уж совсем на рассыпухе серии 7400, то выйдет красиво, но много микросхем. Главное математику (умножители и сумматоры) организовать, больше тут по сути ничего и нет. Тот же умножитель, если делать по алгоритму Бута — еще +20-30 сумматоров, в зависимости от разрядности данных. А сумматоры вообще разбить на логические функции. Рассыпухи станет будь здоров! Уж лучше на самом маленьком spartan3 сделать без извращений :)
    Генераторы хаоса на ПЛИС
  • +1
    На россыпи делал вот здесь товарищ с хабра. Как видите — тоже ничего сложного нет и все теплое «ламповое» аналоговое. :)
    Генераторы хаоса на ПЛИС
  • +1
    На дисплей не выводил, хотя задумка была и наработки для VGA-FPGA есть (см. сапёр на плис). Может как-нибудь прикручу, когда свободного времени будет побольше. Самому интересно это попробовать :)

    Для Xilinx floating point сейчас только в виде IP-корок, но в Vivado HLS можно работать с плавающей точкой и даже проекты небольшие на выходе можно получить. За серьезные не ручаюсь :) А вот у Альтеры есть DSP ячейки с поддержкой плавающей точки (Arria 10, если мне память не изменяет).
    Генераторы хаоса на ПЛИС
  • 0
    Спасибо, интересная статья! Хотелось бы добавить, что в Vivado HLS от Xilinx большую роль играют директивы, с помощью которых можно получать те или иные результаты по пропускной способности, максимальной задержке и ресурсам. Сначала отлаживается алгоритм в чистом виде, без привязки к железу, а затем путем вставки директив в нужные места, идет борьба за ресурсы и скорость. Насчет handshake/axi вы правы, Xilinx может создать монстрообразную конструкцию с кучей лишних портов, которые потом придется на RTL уровне соединять. Но весь этот процесс можно обуздать. В любом случае, вендоры правильно поступают, привклекая Сишников в разработку на FPGA, особенно с учетом того, что современные кристаллы настолько огромные, что забить его чистым RTL-кодом не так-то и просто :)
    Разработка цифровой аппаратуры на C++/SystemC глазами SystemVerilog программиста
  • 0
    Мою первую статью, написанную на хабре, в свое время переместили сюда. Поищите на гиктаймс по метке или хабу "fpga" статьи — они практически все тут.
    Цифровая фильтрация на ПЛИС – Часть 1
  • 0
    С хабра тематика FPGA давно переехала на гиктаймс :)
    Цифровая фильтрация на ПЛИС – Часть 1
  • 0
    Мне кажется, что для современных ПЛИС использовать «большие» частоты дискертизации при обработке звука — ерунда. Например, поставить интерполятор на R(I) = 160, а затем дециматор на R(D) = 147 — не проблема. Частота обработки в любом случае будет много выше частоты дискретизации. Другов вопрос, что делать преобразование из 44.1 в 48 на таких ПЛИС как Kintex-7 или Stratix V не имеет смысла.
    Цифровая фильтрация на ПЛИС – Часть 1
  • 0
    Думаю, ваше предположение верно о том, что команда чтения воспринималась как запись. Скорее всего портилось содержимое внутренних регистров таймера, поэтому он начинал сбоить. В процессе отладки проекта на первых стадиях мне иногда удавалось словить иероглифы, но причина была не в питании, а в неверной скорости записи/чтения из микросхемы.
    «Глупые» часы на FPGA
  • 0
    С пропаданием напряжения иметь дело не приходилось. Но плату оставлял включенной более, чем на сутки, предварительно записав время реальное и отображаемое. Спустя ~30-31 час на дисплее отображались нужные значения, которые должны были натикать за это время в ds1302. :)
    «Глупые» часы на FPGA