FPGA (ПЛИС) - подключаем кнопку
ฝัง
- เผยแพร่เมื่อ 18 ก.ย. 2024
- Подключаем кнопку к ПЛИС (FPGA).
Давим дребезг.
Другие видео на тему:
Подключаем к ПЛИС(FPGA):
• Подключаем к ПЛИС(FPGA)
Verilog HDL - язык проектирования схем:
• Verilog - Язык Проекти...
Quartus Prime:
• Quartus
Цифровая схемотехника:
• Цифровая схемотехника
Мне просто не понятно, почему так мало просмотров? Всю жизнь мечтал иметь такого преподавателя. Отличная подача, полная и читая речь! Огромное спасиботавьлру за его титанический труд на канале! Вот бы сказать все. На ттю е смотреть неудобно совсем!
Просто тема эта уж очень узкоспециализированная.
Я сам начинающий в 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
Приветствую!
Во-первых: переопределение 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]
спасибо за видео, очень грамотно подан материал😃
Вообще говоря, ПЛИС -- очень простая и понятная штука после МК.
Так-то да, если не считать всяких нюансов на вроде синхронизации разных тактовых доменов и прочих правил синхронного проектирования.
@@ПЛИСоводство это уже на больших скоростях проявляется, да и здесь удобнее следовать рекомендациям, чем сидеть раздуплять всё на низком уровне. Но если когда-нибудь с микросхемами логики игрался, тоже поймёшь.
@@Ma_X64 Ну не скажи, на больших скоростях проблемы с метастабильностью появляются, а вот чтобы пересинхронизироваться правильно бывает приходится голову поломать.
Прекрасно!
Имею вам сказать, что вы гений, если умудрились со всем этим разобраться. Я недавно начал изучать микроконтроллеры, это тихий ужас, очень сложно, башка дымит. И это самые элементарные вещи, типа мигать диодами, и подобные игрушки. А эти ваши плисы, как говорят, еще сложнее микроконтроллеров. Самое сложное, это программирование. Я раньше к программированию отношения не имел, а тут нужно освоить СИ, и это жесть.
Хотелось бы и плисы осилить, как с МК немного разберусь, но мне кажется, тупо не вывезу, ума не хватит.
С непривычки всегда так, дальше пойдёт легче. А так да, для освоения плисов желательны хотя бы базовые навыки в программировании - знать что такое условия, циклы.
@@ПЛИСоводство Плисы тоже на СИ, или там какой-то свой язык, который нужно учить с нуля? И что для начинающего будет проще освоить, Altera или Xilinx? С чего посоветуете начинать?
@@user-bk6vb5br9v Язык verilog или vhdl. По верилогу есть курс на этом канале. Начинающему лучше Альтера подойдёт, САПР Quartus более дружелюбный, компилирует быстрее и не так тормозит, но это если старую версию брать, оптимальная 9.1sp2, как раз поддерживает плисину Cyclone 4, у китайцев отладку на её базе можно взять относительно незадорого.
@@ПЛИСоводство Спасибо за информацию. Я видел на вашем канале курсы, но мне пока туда рано лезть, нужно теорию подтянуть. А вообще, мне эта вся цифровая электроника нужна для постройки аудио аппаратуры. Люблю слушать музыку и конструировать разные усилители, ламповые и транзисторные. И вот, решил собрать свой ЦАП, и тут без цифры никак.
Для старта хочу собрать USB - I2S конвертер, подключить его к чипу Texas Instrument или Analog Devices, и послушать как оно зазвучит. А дальше хочу сделать читалку флешек, с кнопками, текстовым дисплеем, чтобы отвязать аудио систему от компа. Воткнул флешку, и слушаешь музыку.
И программа максимум - запрограммировать плисину, чтобы она работала как дельтасигма цап. В чём там прикол я не знаю, но те кто слушал эту штуку, говорят, что звучит оно очень круто. Как это реализовать, пока что малейшего понятия не имею, но буду копать всё подряд, может и разберусь.
Сейчас купил готовый USB - I2S конвертер, китайский клон Amanero и подключил к цапу PCM 5102A. Звук так себе, но оно заработало, и это радует. Работы непочатый край, но таки интересно.
@@user-bk6vb5br9v Я не аудиофил, во всей этой теме усилителей не разбираюсь, так что ничего путного посоветовать не могу. На вскидку, для всего перечисленного достаточно и микроконтроллера. А что там за такой сигмадельта цап не знаю, возможно без плисины и никак.
Что бы не городить этот "затратный" механизм,
бороться надо с дребезгом аппаратно, как это
делается во всех плк.
Об аппаратном способе было упомянуто в видео, но и "программный" метод встречается довольно часто, он, хоть и немного, но позволяет экономить место на печатной плате.
@@ПЛИСоводство программу
можно затереть. Обрабатывать надо случайное нажатие или 2-х секундное нажатие например (активация какой-нибудь хреньки).
@@ЕаАс-ч4з Если программа затрётся, то она затрётся вся и уже не важно будет как там сделано подавление дребезга, а чтобы затёрлась именно та часть, и при этом не попортилось остальное, это надо чтобы ну очень сильно повезло. А обработка случайных нажатий (не факт что нужна) это уже несколько другая задача, хотя и решается теми же способами.
@@ПЛИСоводство я больше по пром. системам, там ещё как актуально.
поржал про 3-х выводную кнопку))))) я ж не думаю что те кто этого не понимают будут смотреть данный курс
Да я сам угарел с этого.
Отличная фраза на 25:57 "широтно-импульсной манипуляции".
Насколько плох вариант если не 16 битный счетчик, а например 2-3-4 бита и использовать медленный тактовый сигнал, например на килогерц-другой (поделив например основной тактовый сигнал другим счетчиком) ? В CPLD триггеров не так много и нужно экономить.
Или например поставить 2 подряд D триггера и их выходы смотреть - оба в 00 - 0 на входе, оба в 11 - 1 на входе (через мультиплексор получится типа "гистерезис" сделать на переходных состояниях 01 и 10) и тактировать их тоже "медленным" синхросигналом, например в 64 Гц ?
Если экономить , то можно использовать сдвиговый регистр с обратной связью
Ну как бы да, ШИМ - это"манипуляция", "модуляция" это несколько другое.
Да, можно взять частоту помедленнее, тогда и разрядность счётчика уменьшится. Но делить высокую частоту другим счётчиком - не вариант, этот другой счётчик тоже место отъест, оно то на то и выйдет. Так что только генератор взять более медленный, если возможно.
Про триггеры с мультиплексором не совсем понял, но тут опять вопрос, где частоту в 64Гц взять.
@@Константин-у9у8и Можно по-подробнее про сдвиговый регистр?
@@None-sh9sw В принципе, код работать должен, в том случае, если кнопка не даёт случайных замыканий. Ну т.е. если взять плату и об стол хорошенько жахнуть, так что кнопка самонажмётся на короткое время. Тогда триггер XS1_Q1 захватит этот короткий импульс, на следующем такте он передастся в XS1_Q2, а XS1_Q1 захватит пассивное состояние кнопки, в case обнаружится разница 2'b01: TT1 = 1'd1;, и т.д. Т.е. хоть и малая, но есть вероятность того что схема сработает по короткому ложному импульсу на кнопке. Но это в том случае, если кнопка может давать случайные замыкания, если нет - то норм. И если нет, то не проще ли использовать вариант с асинхронным триггером (11:30)? Никаких счётчиков, вопрос решается одним триггером. Надо будет по 2 контакта на кнопку и скорее всего придётся использовать внешнюю, но если вопрос о экономии в CPLD так жёстко стоит...
@@ПЛИСоводствоИнфа есть в вики , я же узнал о таком использовании в книге "Проектирование на плис . Курс молодого бойца " автор Клайф Максфилд , там целая глава ему посвящена ( приложение В). Книгу скачивал с инета , ссылки нету , но там легко найти .
Суть в том , что можно обходиться без счётчиков , триггеры естественно нужны , те же 16 штук . Сдвиговый регистр с обратной связью перебирает внутри себя все значения не повторяясь , 2^16-1 значений , а потом всё по кругу снова и снова . Но значения идут не по порядку как в счётчике , но в данном случае это и не нужно .
На 9:57 можно видит if(!X) но по моему должно быть if(X) далее Вы сами пишете if(FY), а не if(!FY).
Этот if(!X) был написан ещё на 5:50 и отражает попытку заставить светодиод менять своё состояние по каждому нажатию на кнопку. Далее идёт разбор почему такой простой подход не работает.
Расскажите, пожалуйста, про qsys
С qsys-сом всё сложно. Я бы сам послушал.
как полагаете , такое применимо
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 И счётчик НЕ пустой то делать декремент - странно. Симуляция что показывает?
@@ПЛИСоводство как мне кажеться я немного освоился с плис,, у меня стадия идеи фикс - максимальные скорости.
в данном случае используем быстрый сумматор заложенный в базовых элементах плис для определения крайних событий и отказ от &counter и |counter.
крайнее положительное событие , это 00_xxxx + 1 = 01_xxxx , бит переполнения для сложения ,сохраненный в следующем старшем разряде,
крайнее отрицательное событие , это 00_xxxx - 1( или +11_1111 ) = 11_1111, мы перешли через ноль , всюду еденицы , два старших добавленных бита используються для этого определения.
событие наступает и блокирует дальнейшее движение в заданном направлении.
то есть мы сводим задачу выделения нужного события к неболее чем четырех входовой логике , что полагаю есть оптимально для циклонов
( шести входовая логика мне недоступна , непройден даун тест по скачиванию и установке ПО на хилинг ,, банят , недают скачать ,,может подскажете как скачать? )
@@АндрейКостиков-ь4х "как мне кажеться я немного освоился с плис"
Могу посоветовать сначала схему на элементах нарисовать, а потом уже её пытаться закодить. Так будет значительно понятнее. Плюс к этому надо смотреть RTL-viewer и сравнивать схему которую выдал компилятор со своей. Ну и симуляция само собой.
"на хилинг ,, банят , недают скачать ,,может подскажете как скачать?"
Предлагаю поискать в сетях работающих по распределённому принципу.
черный фон в редакторе кода - вы серьезно
А что не так?
Планируются ли ролики по DSP-проессорам?
В ближайшее время точно нет.
Дребезг подавляется очень просто - период опроса кнопки должен превышать период дребезга.
Это будет не сильно проще, а может быть даже и сложнее. Счётчик в любом случае остаётся, да ещё условие с переходом возникает.
1. Ждём изменение в сигнале;
2. Запускаем выдержку;
3. Ещё раз опрашиваем сигнал. Если сигнал изменился фиксируем факт нажатия кнопки. Если не изменился значит случайное кратковременное замыкание контактов, возвращаемся на п. 1.
@@ПЛИСоводство В железе это реализуется просто - D триггер тактируется с частотой 50-100 Гц. При этом состояние триггера будет отображать состояние кнопки.
Самопроизвольное замыкание контактов может быть только в одном случае - кнопка неисправна. Могу допустить самопроизвольное размыкание контактов от, например, вибрации. Но в условиях вибрации и решения другие.
@@andreyparovozz Думаю как раз наоборот, при вибрации на нажатой кнопке контакт не отскочит, ибо прижат пальцем, а вот на отпущенной силы возвратной пружины может не хватить. И как мне кажется предложный в видео вариант вполне справится с задачей и в условиях вибрации.
@@ПЛИСоводство В особо ответственных ситуациях ставятся две пары контактов - одна НО, другая НЗ.
@@andreyparovozz Ну если говорить о вибрации, то, скорее всего, и трёхконтактная кнопка не поможет, тут принципиальной разницы с двухконтактной нет. Тут или всё таки алгоритмически решать, или уже как-то механикой самой кнопки, типа жёстче пружину ставить или ещё что.
Добрый день, а вот так бы, помогло от дребезга контактов?
(* chip_pin="11", altera_attribute = "-name IO_STANDARD \"3.3V SCHMITT TRIGGER INPUT\"" *) input X,
>SCHMITT TRIGGER
А он в Циклоне 4 есть?
@@ПЛИСоводство нету, извиняюсь, был невнимательным..
я пользуюсь EPM240T100C5
для изучения, ПЛИС, а там есть...
@@nvv1305 И как, хватает для изучения логического объёма, там же вроде элементов мало?
@@ПЛИСоводство не хватает, но..
так получилось, что когда я искал, что нибудь для начинающего по ПЛИС
нашел вот это
marsohod.org/projects/plata1
ну, и заказал платку на EPM240T100C5 (вместе с бластером) из Китая.
Думал так, если будет интересно (получаться что нибудь), тогда и закажу что то посерьезнее.
@@nvv1305 Ясн. Ну желаю успехов в освоении ПЛИС, надеюсь мои видосы будут полезны.
Что значит 1'd1 ?
1' - одноразрядная; d - в децимальном виде. На канале есть плейлист с видео по Верилогу, там всё подробно рассказываю.
+1