我正在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”信号上的脉冲应该在慢速时钟的每个上升沿都是可重复的,但遗憾的是它不是。
我将不胜感激任何帮助。
答案 0 :(得分:2)
如果你说时钟是同步的,你就不能做你想做的事 假设在某个时间点,两个上升的时钟边沿相距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