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

Я работаю над дизайном, который должен определять первое совпадение двух нарастающих фронтов двух асинхронных часов разных частот.

код примерно так может работать для моделирования.

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

if (a=b) then some code.

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

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);

Флопы с двумя краями и флопы с двумя часами не являются обычной практикой проектирования. Потребуется чрезмерный анализ времени, и инструменты могут жаловаться на ячейку. Кроме того, необходимо предпринять шаги для использования патента в соответствии с законом.

Невозможно воспроизвести в HW описанное вами поведение. Причина этого в том, что вы сравниваете время точно.

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

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

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

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

РЕДАКТИРОВАТЬ: Этот вопрос стал аппаратный вопрос, который не связан с Verilog. Не ясно, может ли какое-либо из предложенных здесь решений сработать (и я лично считаю, что это не сработает). Я отправил тот же вопрос на EE Stack Exchange - это место для вопросов HW, и есть большая вероятность, что на него там ответят.

Это довольно сложно, но если вы можете получить третьи часы, которые в два раза быстрее самых быстрых часов между двумя, которые вам нужно обнаружить, и можете принять задержку обнаружения на один цикл (один цикл относится к третьему Clock Domain) тогда это возможно.

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

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

Другие вопросы по тегам