Jump to content

    
Sign in to follow this  
oleg679976

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

Recommended Posts

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

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

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

Share this post


Link to post
Share on other sites
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

 

Share this post


Link to post
Share on other sites
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

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
15 минут назад, gibson1980 сказал:

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

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

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

з.ы.

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

Share this post


Link to post
Share on other sites
6 минут назад, Lmx2315 сказал:

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
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()
);
*/

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this