Перейти к содержанию
    

Инверсия clk в триггере в Quartus

4 минуты назад, oleg679976 сказал:

Других способов не смог пока придумать.

А другие способы и не нужны. По вашей ссылке все три случая описаны, что проще некуда, причем как для HDL  так и для схематика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Спасибо за объяснение! Весьма интересное решения, я б до такого не додумался. Плюс сразу понял к чему здесь запас по частоте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласен, решение оригинальное. Два в одном, отлов фронта(спада) и защита от дребезга. Возьму на заметку, спасибо.

p.s. Мда, новый форум конечно жесть. Код вставить невозможно по человечески, ник в сообщение тоже через ж вставляется и после его удаления шрифт какого-то стал жирный и назад не вернуть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, gibson1980 сказал:

Согласен, решение оригинальное. Два в одном, отлов фронта(спада) и защита от дребезга. Возьму на заметку, спасибо.

Вы правы - да можно бороться с дребезгом + борьба с метастабильностью, нужно только в условии не учитывать нулевой бит, а сравнивать с первого и дальше.

Особенно если сделать сдвиговый регистр поглубже .

з.ы.

изобретение не моё

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, Lmx2315 сказал:

Вы правы - да можно бороться с дребезгом + борьба с метастабильностью, нужно только в условии не учитывать нулевой бит, а сравнивать с первого и дальше.

Особенно если сделать сдвиговый регистр поглубже .

А для сравнения представим следующее.

"Рисуем" текстом автомат. И в нужных состояниях делаем то что задумано... Например в состоянии "3'b011" делаем вот это: sch<=sch+1... Ну и далее, как задумано в проекте.

Причем в конкретных состояниях и будет импульс когда "выделен фронт"... Сдвиговый же регистр, о котором писали выше получится автоматически, как регистр FSM... С точки зрения железа -  тоже самое, а вот с точки зрения проекта - все гораздо проще...

Ну и про дребезг... Если триггера сдвигового регистра находятся не "вместе", а разбросаны по кристаллу, то вполне возможна ситуация, когда один из триггеров "не сдвинет"... Так что это лучше делать отдельно....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 часов назад, Lmx2315 сказал:

if (frnt[2:0]==3'b011)

frnt[0] попадает в метастабильность. Так что лучше уж frnt[2:1] == 2'b01 IMHO.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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()
);
*/

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...