代码之家  ›  专栏  ›  技术社区  ›  Joanna14071

Verilog中快、慢时钟脉冲的产生

  •  1
  • Joanna14071  · 技术社区  · 7 年前

    我正在用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\U write\U fifo”信号上的脉冲应可在慢时钟的每个上升沿上重复,但不幸的是,它不是。

    如果有任何帮助,我将不胜感激。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Oldfart    7 年前

    如果你说时钟是a同步的,你就不能随心所欲。

    我建议您将“规格”更改为:

    “有一个由慢时钟产生的信号。如果有上升沿,我希望在一个不相关的快时钟上有一个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