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

Signals Verilog中快慢时钟脉冲的产生,signals,verilog,fpga,clock,pulse,Signals,Verilog,Fpga,Clock,Pulse,我正在用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_fif

我正在用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
reg cnt_write_位1,cnt_write_位2;
初始cnt_写入_比特1=0;
初始cnt_写入_比特2=0;
reg cnt_write_fifo;
初始cnt_写入_fifo=0;
始终@(posedge时钟1kHz)
开始:写入FIFO
if(cnt_写入_fifo)
开始

cnt_write_bit1如果你说时钟是a同步的,你就不能做你想做的事。
假设在某个时间点,两个上升的时钟边缘相距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   
//
//将信号从慢时钟传输到快时钟
//还检测快速时钟域中的上升沿
//
模块信号传输
(
输入慢时钟,
输入慢脉冲信号,
输入复位\u n,//快速时钟域复位
输入快速时钟,
输出reg fast_信号,
产量快速上升
);
reg信号元,信号延迟;
始终@(posedge快速时钟或negedge重置)
开始
如果(!重置)
开始

如果你说时钟是a同步的,你就不能做你想做的事。
假设在某个时间点,两个上升的时钟边缘相距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   
//
//将信号从慢时钟传输到快时钟
//还检测快速时钟域中的上升沿
//
模块信号传输
(
输入慢时钟,
输入慢脉冲信号,
输入复位\u n,//快速时钟域复位
输入快速时钟,
输出reg fast_信号,
产量快速上升
);
reg信号元,信号延迟;
始终@(posedge快速时钟或negedge重置)
开始
如果(!重置)
开始

最重要的是:慢时钟和快时钟之间有关系吗?如果不是,则必须使用时钟域交叉逻辑。这些时钟之间没有关系。我在输入端有时钟信号。您的弃权表没有显示慢时钟在第一个边缘之后仍然有效。是吗?对不起,这只是剪报。慢时钟工作正常:)最重要的是:慢时钟和快时钟之间有关系吗?如果不是,则必须使用时钟域交叉逻辑。这些时钟之间没有关系。我在输入端有时钟信号。您的弃权表没有显示慢时钟在第一个边缘之后仍然有效。是吗?对不起,这只是剪报。慢时钟工作正常:)