Генерация импульса с быстрыми и медленными часами в 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   
Другие вопросы по тегам