FPGA (ПЛИС) - подключаем кнопку

แชร์
ฝัง
  • เผยแพร่เมื่อ 18 ก.ย. 2024
  • Подключаем кнопку к ПЛИС (FPGA).
    Давим дребезг.
    Другие видео на тему:
    Подключаем к ПЛИС(FPGA):
    • Подключаем к ПЛИС(FPGA)
    Verilog HDL - язык проектирования схем:
    • Verilog - Язык Проекти...
    Quartus Prime:
    • Quartus
    Цифровая схемотехника:
    • Цифровая схемотехника

ความคิดเห็น • 70

  • @sttalex
    @sttalex 4 หลายเดือนก่อน

    Мне просто не понятно, почему так мало просмотров? Всю жизнь мечтал иметь такого преподавателя. Отличная подача, полная и читая речь! Огромное спасиботавьлру за его титанический труд на канале! Вот бы сказать все. На ттю е смотреть неудобно совсем!

    • @ПЛИСоводство
      @ПЛИСоводство  4 หลายเดือนก่อน

      Просто тема эта уж очень узкоспециализированная.

  • @kardanium
    @kardanium 5 ปีที่แล้ว +6

    Я сам начинающий в FPGA, но хорошо знаком с микроконтроллерами. Потому я в ПЛИС реализовал такой же антидребезг, какой применяю в МК. Суть простая. В МК я просто щупаю кнопку, и если она нажата, то опрашиваю ее и инкрементирую переменную. Если пропал контакт (дребезг), то переменную сбрасываю. И как только переменная будет проинкрементирована до определенного значения (установился стабильный лог. уровень), считаю кнопку нажатой. Точно так же я поступил и в FPGA. Сделал счетчик на сумматоре с D-триггерами и одним элементом И. Кнопка подключена к асинхронным сбросам D-триггеров через отдельный D-триггер для синхронности, тактовая подключена через элемент "И" и выход старшего разряда счетчика. Когда кнопка отпущена, счетчик постоянно в состоянии нуля и ничего не считает. Как только кнопка нажмется, счетчик начинает считать. Если контакт прервется раньше времени, счетчик тут же сбросится в ноль. Контакт снова восстанавливается и счетчик начинает считать заново. Как только он досчитает до конца (старший разряд встанет в единицу), то элементом И разрывается тактовая частота и счет замораживается. Как только кнопку отпустят, счетчик сбрасывается. Даже если будет дребезг при отпускании, то он не вызовет дребезжание на выходе модуля.
    В моем примере выходит экономнее. А если сделать общий делитель тактовой частоты для всех кнопок (если их несколько), то можно еще сэкономить на D-триггерах.
    Собственно, код:
    module BT_IN(input wire BUTTON,
    input wire CLK,
    output wire OUT);
    // Синхронизация сигнала с кнопки
    reg KEY_TRIG; // Синхронизатор сигнала с кнопки
    wire BUTTON_SYNC = KEY_TRIG;
    always@(posedge CLK)begin
    KEY_TRIG

    • @ПЛИСоводство
      @ПЛИСоводство  5 ปีที่แล้ว +4

      Приветствую!
      Во-первых: переопределение wire BUTTON_SYNC = KEY_TRIG; лишнее, вполне можно обойтись без него, KEY_TRIG можно использовать напрямую.
      Теперь о конструкции wire iCLK = (CLK & ~ DEBOUNCE_CNT[17]); Так делать нехорошо. Это называется асинхронное проектирование, называемое ещё асинхронщиной.
      Суть в том что тактовый сигнал нельзя ни с чем замешивать, он должен доходить до тактовых входов чистым. Подробности тут
      th-cam.com/video/82MIcxi5pPo/w-d-xo.html
      и тут
      th-cam.com/video/101az-mZFOA/w-d-xo.html
      Останов счётчика лучше делать не путём перекрытия тактового сигнала, а делать его синхронным:
      always@(posedge iCLK or posedge BUTTON_SYNC)
      begin
      if(BUTTON_SYNC)
      begin
      DEBOUNCE_CNT[17:0]

  • @Zack-ti1lj
    @Zack-ti1lj หลายเดือนก่อน

    спасибо за видео, очень грамотно подан материал😃

  • @Ma_X64
    @Ma_X64 ปีที่แล้ว +1

    Вообще говоря, ПЛИС -- очень простая и понятная штука после МК.

    • @ПЛИСоводство
      @ПЛИСоводство  ปีที่แล้ว

      Так-то да, если не считать всяких нюансов на вроде синхронизации разных тактовых доменов и прочих правил синхронного проектирования.

    • @Ma_X64
      @Ma_X64 ปีที่แล้ว

      @@ПЛИСоводство это уже на больших скоростях проявляется, да и здесь удобнее следовать рекомендациям, чем сидеть раздуплять всё на низком уровне. Но если когда-нибудь с микросхемами логики игрался, тоже поймёшь.

    • @ПЛИСоводство
      @ПЛИСоводство  ปีที่แล้ว

      @@Ma_X64 Ну не скажи, на больших скоростях проблемы с метастабильностью появляются, а вот чтобы пересинхронизироваться правильно бывает приходится голову поломать.

  • @vadimgerasimenko4904
    @vadimgerasimenko4904 5 หลายเดือนก่อน

    Прекрасно!

  • @user-bk6vb5br9v
    @user-bk6vb5br9v ปีที่แล้ว

    Имею вам сказать, что вы гений, если умудрились со всем этим разобраться. Я недавно начал изучать микроконтроллеры, это тихий ужас, очень сложно, башка дымит. И это самые элементарные вещи, типа мигать диодами, и подобные игрушки. А эти ваши плисы, как говорят, еще сложнее микроконтроллеров. Самое сложное, это программирование. Я раньше к программированию отношения не имел, а тут нужно освоить СИ, и это жесть.
    Хотелось бы и плисы осилить, как с МК немного разберусь, но мне кажется, тупо не вывезу, ума не хватит.

    • @ПЛИСоводство
      @ПЛИСоводство  ปีที่แล้ว

      С непривычки всегда так, дальше пойдёт легче. А так да, для освоения плисов желательны хотя бы базовые навыки в программировании - знать что такое условия, циклы.

    • @user-bk6vb5br9v
      @user-bk6vb5br9v ปีที่แล้ว

      @@ПЛИСоводство Плисы тоже на СИ, или там какой-то свой язык, который нужно учить с нуля? И что для начинающего будет проще освоить, Altera или Xilinx? С чего посоветуете начинать?

    • @ПЛИСоводство
      @ПЛИСоводство  ปีที่แล้ว

      @@user-bk6vb5br9v Язык verilog или vhdl. По верилогу есть курс на этом канале. Начинающему лучше Альтера подойдёт, САПР Quartus более дружелюбный, компилирует быстрее и не так тормозит, но это если старую версию брать, оптимальная 9.1sp2, как раз поддерживает плисину Cyclone 4, у китайцев отладку на её базе можно взять относительно незадорого.

    • @user-bk6vb5br9v
      @user-bk6vb5br9v ปีที่แล้ว

      @@ПЛИСоводство Спасибо за информацию. Я видел на вашем канале курсы, но мне пока туда рано лезть, нужно теорию подтянуть. А вообще, мне эта вся цифровая электроника нужна для постройки аудио аппаратуры. Люблю слушать музыку и конструировать разные усилители, ламповые и транзисторные. И вот, решил собрать свой ЦАП, и тут без цифры никак.
      Для старта хочу собрать USB - I2S конвертер, подключить его к чипу Texas Instrument или Analog Devices, и послушать как оно зазвучит. А дальше хочу сделать читалку флешек, с кнопками, текстовым дисплеем, чтобы отвязать аудио систему от компа. Воткнул флешку, и слушаешь музыку.
      И программа максимум - запрограммировать плисину, чтобы она работала как дельтасигма цап. В чём там прикол я не знаю, но те кто слушал эту штуку, говорят, что звучит оно очень круто. Как это реализовать, пока что малейшего понятия не имею, но буду копать всё подряд, может и разберусь.
      Сейчас купил готовый USB - I2S конвертер, китайский клон Amanero и подключил к цапу PCM 5102A. Звук так себе, но оно заработало, и это радует. Работы непочатый край, но таки интересно.

    • @ПЛИСоводство
      @ПЛИСоводство  ปีที่แล้ว

      @@user-bk6vb5br9v Я не аудиофил, во всей этой теме усилителей не разбираюсь, так что ничего путного посоветовать не могу. На вскидку, для всего перечисленного достаточно и микроконтроллера. А что там за такой сигмадельта цап не знаю, возможно без плисины и никак.

  • @ЕаАс-ч4з
    @ЕаАс-ч4з 3 ปีที่แล้ว +2

    Что бы не городить этот "затратный" механизм,
    бороться надо с дребезгом аппаратно, как это
    делается во всех плк.

    • @ПЛИСоводство
      @ПЛИСоводство  3 ปีที่แล้ว +2

      Об аппаратном способе было упомянуто в видео, но и "программный" метод встречается довольно часто, он, хоть и немного, но позволяет экономить место на печатной плате.

    • @ЕаАс-ч4з
      @ЕаАс-ч4з 3 ปีที่แล้ว +1

      @@ПЛИСоводство программу
      можно затереть. Обрабатывать надо случайное нажатие или 2-х секундное нажатие например (активация какой-нибудь хреньки).

    • @ПЛИСоводство
      @ПЛИСоводство  3 ปีที่แล้ว

      @@ЕаАс-ч4з Если программа затрётся, то она затрётся вся и уже не важно будет как там сделано подавление дребезга, а чтобы затёрлась именно та часть, и при этом не попортилось остальное, это надо чтобы ну очень сильно повезло. А обработка случайных нажатий (не факт что нужна) это уже несколько другая задача, хотя и решается теми же способами.

    • @ЕаАс-ч4з
      @ЕаАс-ч4з 3 ปีที่แล้ว

      @@ПЛИСоводство я больше по пром. системам, там ещё как актуально.

  • @georgijorlov8945
    @georgijorlov8945 ปีที่แล้ว +1

    поржал про 3-х выводную кнопку))))) я ж не думаю что те кто этого не понимают будут смотреть данный курс

  • @None-sh9sw
    @None-sh9sw 5 ปีที่แล้ว +1

    Отличная фраза на 25:57 "широтно-импульсной манипуляции".
    Насколько плох вариант если не 16 битный счетчик, а например 2-3-4 бита и использовать медленный тактовый сигнал, например на килогерц-другой (поделив например основной тактовый сигнал другим счетчиком) ? В CPLD триггеров не так много и нужно экономить.
    Или например поставить 2 подряд D триггера и их выходы смотреть - оба в 00 - 0 на входе, оба в 11 - 1 на входе (через мультиплексор получится типа "гистерезис" сделать на переходных состояниях 01 и 10) и тактировать их тоже "медленным" синхросигналом, например в 64 Гц ?

    • @Константин-у9у8и
      @Константин-у9у8и 5 ปีที่แล้ว

      Если экономить , то можно использовать сдвиговый регистр с обратной связью

    • @ПЛИСоводство
      @ПЛИСоводство  5 ปีที่แล้ว

      Ну как бы да, ШИМ - это"манипуляция", "модуляция" это несколько другое.
      Да, можно взять частоту помедленнее, тогда и разрядность счётчика уменьшится. Но делить высокую частоту другим счётчиком - не вариант, этот другой счётчик тоже место отъест, оно то на то и выйдет. Так что только генератор взять более медленный, если возможно.
      Про триггеры с мультиплексором не совсем понял, но тут опять вопрос, где частоту в 64Гц взять.

    • @ПЛИСоводство
      @ПЛИСоводство  5 ปีที่แล้ว

      @@Константин-у9у8и Можно по-подробнее про сдвиговый регистр?

    • @ПЛИСоводство
      @ПЛИСоводство  5 ปีที่แล้ว

      @@None-sh9sw В принципе, код работать должен, в том случае, если кнопка не даёт случайных замыканий. Ну т.е. если взять плату и об стол хорошенько жахнуть, так что кнопка самонажмётся на короткое время. Тогда триггер XS1_Q1 захватит этот короткий импульс, на следующем такте он передастся в XS1_Q2, а XS1_Q1 захватит пассивное состояние кнопки, в case обнаружится разница 2'b01: TT1 = 1'd1;, и т.д. Т.е. хоть и малая, но есть вероятность того что схема сработает по короткому ложному импульсу на кнопке. Но это в том случае, если кнопка может давать случайные замыкания, если нет - то норм. И если нет, то не проще ли использовать вариант с асинхронным триггером (11:30)? Никаких счётчиков, вопрос решается одним триггером. Надо будет по 2 контакта на кнопку и скорее всего придётся использовать внешнюю, но если вопрос о экономии в CPLD так жёстко стоит...

    • @Константин-у9у8и
      @Константин-у9у8и 5 ปีที่แล้ว

      @@ПЛИСоводствоИнфа есть в вики , я же узнал о таком использовании в книге "Проектирование на плис . Курс молодого бойца " автор Клайф Максфилд , там целая глава ему посвящена ( приложение В). Книгу скачивал с инета , ссылки нету , но там легко найти .
      Суть в том , что можно обходиться без счётчиков , триггеры естественно нужны , те же 16 штук . Сдвиговый регистр с обратной связью перебирает внутри себя все значения не повторяясь , 2^16-1 значений , а потом всё по кругу снова и снова . Но значения идут не по порядку как в счётчике , но в данном случае это и не нужно .

  • @КонстантинВасинский
    @КонстантинВасинский ปีที่แล้ว

    На 9:57 можно видит if(!X) но по моему должно быть if(X) далее Вы сами пишете if(FY), а не if(!FY).

    • @ПЛИСоводство
      @ПЛИСоводство  ปีที่แล้ว

      Этот if(!X) был написан ещё на 5:50 и отражает попытку заставить светодиод менять своё состояние по каждому нажатию на кнопку. Далее идёт разбор почему такой простой подход не работает.

  • @paloosalama
    @paloosalama 5 ปีที่แล้ว +2

    Расскажите, пожалуйста, про qsys

  • @АндрейКостиков-ь4х
    @АндрейКостиков-ь4х ปีที่แล้ว

    как полагаете , такое применимо
    module test0000 #(
    parameter DIMENSION = 22
    )(
    input logic clk,
    input logic reset,
    input logic input_signal,
    output logic output_signal
    );
    logic [DIMENSION+1:0] Q_counter;
    logic Qinc;
    logic Qdec;
    logic overflow;
    assign overflow = ~Q_counter[DIMENSION+1] & Q_counter[DIMENSION];
    logic empty;
    assign empty = Q_counter[DIMENSION+1] & Q_counter[DIMENSION];
    logic output_update;
    assign output_update = overflow ^ empty;
    always_ff @ (posedge clk, posedge reset) begin
    if (reset) begin
    Q_counter

    • @ПЛИСоводство
      @ПЛИСоводство  ปีที่แล้ว

      Не совсем понятна логика формирования Qdec. Если input_signal в нуле И если empty в нуле то вычитать. Т.е. если нет input_signal И счётчик НЕ пустой то делать декремент - странно. Симуляция что показывает?

    • @АндрейКостиков-ь4х
      @АндрейКостиков-ь4х ปีที่แล้ว

      @@ПЛИСоводство как мне кажеться я немного освоился с плис,, у меня стадия идеи фикс - максимальные скорости.
      в данном случае используем быстрый сумматор заложенный в базовых элементах плис для определения крайних событий и отказ от &counter и |counter.
      крайнее положительное событие , это 00_xxxx + 1 = 01_xxxx , бит переполнения для сложения ,сохраненный в следующем старшем разряде,
      крайнее отрицательное событие , это 00_xxxx - 1( или +11_1111 ) = 11_1111, мы перешли через ноль , всюду еденицы , два старших добавленных бита используються для этого определения.
      событие наступает и блокирует дальнейшее движение в заданном направлении.
      то есть мы сводим задачу выделения нужного события к неболее чем четырех входовой логике , что полагаю есть оптимально для циклонов
      ( шести входовая логика мне недоступна , непройден даун тест по скачиванию и установке ПО на хилинг ,, банят , недают скачать ,,может подскажете как скачать? )

    • @ПЛИСоводство
      @ПЛИСоводство  ปีที่แล้ว

      @@АндрейКостиков-ь4х "как мне кажеться я немного освоился с плис"
      Могу посоветовать сначала схему на элементах нарисовать, а потом уже её пытаться закодить. Так будет значительно понятнее. Плюс к этому надо смотреть RTL-viewer и сравнивать схему которую выдал компилятор со своей. Ну и симуляция само собой.
      "на хилинг ,, банят , недают скачать ,,может подскажете как скачать?"
      Предлагаю поискать в сетях работающих по распределённому принципу.

  • @arielvolog
    @arielvolog 5 หลายเดือนก่อน

    черный фон в редакторе кода - вы серьезно

  • @turintretogor91
    @turintretogor91 2 ปีที่แล้ว

    Планируются ли ролики по DSP-проессорам?

  • @andreyparovozz
    @andreyparovozz 6 หลายเดือนก่อน

    Дребезг подавляется очень просто - период опроса кнопки должен превышать период дребезга.

    • @ПЛИСоводство
      @ПЛИСоводство  6 หลายเดือนก่อน

      Это будет не сильно проще, а может быть даже и сложнее. Счётчик в любом случае остаётся, да ещё условие с переходом возникает.
      1. Ждём изменение в сигнале;
      2. Запускаем выдержку;
      3. Ещё раз опрашиваем сигнал. Если сигнал изменился фиксируем факт нажатия кнопки. Если не изменился значит случайное кратковременное замыкание контактов, возвращаемся на п. 1.

    • @andreyparovozz
      @andreyparovozz 6 หลายเดือนก่อน

      @@ПЛИСоводство В железе это реализуется просто - D триггер тактируется с частотой 50-100 Гц. При этом состояние триггера будет отображать состояние кнопки.
      Самопроизвольное замыкание контактов может быть только в одном случае - кнопка неисправна. Могу допустить самопроизвольное размыкание контактов от, например, вибрации. Но в условиях вибрации и решения другие.

    • @ПЛИСоводство
      @ПЛИСоводство  6 หลายเดือนก่อน

      @@andreyparovozz Думаю как раз наоборот, при вибрации на нажатой кнопке контакт не отскочит, ибо прижат пальцем, а вот на отпущенной силы возвратной пружины может не хватить. И как мне кажется предложный в видео вариант вполне справится с задачей и в условиях вибрации.

    • @andreyparovozz
      @andreyparovozz 6 หลายเดือนก่อน

      @@ПЛИСоводство В особо ответственных ситуациях ставятся две пары контактов - одна НО, другая НЗ.

    • @ПЛИСоводство
      @ПЛИСоводство  6 หลายเดือนก่อน

      @@andreyparovozz Ну если говорить о вибрации, то, скорее всего, и трёхконтактная кнопка не поможет, тут принципиальной разницы с двухконтактной нет. Тут или всё таки алгоритмически решать, или уже как-то механикой самой кнопки, типа жёстче пружину ставить или ещё что.

  • @nvv1305
    @nvv1305 3 ปีที่แล้ว

    Добрый день, а вот так бы, помогло от дребезга контактов?
    (* chip_pin="11", altera_attribute = "-name IO_STANDARD \"3.3V SCHMITT TRIGGER INPUT\"" *) input X,

    • @ПЛИСоводство
      @ПЛИСоводство  3 ปีที่แล้ว +1

      >SCHMITT TRIGGER
      А он в Циклоне 4 есть?

    • @nvv1305
      @nvv1305 3 ปีที่แล้ว

      @@ПЛИСоводство нету, извиняюсь, был невнимательным..
      я пользуюсь EPM240T100C5
      для изучения, ПЛИС, а там есть...

    • @ПЛИСоводство
      @ПЛИСоводство  3 ปีที่แล้ว

      @@nvv1305 И как, хватает для изучения логического объёма, там же вроде элементов мало?

    • @nvv1305
      @nvv1305 3 ปีที่แล้ว

      @@ПЛИСоводство не хватает, но..
      так получилось, что когда я искал, что нибудь для начинающего по ПЛИС
      нашел вот это
      marsohod.org/projects/plata1
      ну, и заказал платку на EPM240T100C5 (вместе с бластером) из Китая.
      Думал так, если будет интересно (получаться что нибудь), тогда и закажу что то посерьезнее.

    • @ПЛИСоводство
      @ПЛИСоводство  3 ปีที่แล้ว +1

      @@nvv1305 Ясн. Ну желаю успехов в освоении ПЛИС, надеюсь мои видосы будут полезны.

  • @AS-ws9pp
    @AS-ws9pp 4 หลายเดือนก่อน

    Что значит 1'd1 ?

    • @ПЛИСоводство
      @ПЛИСоводство  4 หลายเดือนก่อน

      1' - одноразрядная; d - в децимальном виде. На канале есть плейлист с видео по Верилогу, там всё подробно рассказываю.

  • @sovchem1275
    @sovchem1275 5 ปีที่แล้ว

    +1