gibson1980 0 5 марта, 2019 Опубликовано 5 марта, 2019 · Жалоба 4 минуты назад, oleg679976 сказал: Других способов не смог пока придумать. А другие способы и не нужны. По вашей ссылке все три случая описаны, что проще некуда, причем как для HDL так и для схематика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 5 марта, 2019 Опубликовано 5 марта, 2019 · Жалоба 23 минуты назад, oleg679976 сказал: К сожалению, не понял как работает модуль. Был бы очень благодарен, если бы вы объяснили подробнее сюда или в личные сообщения. Или, если бесит мой низкий уровень знаний и понимания верилога, можно не объяснять) always @(posedge clk) frnt<={frnt[1:0],in}; <-каждый такт тактовой частоты записываем в сдвиговый регистр состояние входа if (frnt[2:0]==3'b011) sch<=sch+1; <-проверяем условие фронта, ищем совпадение с эталоном Если на входе постоянно ноль то сдвиговый регистр заполнится нулями будет : 3'b000 если на входе появляется единица то сдвиговый регистр станет выглядеть так:3'b001 на следующий такт : 3'b011 на следующий такт : 3'b111 если пропадёт единица со входа то: 3'b110 на следующий такт : 3'b100 на следующий такт : 3'b000 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
oleg679976 0 5 марта, 2019 Опубликовано 5 марта, 2019 · Жалоба 1 минуту назад, Lmx2315 сказал: always @(posedge clk) frnt<={frnt[1:0],in}; <-каждый такт тактовой частоты записываем в сдвиговый регистр состояние входа if (frnt[2:0]==3'b011) sch<=sch+1; <-проверяем условие фронта, ищем совпадение с эталоном Если на входе постоянно ноль то сдвиговый регистр заполнится нулями будет : 3'b000 если на входе появляется еденица то сдвиговый регистр станет выглядеть так:3'b001 на следующий такт : 3'b011 на следующий такт : 3'b111 если пропадёт еденица со входа то: 3'b110 на следующий такт : 3'b100 на следующий такт : 3'b000 Спасибо за объяснение! Весьма интересное решения, я б до такого не додумался. Плюс сразу понял к чему здесь запас по частоте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gibson1980 0 5 марта, 2019 Опубликовано 5 марта, 2019 · Жалоба Согласен, решение оригинальное. Два в одном, отлов фронта(спада) и защита от дребезга. Возьму на заметку, спасибо. p.s. Мда, новый форум конечно жесть. Код вставить невозможно по человечески, ник в сообщение тоже через ж вставляется и после его удаления шрифт какого-то стал жирный и назад не вернуть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 5 марта, 2019 Опубликовано 5 марта, 2019 · Жалоба 15 минут назад, gibson1980 сказал: Согласен, решение оригинальное. Два в одном, отлов фронта(спада) и защита от дребезга. Возьму на заметку, спасибо. Вы правы - да можно бороться с дребезгом + борьба с метастабильностью, нужно только в условии не учитывать нулевой бит, а сравнивать с первого и дальше. Особенно если сделать сдвиговый регистр поглубже . з.ы. изобретение не моё Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 5 марта, 2019 Опубликовано 5 марта, 2019 · Жалоба 6 минут назад, Lmx2315 сказал: Вы правы - да можно бороться с дребезгом + борьба с метастабильностью, нужно только в условии не учитывать нулевой бит, а сравнивать с первого и дальше. Особенно если сделать сдвиговый регистр поглубже . А для сравнения представим следующее. "Рисуем" текстом автомат. И в нужных состояниях делаем то что задумано... Например в состоянии "3'b011" делаем вот это: sch<=sch+1... Ну и далее, как задумано в проекте. Причем в конкретных состояниях и будет импульс когда "выделен фронт"... Сдвиговый же регистр, о котором писали выше получится автоматически, как регистр FSM... С точки зрения железа - тоже самое, а вот с точки зрения проекта - все гораздо проще... Ну и про дребезг... Если триггера сдвигового регистра находятся не "вместе", а разбросаны по кристаллу, то вполне возможна ситуация, когда один из триггеров "не сдвинет"... Так что это лучше делать отдельно.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvlwork 0 6 марта, 2019 Опубликовано 6 марта, 2019 · Жалоба 18 часов назад, Lmx2315 сказал: if (frnt[2:0]==3'b011) frnt[0] попадает в метастабильность. Так что лучше уж frnt[2:1] == 2'b01 IMHO. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
druzhin 4 6 марта, 2019 Опубликовано 6 марта, 2019 · Жалоба On 3/5/2019 at 12:32 PM, oleg679976 said: Я даже на своем уровне знаний про ПЛИС и цифровую схемотехнику в целом, в принципе понимаю, что синхронный автомат должен изменять свои состояния по фронту, так что использовать инверсные клок не лучшая идея. У меня в проекте инверсный клок нужен для того, чтобы считать импульсы выделения фронта или спада сигналов. Насколько я понимаю их по-другому не считать. К сожалению, я не силён в устройстве ПЛИС, видел пару картинок устройства элементарных ячеек, но пока глубоко не разбирался в этих вещах. Поэтому не думаю, что мне это поможет. Каюсь, и осознаю, что такие вещи необходимо знать. Выделитель фронтов. Предварительного подавления дребезга НЕТ. Если входной сигнал не синхронный, то надо сначала поставить простейший подавитель дребезга или еще какой-нибудь фильтр. `timescale 1ns / 1ps module _front ( input CLK, input IN, output logic POSwire, NEGwire, FRONTwire, output logic POSreg, NEGreg, FRONTreg ); //------------------------------------------------------ logic IN0; initial begin IN0=0; POSreg=0; NEGreg=0; end always @(posedge CLK) IN0 <= IN; assign POSwire = IN & ~IN0; assign NEGwire = ~IN & IN0; assign FRONTwire = IN ^ IN0; always @(posedge CLK) POSreg <= POSwire; always @(posedge CLK) NEGreg <= NEGwire; always @(posedge CLK) FRONTreg <= FRONTwire; endmodule /* _front front ( .CLK(CLK), .IN(), .POSwire(), .NEGwire(), .FRONTwire(), .POSreg(), .NEGreg(), .FRONTreg() ); */ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться