Как да открием положението на два часовника (асинхронни един към друг) едновременно във Verilog?

Работя върху дизайн, който трябва да открие първото съвпадение на два нарастващи фронта на два асинхронни часовника с различни честоти.

нещо като този код може да работи за симулация.

fork 
@posedge clkA 
begin 
    a=$time 
end 
@posedge clkB 
begin 
    b=$time 
end 
join 

if (a=b) then some code.

този код може да работи за симулация, но ако искам някаква синтезируема хардуерна логика, какво друго мога да използвам?


person Reddy    schedule 14.06.2013    source източник
comment
Това ми мирише на лош дизайн, можете ли да кажете защо трябва да правите такова нещо? Вероятно има по-добър и по-стабилен начин да стигнете до мястото, където се опитвате да отидете.   -  person Tim    schedule 15.06.2013


Отговори (3)


Прекалено дръпнете това, първо направете тригер с двоен ръб и двоен часовник. Започнете с тригер D с двоен часовник Патент US6320442 B1. Сега заменете допълнителните джапанки с джапанки с двоен край D Патент US5793236 A или Патент US5327019 A. Всеки патент има диаграми на схемата.

С персонализирания флоп създайте малък конвейер, вземащ проби от историята на часовниците. Потърсете преход от нула към едно.

Пример:

wire [1:0] historyA, historyB;
// dualedge_dualclock_dff     ( output Q, input D, clkA, clkB, rst_n)
dualedge_dualclock_dff dedc_histA1( .Q(historyA[1]), .D(historyA[0]), .* );
dualedge_dualclock_dff dedc_histA0( .Q(historyA[0]), .D(clkA), .* );
dualedge_dualclock_dff dedc_histB1( .Q(historyB[1]), .D(historyB[0]), .* );
dualedge_dualclock_dff dedc_histB0( .Q(historyB[0]), .D(clkB), .* );

wire dual_posedge_match = ({historyA,historyB} == 4'b0101);

Флоповете с двоен ръб и флоповете с двоен часовник не са обичайни дизайнерски практики. Ще е необходим прекомерен анализ на времето и инструментите може да се оплакват от клетката. Освен това трябва да се предприемат стъпки за съответствие на патентните употреби със закона.

person Greg    schedule 20.06.2013
comment
Много интересни техники, благодаря. Човек не може да анализира тези схеми без прекомерна (аналогова) симулация, но има един момент, който изглежда подозрителен: изходът на веригата на патент US6320442 B1 трябва да бъде синхронизиран, което е очевидно, но синхронизираната стойност се връща обратно към двете вътрешни провали (чрез комбо логика). Без значение кой часовник използва вашият синхронизатор, ще има път за асинхронна обратна връзка към един от вътрешните провали, който може да стане метастабилен. Тази метастабилност няма да се разпространи покрай изходния синхронизатор, но може да доведе до пропускане на ръбове на веригата. Изпускам ли нещо? - person Vasiliy; 21.06.2013
comment
хм, предполагам, че не следя това, имаш ли нещо против да го обясниш малко по-нататък. Благодаря! - person alex_milhouse; 21.06.2013
comment
Честно казано, не се задълбочих в възможни метастабилни. Видях антиметастабилната верига и препратката към Патент US6531905, озаглавен Тригер с намаляване на метастабилността . Четвъртият до последния параграф говори за това как да се вземат допълнителни предпазни мерки за метастабилност. Има рискове в дизайна, които трябва да бъдат разгледани. Дори бих предложил да прегледате причината, поради която откриването на съвпадащия положителен фронт на асинхронните часовници е изискване за проектиране. - person Greg; 21.06.2013
comment
@user2484982, мисля, че можем да се съгласим, че това е HW въпрос, който не е свързан стриктно с Verilog. Зададох същия въпрос в EE Stack Exchange. Можете да следвате връзката в моя отговор, ако се интересувате от по-нататъшна дискусия. - person Vasiliy; 21.06.2013

Това е някак сложно, но ако можете да получите трети часовник, който е два пъти по-бърз от най-бързия часовник между двата, които трябва да откриете и можете да приемете едно забавяне на откриването на цикъл (единият цикъл е по отношение на третия часовников домейн), тогава е възможно.

това, което ще трябва да направите, е да настроите да се регистрира за всеки clk домейн по следния начин:

input clk1, clk2'

...

reg clk1_in, clk1_out;
reg clk2_in, clk2_out;

wire clk1_posedge, clk2_posedge;

//take in the clock value, you should register this so that way jitter on the line does not mess with it 
always@(posedge clk3)begin 
    clk1_in <= clk1;
    clk2_in <= clk2;
end 

always@(posedge clk3)begin
    clk1_out <= clk1_in;
    clk2_out <= clk2_in;
end 

//now you need to detect the posedge for each signal independently, you can use and and gate for this 
assign clk1_posedge = (~clk1_out && clk1_in);
assign clk2_posedge = (~clk2_out && clk2_in);

// now just and the two together 
assign pulse_detected = clk1_posedge && clk2_posedge

имате нужда от clk 3, за да бъде два пъти по-бърз, в противен случай получавате псевдоним (потърсете nyquist freq)

така че това, което се случва, е, че първият регистър за домейна на часовника ще бъде висок и ако е този, който току-що става висок, тогава вторият регистър все още ще бъде нисък за този цикъл.

person alex_milhouse    schedule 14.06.2013

Не е възможно да се възпроизведе в HW поведението, което описахте. Причината за това е, че сравнявате временататочно.

Първо, трябва да обясните какво имате предвид под „откриване на първото съвпадение на два нарастващи фронта“. Като се има предвид, че два асинхронни часовника имат променлива (и непредвидима) фазова връзка, задачата за откриване на едновременни ръбове (обикновено) ще бъде заявена по отношение на това колко време е „едновременно“.

Например: открийте кога нарастващите ръбове са разположени най-много на 5ns във времето.

Между другото, тук предполагам, че и двете въпросни честоти са известни.

Моля, опишете проблема си по-подробно.

РЕДАКТИРАНЕ: Този въпрос стана въпрос за хардуера, който не е свързан с Verilog. Не е ясно дали някое от предложените тук решения може да работи (и моето лично убеждение е, че няма). Изпратих същия въпрос на EE Stack Exchange - това е място за HW въпроси и има по-голям шанс да се отговори там.

person Vasiliy    schedule 14.06.2013
comment
той (или тя) иска да знае кога и двете се повишават едновременно, в рамките на известна толерантност, разбира се. и не е нужно да знаете честотата, стига да можете да кажете, че можете да имате независима честота, която е поне два пъти по-бърза от най-бързата - person alex_milhouse; 14.06.2013
comment
също така тези неща е по-добре да се задават в секцията за коментари, тъй като не сте дали отговор. - person alex_milhouse; 14.06.2013
comment
Не виждам никакво споменаване на толерантност в първоначалния въпрос. Виждам, че той (или тя) сравнява точно времената. Предложих да добавя повече подробности към въпроса и предоставих насоки, но междувременно отговорът е, че е невъзможно. Защо това не е отговор? - person Vasiliy; 15.06.2013
comment
@VasiliyZukanov е прав. Както беше поискано, невъзможно е да се направи това, което оригиналният плакат искаше да направи. Да се ​​каже, че ръбовете трябва да са високи в същото време с известна толерантност, разбира се, не е вярно, изобщо не е очевидно, че има някаква толерантност, още по-малко разумна толерантност. Когато някой зададе подобен въпрос, най-добрият съвет е, че такова нещо не е възможно. - person ; 17.06.2013
comment
Благодаря на всички за вашия отговор. - person Reddy; 21.06.2013
comment
@Alex Rellim Не мога да използвам друг часовник, както казахте в моя дизайн. съжалявам, ако въпросът не е подробен правилно. Знам, че е невъзможно да се сравни точно. като се има предвид известна толерантност на всяка малка стойност, можем ли да постигнем това?? И както Грег спомена за Dual clock d flipflop може да работи добре. Но не може ли да се постигне с нормални джапанки? - person Reddy; 21.06.2013
comment
да, макар че и това беше възможно, но мисля, че може да пропускаме нещо. проверката на часовникови домейни като този винаги е предизвикателство - person alex_milhouse; 21.06.2013