赞
踩
下面处理的都是单个周期宽度的脉冲信号,信号宽度与时钟周期相同。三种方法分别是延时打拍,寄存器移位,计数器延时。
方法比较简单,适用于两拍,三拍传递数据,两拍跨时钟域同步,两拍信号上升沿、下降沿采样。
较多次打拍从形式上较为繁琐,可以采用定义多为寄存器移位传输数据。
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] ; //间隔数个周期后,从高位输出
原理为采样到输入脉冲后把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
计数器延时参考波形
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。