Генерация импульса с быстрыми и медленными часами в Verilog
Я готовлю программу в Verilog. У меня есть проблема с реализацией короткого импульса, который будет происходить каждый раз на переднем фронте медленных часов и исчезать на переднем фронте быстрых часов.
Ниже я вставляю код, который я написал, который дает мне такой импульс, но, к сожалению, он появляется только один раз на первом краю и никогда не повторяется.
reg cnt_write_bit1, cnt_write_bit2;
initial cnt_write_bit1 = 0;
initial cnt_write_bit2 = 0;
reg cnt_write_fifo;
initial cnt_write_fifo = 0;
always @ (posedge clk_1kHz)
begin : WRITE_FIFO
if (cnt_write_fifo)
begin
cnt_write_bit1 <= 0;
end
else
begin
cnt_write_bit1 <= 1;
end
end
always @ (posedge clk_50MHz)
begin : STOP_WRITE_FIFO
if (cnt_write_fifo)
begin
cnt_write_bit2 <= 0;
end
else //if (!cnt_write_bit1)
begin
cnt_write_bit2 <= 1;
end
end
always @ (cnt_write_bit1, cnt_write_bit2)
begin
if (cnt_write_bit1 && cnt_write_bit2)
begin
cnt_write_fifo <= 1;
end
else if (!cnt_write_bit2)
begin
cnt_write_fifo <= 0;
end
end
На симуляции это выглядит так:
Импульс на сигнале "cnt_write_fifo" должен повторяться на каждом фронте медленного тактового сигнала, но, к сожалению, это не так.
Буду благодарен за любую помощь.
1 ответ
Если, как вы говорите, часы являются синхронными, вы не можете делать то, что вы хотите.
Скажем, в какой-то момент времени два восходящих фронта тактовых импульсов находятся на расстоянии 1ps (медленное опережающее тактирование), после чего вам нужно будет генерировать сигнал, высокий для 1ps. Помимо трудностей с достижением этого, что бы вы сделали с этим?
Я предлагаю вам изменить свою "спецификацию" на что-то вроде:
"Из медленных тактовых импульсов генерируется сигнал. Если имеется нарастающий фронт, я хочу иметь импульс длительностью 1 такт на несвязанных быстрых тактовых сигналах. Допускается максимальная задержка X быстрых тактовых импульсов между сигналом изменение на медленных часах, генерирующих импульс на быстрых часах (X>=2)".
Извините, главный редактор: мой мозг не был включен!
Передайте сигнал с медленных часов на быстрые часы, используя синхронизацию. Затем в области быстрых часов найдите передний фронт:
//
// Transfer a signal from a slow clock to a fast clock
// Also detect the rising edge in the fast clock domain
//
module signal_transfer
(
input slow_clock,
input slow_signal,
input reset_n, // reset for fast clock domain
input fast_clock,
output reg fast_signal,
output fast_rising
);
reg signal_meta,signal_delay;
always @(posedge fast_clock or negedge reset_n)
begin
if (!reset_n)
begin
signal_meta <= 1'b0;
fast_signal <= 1'b0;
signal_delay <= 1'b0;
end
else
begin
signal_meta <= slow_signal;
fast_signal <= signal_meta;
signal_delay <= fast_signal;
end
end
assign fast_rising = fast_signal & !signal_delay;
endmodule