FPGA: Готовність до дослідження

FPGA: Готовність до дослідження 1

У попередніх частинах ми розглядали використання плати Tang Nano 20K з інструментами GOWIN та деякими інструментами з відкритим кодом. Інструменти з відкритим кодом, безумовно, мали перевагу в можливості симуляції та налагодження дизайну перед записом його на реальний чіп. Однак, як ми побачимо, інструменти GOWIN включають дуже простий у використанні та функціональний логічний аналізатор.

Налаштування

Перш за все, вам знадобиться конфігураційний файл GAO. Коли ви створюєте його в редакторі, вам пропонуються численні складні опції. За допомогою активного файлу GAO інструмент вбудовує логічний аналізатор у ваш дизайн, а файл встановлює умови спрацьовування.

Ось порада. Ви можете мати лише один активний файл GAO. Іноді вам не потрібен логічний аналізатор. В інших випадках може знадобитися альтернативна конфігурація. Якщо ви клацнете правою кнопкою миші майже на будь-якому файлі на вкладці Design IDE, ви побачите, що можете його вимкнути. Це додасть великий червоний хрестик і виключить його з майбутніх збірок. Принаймні, доки ви знову не ввімкнете його. Це дозволить вам обирати між кількома файлами GAO або навіть кількома файлами Verilog для конкретної збірки (наприклад, один для тестів, а інший для виробництва).

Якщо ви створюєте файл GAO з нуля, вас запитають, чи хочете ви “Lite Mode”. Наскільки я можу судити, цей режим вам ніколи не знадобиться. Завжди використовуйте Standard Mode. Крім того, вам майже завжди потрібен RTL режим, який показує вам (переважно) символи, які ви визначили, а не ті, що додаються під час обробки.

Ви, звісно, можете знайти повне керівництво онлайн. Однак відео нижче та решта допису допоможуть вам швидко розпочати роботу.

Основи GAO

Щоб налаштувати зондування, нам потрібно зрозуміти дизайн, тому решта цього допису охоплює Verilog, який ми будемо використовувати для тестування функції логічного аналізатора, і ви побачите, як аналізатор працює у відео. Ось кілька попередніх переглядів того, як виглядатиме вивід аналізатора, який ми побачимо в кінці:

Сегментоване захоплення інтервальної логіки
Захоплення послідовних даних з низькою швидкістю

Ліве зображення показує імпульс, який перемикає світлодіоди, що є складним, оскільки тактова частота становить 27 МГц. Права сторона показує послідовні дані та використовує повільнішу тактову частоту, спеціально призначену для налагодження.

Всередині Verilog

Verilog може бути небезпечним. Якщо ви вже вмієте програмувати, Verilog виглядає достатньо схожим на мову програмування, щоб спонукати вас думати про нього неправильно. Ви не можете думати про Verilog як про код. Він описує, як ви хочете, щоб апаратне забезпечення поводилося. Ключовою частиною цього є тактові сигнали.

Більшість практичних цифрових систем мають певний тип тактового сигналу, який забезпечує їх роботу. Дуже прості речі, як наш останній приклад, можуть його не потребувати, але практичні системи майже завжди роблять це. Теоретично, ви можете створити асинхронну логіку, але це дуже складно. Синхронна логіка — та, що контролюється тактовим сигналом — значно поширеніша.

Навіщо потрібні тактові сигнали?

Ми думаємо про сигнали як про миттєві зміни, але це не так. Вони змінюються в трохи різний час з багатьох причин: довжина дроту, ємність, відмінності в конструкції пристрою, температура та, ймовірно, багато інших факторів. Отже, уявімо собі перебільшений приклад. Припустимо, у вас є супербезпечний автомобіль. Якщо він виявляє, що двигун працює, а двері відчинені, він вимикає двигун. Це логічний елемент AND, і для цілей перебільшення припустимо, що сигнали від дверей і двигуна, які подаються на логічний елемент AND, потребують випадкового часу від 100 до 900 мілісекунд, щоб досягти його.

Зазвичай це не має великого значення. Ви закриваєте двері, дивитеся в дзеркало, вмикаєте плейлист і заводите машину. Але уявіть, що ви в паніці. Ви стрибаєте в машину і негайно намагаєтеся її завести. Сигнал запуску двигуна може надійти раніше, ніж сигнал про те, що двері відчинені, вимкнеться. Раптом ваш двигун заглухає одразу після запуску. Неприємно.

Це трохи вигадано, але проблема реальна. Припустимо, ви хочете додати два числа. Одне число змінюється з 11 на 22, а інше — з 5 на 10. Ви хочете отримати результати 16 і 32. Але замість цього ви отримуєте 16, 27, а потім 32. Або, можливо, 16, 21, а потім 32. Все ще неприємно.

Отже, тактові сигнали, по суті, дозволяють усьому встигнути стабілізуватися, а потім визначити вихід. Ці виходи залишатимуться стабільними до наступного тактового сигналу. Це сильно спрощено, але ми поговоримо про це більше пізніше. Кожен елемент у вашому дизайні займає певний час, і найдовший час, загалом, визначатиме вашу максимальну тактову частоту. Отже, якщо одна частина вашого дизайну потребує мікросекунди для надійної зміни, ваша частота повинна мати період довший за цей.

Перегляньте приклад файлу. Це звичайний Verilog, хоча SystemVerilog (файли .sv) має деякі переваги, які ви можете використовувати, і я на них вкажу. Приклад, який ми використовували, — це дуже простий дизайн, який просто керує деякими світлодіодами на платі 20K. Вхідний тактовий сигнал буде 27 МГц, тому, щоб змусити світлодіоди блимати, нам потрібно буде порахувати багато тактових циклів і змінювати світлодіоди лише час від часу.

Крім того, він буде використовувати IP — попередньо визначені блоки — для створення UART. Функція проста і вигадана. За замовчуванням введення символу через UART відлунює його. Однак, якщо ви натиснете кнопку користувача на платі, вона переключить плату в режим, де вона додає одиницю до символу перед його повторним надсиланням. Якщо ви натиснете кнопку знову, вивід буде простим відлунням. Коли ви натискаєте кнопку в будь-якому випадку, пристрій надсилає зірочку.

З самого початку

У верхній частині файлу ви побачите цей рядок:

default nettype none

Це гарна ідея, тому що без неї Verilog із задоволенням створюватиме нові мережі з помилок. Наприклад:

countt=count+1;

Тепер count не змінюється, але створюється новий провід countt, який ніколи не використовується. Єдина проблема полягає в тому, що деякі IP-адреси GOWIN очікують, що за замовчуванням мережа буде wire, тому в кінці файлів вам потрібно повернути її назад:

default nettype wire

Ще одна особливість полягає в тому, що хоча деякі інструменти розуміють, що якщо ви вказуєте вхід або вихід, вони повинні припускати, що це wire, якщо ви не скажете інше. Інструменти GOWIN відмовляться це робити, якщо ви встановите тип за замовчуванням на none.

Модульність

Наступна частина — це модуль світлодіода. Це, теоретично, багаторазовий елемент. Однак це також наш основний блок. Синтаксис #() дозволяє мені встановлювати деякі параметри, які ви можете змінювати під час створення одного з цих модулів, а також значення за замовчуванням. Наприклад, у попередньому тестовому стенді я написав:

led #(.CLOCK_FREQUENCY(10, .INTERVAL_MS(1000)) uut(.reset(reset), .Clock(clk)...

Це встановлює повільний тактовий сигнал і інтервал для цілей симуляції замість використання значень за замовчуванням. Не всі модулі мають параметри. Після цього, однак, є те, що виглядає як список аргументів входів та виходів. Це порти, які ви можете використовувати, якщо це не ваш основний модуль, але оскільки цей є основним модулем, нам знадобляться обмеження для призначення їх конкретним пінам на FPGA.

Інструкції localparam схожі на #defines у C, і ми використовуємо їх для встановлення необхідного лічильника та визначення кількості бітів, необхідних для лічильника ($clog2 дає нам логарифм за основою 2 під час компіляції).

Більшість часу ми працюємо з проводами (wires). Щось повинно їх керувати. Вони ідеально підходять для підключення до речей. Але тоді є ще регістри (regs). Ви можете подумати, що це тригери, але це не зовсім так. Це просто змінні Verilog, якщо хочете.

Легко думати про wire і reg як про 1 або 0, але виявляється, Verilog також підтримує значення, такі як X (невідомий) і Z (схожий на відкритий колектор). Насправді, SystemVerilog дозволяє вам писати логіку замість wire або reg, про що ми поговоримо незабаром. Однак існує так багато “звичайного” Verilog, що важливо розуміти його, навіть якщо ви плануєте використовувати більш сучасний SystemVerilog у своїй роботі.

Подивіться на цей рядок:

reg [COUNT_BITS-1:0] interval_count;
FPGA: Готовність до дослідження 2
Генератор IP має багато виборів та посилання на документацію.

Це говорить нам, що у нас є регістр з ім’ям interval_count. Він має біти, що варіюються від біта 0 (найменш значущий) до COUNT_BITS-1. Зауважте, що ви можете змінити їх порядок, якщо це має сенс для вашого дизайну. Або почати з біта 1, наприклад. Це не масив, хоча Verilog підтримує масиви. Це багатобітова змінна. Якщо ви не вказуєте біти (як у наступному визначенні interval_tick), змінна буде однобітовою.

Наступний блок коду визначає змінні reg і wire, які будуть підключені до UART. Поки що ми не створюємо власний UART. Ми використовуємо IP, наданий GOWIN. Одна з проблем полягає в тому, що він справді створений для підключення до мікропроцесора, тому ми трохи обманемо, щоб його було простіше використовувати. Ви можете вставити IP у проект з меню Tools під IP Core Generator.

Остання частина налаштування обробляє вхідні сигнали кнопки та стан світлодіода. Кнопки не синхронізовані з тактовим сигналом, і це може призвести до серйозної проблеми. Крім того, механічні перемикачі можуть викликати дребезг – тобто, вони не просто вимикаються, а потім вмикаються. Вони вимикаються, вмикаються, вимикаються, вмикаються, вимикаються, вмикаються, вимикаються, а потім – через кілька мілісекунд – стабілізуються у ввімкненому стані. Для вирішення цих проблем включено модуль дребезгу. Поки що ми будемо використовувати його так само, як і UART, хоча цей модуль знаходиться в debounce.v.

Інстанціювання

Ось як ми створюємо модуль дребезгу. Теоретично, ви можете створити стільки, скільки вам потрібно:

debounce #(     .CLOCK_FREQUENCY (CLOCK_FREQUENCY),     .DEBOUNCE_MS (10) ) button_filter (     .Clock (Clock),     .reset (reset),     .noisy_button (pushbtn),     .clean_button (button) );

Назва екземпляра — button_filter, і ми встановили параметри, щоб повідомити йому нашу тактову частоту та час дребезгу, який становить 10 мілісекунд. Роз’ємами є лінії тактового сигналу та скидання, разом із вхідним сигналом кнопки та очищеною версією кнопки як виходом.

Призначення: UART

Є кілька рядків, що починаються з assign. Це паяльники Verilog. Ви можете підключити вихідний провід до деякої змінної або виразу, і тоді це і буде те, чим буде цей провід. Ми бачили це в попередніх демонстраціях, що стосувалися лише світлодіодів.

Потім йде значно складніше інстанціювання UART. Хоча він має більше входів і виходів, він, по суті, такий самий, як підключення модуля дребезгу. Зауважте, що в деяких випадках я просто примусово призначаю фіксовані дані до піна (наприклад, 3’b001, що є трибітовою двійковою константою, або 8’hff, що є 8-бітним шістнадцятковим FF. Деякі з’єднання є проводами або реєстрами. Деякі є виразами, як ~reset (інверсія reset).

Суть проста. Коли uart_rx_ready_n стає низьким, ви можете прочитати символ з uart_rx_data. Передача має подібне налаштування.

Тригер (Flop)

Решта файлу містить три вирази always. Є дві речі, які ви можете робити з always (насправді, SystemVerilog розділяє їх, як ми побачимо в майбутньому). Поки що ми зосередимося на тому, як писати тригери з тактовим сигналом за допомогою always @.

Найпростіший — це останній, який перемикає стан світлодіода:

always @(posedge Clock) begin     if (reset) led_state <= 1'b0;     else if (interval_tick) led_state <= ~led_state; end

Це створить тригер, який спрацьовує при позитивному фронті Clock. Якщо лінія скидання висока, тригер встановить led_state на 0. В іншому випадку він встановить стан світлодіода на протилежний до його попереднього стану.

Тут є кілька моментів, на які варто звернути увагу. По-перше, led_state не може бути встановлений ніде, крім цього блоку always. Інша проблема трохи складніша. Зверніть увагу, що присвоєння використовують <=, а не =. Ви могли б написати =, але це призводить до проблеми. Уявіть такий код у блоці always:

qout=3'b000; if (b) quot=~quot;

Verilog інтерпретує це як те, що quot буде встановлено на 0 перед наступним рядком. Пам’ятайте, однак, що Verilog під час “виконання” не проходить код рядок за рядком. Отже, він виведе защіпку (latch), щоб зберегти це значення та подати його на логіку, яка обробляє другий рядок.

Це не тільки не те, що ви хочете, але й генерує дивні речі на пристрої, які не будуть працювати ефективно. Натомість ви хочете використовувати присвоєння <=. По суті, кожне значення quot, прочитане в блоці always, буде тим, чим quot був на момент тактового фронту. Потім, наприкінці блоку, останнє присвоєння <= "виграє".

Це, ймовірно, те, що ви насправді мали на увазі, і це дозволяє уникнути створення дивних защіпок, які, в кращому випадку, сповільнять ваш дизайн. На практиці ви можете думати про це як про те, що тригери захоплюють входи на тактовому фронті, а потім виробляють виходи, які будуть готові (принаймні) до наступного тактового фронту.

Метастабільність

FPGA: Готовність до дослідження 3
Дані повинні бути стабільними протягом часу встановлення до часу утримання.

Я згадував, що модуль дребезгу робить дві речі: усуває дребезг механічного перемикача та синхронізує з тактовим сигналом. Проблема полягає в тому, що ми уявляємо тригери як досконалі, але, звісно, це не так. Будь-який практичний тригер має час встановлення (setup time) і час утримання (hold time). Уявіть собі дуже поганий тригер, який мав час встановлення 100 мілісекунд і час утримання 50 мілісекунд. Це означало б, що вхідний сигнал повинен бути стабільним щонайменше 100 мілісекунд перед тактовим тригером і не може змінюватися до 50 мілісекунд після тригера.

Це одна з речей, що впливає на вашу максимальну тактову швидкість. Логіка повинна мати час для стабілізації перед спрацьовуванням тактового сигналу. Але якщо щось надходить від іншого тактового сигналу або, що ще гірше, асинхронно, ви ризикуєте. Якщо вимоги тригера не виконані, він може стати метастабільним, тобто перебувати в невизначеному стані або навіть шалено коливатися.

Найпоширеніший спосіб боротьби з цим — затримати сигнал за допомогою кількох тригерів. Ідея полягає в тому, що навіть якщо один тригер стає метастабільним, він не пошириться по всій системі. Просто варто про це знати, якщо ви працюєте з чимось асинхронним або намагаєтеся підключити тригери, що використовують один тактовий сигнал, до тих, що використовують інший.

Якщо картина коштує…

Тепер, коли ми знаємо, що відбувається в Verilog, ми готові налаштувати логічний аналізатор. Ви можете дізнатися, як це працює, у відео нижче. Ви також можете отримати файли на GitHub.

Обов’язково зайдіть на Discord. Якщо вам потрібен огляд цифрової логіки, завжди є FPGA Bootcamps.

  • FPGA: Готовність до дослідження 4
  • FPGA: Готовність до дослідження 5
  • FPGA: Готовність до дослідження 6
  • FPGA: Готовність до дослідження 7

Опубліковано в Featured, FPGA, Slider. Теги: fpga, integrated logic analyzer, logic analyzer, tang nano 20k. Навігація по допису:

← A Modern Browser For The PlayStation Portable

Counting The PET Bottles Needed To Make 1 Kg Of Printer Filament →

The FPGA Chronicles: Ready To Probe

The FPGA Chronicles: Open Source It

The FPGA Chronicles: Exploring The Tang Nano 20K

Дивіться всі статті з цієї серії →

11 думок про “The FPGA Chronicles: Ready To Probe”

  1. shinsukke каже:

    Жовтень 13, 2026 о 9:23 ранку

    Я б із задоволенням дістав свою оціночну плату Spartan 6 зі запиленої шухляди, але, на жаль, я нічого не можу придумати, для чого б її використати.

    Reply

    1. douyarou каже:

      Жовтень 14, 2026 о 2:00 ранку

      Я б дуже хотів купити FPGA і почати вивчати це, але та сама проблема. Що мені робити з цією річчю?

      Reply

      1. Pat каже:

        Жовтень 14, 2026 о 4:05 вечора

        Оціночні плати зазвичай мають якийсь відеовихід і, наприклад, кнопки або щось подібне, тому не так вже й складно перенести на них різні аркадні ігри (старі, очевидно, коли вони були з виділеною логікою).

        Очевидно, вже існують дизайни для цього, але створення власного допоможе вам зрозуміти, як вони працюють, і легко додавати функції.

        Reply

  2. Nik каже:

    Жовтень 13, 2026 о 10:48 ранку

    Чудова стаття, Алі! Поведінка “default nettype” — це те, що зачепило всіх, тому ми, ймовірно, повинні татуювати це на своїх лобах…

    Reply

  3. Nik каже:

    Жовтень 13, 2026 о 11:10 ранку

    До речі, щодо метастабільності — те, що Аль описує в статті, є обов’язковим перетворенням асинхронного сигналу в синхронний, де “синхронний” означає “синхронізований з поточним доменновим тактовим сигналом”. Це також можна назвати “реєстрацією” (що означає “пропущено через регістр”) або “реклокінгом” (що означає “синхронізовано з конкретним тактовим сигналом”), або навіть “фільтрами глітчів”, “дебаундерами” (особливо зі сигналами, що надходять від механічних перемикачів) або “синхронізаторами”.

    Я хочу сказати — метастабільність зовнішнього сигналу, що надходить до синхронної цифрової схеми, неможливо усунути. Але кожен крок синхронізації як зменшує ймовірність її виникнення, так і концентрує метастабільну поведінку переважно всередині етапу синхронізації.

    Метастабільність є величезною проблемою як в ASIC, так і в FPGA, і, по суті, всі дизайни повинні вживати практичних заходів для її пом’якшення.

    І нарешті — що таке метастабільність? Це явище, коли синхронна цифрова схема (наприклад, із цифровим тактовим сигналом) починає поводитися божевільно під впливом зовнішнього сигналу з недоречним часом. Тут “божевільно” означає 2 основні, дуже неприємні речі:
    [1] — Цифрова схема припиняє реагувати на зовнішні події сигналу та тактового сигналу.
    [2] — Цифрова схема генерує випадкову, хаотичну серію імпульсних сигналів.

    Тривалість цих імпульсів випадкова, але існують статистичні моделі, що описують її. Основне пояснення: чим більше часу схема перебуває в метастабільному стані, тим вища ймовірність виходу з нього, але фактичний час не обмежений.

    З повагою.
    PS: Будь ласка, не соромтеся ділитися виправленнями будь-яких моїх неправильних тверджень.

    Reply

  4. Pat каже:

    Жовтень 13, 2026 о 11:54 ранку

    “Найпоширеніший спосіб боротьби з цим — затримати сигнал за допомогою кількох тригерів.”

    Метастабільність набагато гірша за це. Ви насправді не можете просто перереєструвати щось, тому що синтез/реалізація не знає, що він не повинен використовувати весь тактовий сигнал для маршрутизації — а в деяких FPGA є спеціальні ресурси для зсувних регістрів, які ви не хочете використовувати для синхронізації тактових сигналів.

    Якщо він використовує весь тактовий сигнал для маршрутизації, ви насправді не даєте йому часу для стабілізації, оскільки наступний регістр все ще бачить нестабільність одразу після його тактування.

    Інструменти Xilinx мають атрибут для цього (ASYNC_REG), тоді як інструменти Altera повинні “магічно виявляти це” (ну так, звісно). Не знаю щодо Gowin — я можу припустити, що вони йдуть шляхом Altera і кажуть: “еее… не турбуйтеся про це”.

    Вам також дійсно потрібне обмеження затримки між джерелом та синхронізатором, тому що якщо ви скажете йому “ти можеш зайняти вічність”… він це зробить. І якщо ваші тактові сигнали швидкі, а FPGA велика, ви можете отримати ДУЖЕ ДИВНІ результати. Зазвичай я просто встановлюю його на період повільнішого з двох тактових сигналів.

    Reply

    1. Iman каже:

      Жовтень 13, 2026 о 2:42 вечора

      Чи можна це пом’якшити, виводячи тактовий сигнал з FPGA на виділений пін і використовуючи зовнішнє обладнання для де-глітчу? Я багато не знаю про цю тему, але це перше, що спадає на думку.

      Reply

      1. Pat каже:

        Жовтень 13, 2026 о 6:33 вечора

        Ні, з кількох причин. По-перше, фактичне виведення з чіпа погіршить проблему, оскільки вихідні буфери сповільнять перехід і розширять область “сигнал змінюється”.

        Але по-друге, FPGA — це насправді чудові синхронізатори, тому що у вас є безліч регістрів, і ви можете упакувати їх неймовірно щільно.

        Проблема не в обладнанні, а в програмному забезпеченні: розуміння вимог до синхронізації при наявності кількох тактових сигналів просто складне, і навіть інженери компаній-виробників FPGA не знають, що потрібно. Серйозно, на форумах Xilinx точаться суперечки між їхніми власними співробітниками щодо цих питань.

        Ключ до роботи з кількома тактовими сигналами — розуміння моделі синхронізації та того, як це працює. Коли це стане зрозумілим, робота з синхронізацією буде легкою.

        Reply

      2. Pat каже:

        Жовтень 14, 2026 о 8:18 ранку

        Також тут є гарна серія статей (це #2, і там є гарна проста графіка) про синхронізацію та те, що потрібно:

        https://www.linkedin.com/pulse/reliable-cdc-constraints-2-counters-fifos-lukas-vik-ist5c/

        Ви помітите, що дата в цій статті — 2024 рік: ці теми насправді є досить новими проблемами, тому що 10-15 років тому FPGA не були настільки швидкими/великими, щоб ви могли отримати ці проблеми — інструменти навіть не мали можливості обмежувати перекоси шини таким чином.

        (Вони також все ще не достатньо добрі, тому що вони неправильно розраховують перекіс шини, але це, мабуть, єдина боротьба, яка мене турбує, тому що інженери Xilinx ніколи не визнавали проблеми, які я подавав).

        Reply

  5. Pat каже:

    Жовтень 14, 2026 о 11:19 ранку

    Привіт, Аль:

    Нарешті я мав нагоду подивитися частину коду, і ви, на жаль, потрапляєте в одну з пасток Verilog: умовні оператори if, що містять непов’язану логіку.

    Як ви згадали, спокусливо думати про Verilog як про програмування, тому ви отримуєте такі речі: “якщо скидання, очистити регістри A і B. Інакше, якщо умова A, збільшити A. Інакше, якщо умова B, збільшити B”.

    Це, наприклад, у модулі дребезгу. Проблема в тому, що це створює залежність від умови A для B, яка не бажана. Іншими словами, якщо виникає умова A, вона ігнорує умову B, і це не відбувається.

    Навіть якщо це нічого не робить (у модулі дребезгу це не зробить нічого поганого), це зазвичай створює зайву логіку, тому що синтезатор недостатньо розумний, щоб зрозуміти, що він нічого не може зробити.

    Отже, наприклад, у модулі дребезгу, ймовірно, є умова, яка генерується для “clean_button”, де, якщо він скидається, він встановлюється на нуль, а потім він встановлюється на sync_ff2 лише якщо досягнуто debounce_count, і sync_ff2 не є clean_button.

    Натомість ви насправді хочете повністю розділити умовні оператори: таким чином, логіка clean_button буде суто “якщо скидання, clean_button = 0, якщо досягнуто debounce_count, захопити sync_ff2. а потім подібна відокремлена логіка для лічильника.

    Збільшення лічильника також коштує дорожче, ніж зменшення і пошук переповнення, але це окреме питання. Множинні оператори всередині умовних операторів набагато небезпечніші.

    Reply

  6. manga_koji каже:

    Жовтень 15, 2026 о 8:11 вечора

    Це не широко відомо, але FPGA від Microchip мають 2 виділені піни, які можна вивести на сигнал усіх логічних елементів.
    Крім того, ви можете динамічно перемикати, який сигнал підключено до цих пінів у реальному часі.
    Оскільки це усуває необхідність повторної компіляції, це надзвичайно зручно
    — набагато зручніше, ніж інші подібні інструменти.

    Reply

Залишити відповідь

Скасувати відповідь

Будь ласка, будьте ввічливими та шанобливими, щоб зробити розділ коментарів чудовим. (Політика коментарів)

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.

Пошук

Ніколи не пропустіть хак

Слідкуйте на facebook

Слідкуйте на twitter

Слідкуйте на youtube

Слідкуйте на rss

Зв’язатися з нами

Підписатися

Якщо ви пропустили

  • FPGA: Готовність до дослідження 8

    So You Want To Make Your SDR Work On Other Frequencies

    20 Коментарів

  • FPGA: Готовність до дослідження 9

    What’s A Nonius?

    9 Коментарів

  • FPGA: Готовність до дослідження 10

    The FPGA Chronicles: Ready To Probe

    11 Коментарів

  • FPGA: Готовність до дослідження 11

    Your Computer Memory Is A Lie

    61 Коментарів

  • FPGA: Готовність до дослідження 12

    Lead A Discord Exodus With A Matrix Server

    62 Коментарів

Більше з цієї категорії

Наші колонки

  • FPGA: Готовність до дослідження 13

    Discovering SDRs Everywhere

    12 Коментарів

  • FPGA: Готовність до дослідження 14

    Hackaday Podcast Episode 391: Tuned In To ESP32 SDR, New Old Pagers, And Bugs On Mars

    Немає коментарів

  • FPGA: Готовність до дослідження 15

    This Week In Security: Critical DNS Keys Rotated, Hacking Freezers Isn’t Cool, OpenAI Spies On Itself, And Advanced Hardware Wallet Hacks

    11 Коментарів

  • FPGA: Готовність до дослідження 16

    2026 Hackaday Supercon: Workshops Are Open!

    11 Коментарів

  • FPGA: Готовність до дослідження 17

    Hackaday Links: October 11, 2026

    5 Коментарів

Більше з цієї категорії

Оригінал статті: hackaday.com

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *