Как определить положение двух часов (асинхронных друг с другом) одновременно в 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 описанное вами поведение. Причина этого в том, что вы сравниваете время точно.

Прежде всего, вам нужно объяснить, что вы подразумеваете под «обнаружением первого совпадения двух нарастающих фронтов». Учитывая, что у двух асинхронных часов переменное (и непредсказуемое) фазовое соотношение, задача обнаружения одновременных фронтов будет (обычно) формулироваться с точки зрения того, сколько времени является «одновременным».

Например: определить, когда нарастающие фронты разнесены во времени не более чем на 5 нс.

Кстати, здесь я предполагаю, что обе рассматриваемые частоты известны.

Пожалуйста, опишите вашу проблему подробнее.

РЕДАКТИРОВАТЬ: Этот вопрос стал аппаратным вопросом, который не связан с 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
@VasilyZukanov прав. Как было сказано, невозможно сделать то, что хотел сделать оригинальный постер. Сказать, что края должны идти высоко одновременно с некоторым допуском, конечно, неверно, совсем не очевидно, что здесь присутствует какой-либо допуск, а тем более разумный допуск. Когда кто-то задает подобный вопрос, лучший совет состоит в том, что это невозможно. - 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