脉冲信号间隔数个时钟周期后输出是常见的信号处理形式,这里总结了三种常见的同步时钟下脉冲信号延时的方法,仅供参考。~~~
1.1 背景
下面处理的都是单个周期宽度的脉冲信号,信号宽度与时钟周期相同。三种方法分别是延时打拍,寄存器移位,计数器延时。
1.2 延时打拍
方法比较简单,适用于两拍,三拍传递数据,两拍跨时钟域同步,两拍信号上升沿、下降沿采样。
1.3 寄存器移位
较多次打拍从形式上较为繁琐,可以采用定义多为寄存器移位传输数据。
input pulse_in ; //脉冲输入
wire pulse_out ; //脉冲输出
reg [9:0] pulse_tmp ; //存放脉冲在传输过程的临时数据
always @(posedge CLK or negedge rst_n) begin
if(!rst_n)
pulse_tmp <= 10'd0;
else if(pulse_in == 1'b1)//脉冲输入信号到来
pulse_tmp <= {pulse_tmp[8:0],pulse_in};
else
pulse_tmp <= {pulse_tmp[8:0],1'b0}; //每隔一个时钟周期,前移一位
end
assign pulse_out = pulse_tmp[9] ; //间隔数个周期后,从高位输出
1.4 计数器延时
原理为采样到输入脉冲后把flag信号置1,开始计数,计数到需要的延时之后,输出一个脉冲信号,同时清除计数,清零flag信号。
module pulse_delay(
input CLK ,
input rst_n,
input Delay_IN , //输入脉冲
output Delay_OUT //延时后的输出脉冲
);
reg [7:0] delay_plus;
reg Delay_plus;
reg plus_flag;
assign Delay_OUT = Delay_plus;
always @(posedge CLK or negedge rst_n) begin
if(!rst_n)
plus_flag<= 1'b0;
else if(Delay_IN == 1'b1)
plus_flag<= 1'b1;
else if(delay_plus[7:0]==16'h8)
plus_flag<= 1'b0;
end
always @(posedge CLK or negedge rst_n) begin
if(!rst_n)
begin
delay_plus[7:0] <= 8'd0;
Delay_plus<= 1'b0;
end
else if(delay_plus[7:0]==16'h8 && plus_flag == 1'b1)//延时时间
begin
delay_plus[7:0] <= 8'd0;
Delay_plus<= 1'b1;
end
else if (plus_flag == 1'b1) begin
Delay_plus<= 1'b0;
delay_plus[7:0] <= delay_plus[7:0]+1'b1;
end
else begin
delay_plus[7:0] <= 8'd0;
Delay_plus<= 1'b0;
end
end
endmodule
计数器延时参考波形