gibson1980 0 March 5, 2019 Posted March 5, 2019 · Report post 4 минуты назад, oleg679976 сказал: Других способов не смог пока придумать. А другие способы и не нужны. По вашей ссылке все три случая описаны, что проще некуда, причем как для HDL так и для схематика. Quote Share this post Link to post Share on other sites More sharing options...
Lmx2315 0 March 5, 2019 Posted March 5, 2019 · Report post 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 Quote Share this post Link to post Share on other sites More sharing options...
oleg679976 0 March 5, 2019 Posted March 5, 2019 · Report post 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 Спасибо за объяснение! Весьма интересное решения, я б до такого не додумался. Плюс сразу понял к чему здесь запас по частоте. Quote Share this post Link to post Share on other sites More sharing options...
gibson1980 0 March 5, 2019 Posted March 5, 2019 · Report post Согласен, решение оригинальное. Два в одном, отлов фронта(спада) и защита от дребезга. Возьму на заметку, спасибо. p.s. Мда, новый форум конечно жесть. Код вставить невозможно по человечески, ник в сообщение тоже через ж вставляется и после его удаления шрифт какого-то стал жирный и назад не вернуть. Quote Share this post Link to post Share on other sites More sharing options...
Lmx2315 0 March 5, 2019 Posted March 5, 2019 · Report post 15 минут назад, gibson1980 сказал: Согласен, решение оригинальное. Два в одном, отлов фронта(спада) и защита от дребезга. Возьму на заметку, спасибо. Вы правы - да можно бороться с дребезгом + борьба с метастабильностью, нужно только в условии не учитывать нулевой бит, а сравнивать с первого и дальше. Особенно если сделать сдвиговый регистр поглубже . з.ы. изобретение не моё Quote Share this post Link to post Share on other sites More sharing options...
iosifk 2 March 5, 2019 Posted March 5, 2019 · Report post 6 минут назад, Lmx2315 сказал: Вы правы - да можно бороться с дребезгом + борьба с метастабильностью, нужно только в условии не учитывать нулевой бит, а сравнивать с первого и дальше. Особенно если сделать сдвиговый регистр поглубже . А для сравнения представим следующее. "Рисуем" текстом автомат. И в нужных состояниях делаем то что задумано... Например в состоянии "3'b011" делаем вот это: sch<=sch+1... Ну и далее, как задумано в проекте. Причем в конкретных состояниях и будет импульс когда "выделен фронт"... Сдвиговый же регистр, о котором писали выше получится автоматически, как регистр FSM... С точки зрения железа - тоже самое, а вот с точки зрения проекта - все гораздо проще... Ну и про дребезг... Если триггера сдвигового регистра находятся не "вместе", а разбросаны по кристаллу, то вполне возможна ситуация, когда один из триггеров "не сдвинет"... Так что это лучше делать отдельно.... Quote Share this post Link to post Share on other sites More sharing options...
dvlwork 0 March 6, 2019 Posted March 6, 2019 · Report post 18 часов назад, Lmx2315 сказал: if (frnt[2:0]==3'b011) frnt[0] попадает в метастабильность. Так что лучше уж frnt[2:1] == 2'b01 IMHO. Quote Share this post Link to post Share on other sites More sharing options...
druzhin 0 March 6, 2019 Posted March 6, 2019 · Report post 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() ); */ Quote Share this post Link to post Share on other sites More sharing options...