我是靠谱客的博主 体贴狗,这篇文章主要介绍Verilog实现任意时钟周期延时的方法小结,现在分享给大家,希望可以做个参考。

方法一:非阻塞赋值延时打拍

这个方法是最简单的实现延时的方法,缺点是如果延时的周期比较长的话,要写的东西也会变得很多

always @ (posedge clk) begin
     d1 <= d;
     d2 <= d1;
     .......
     dout <= dn;
end

通过这种方式可以把信号延时n个周期。

方法二:移位寄存器延时

这个方法也比较简单,实现起来也很容易,缺点是消耗的资源比较大

//延时N个时钟周期
parameter N=4;
reg [N-1:0] temp;

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
	    temp <= 0;
        end
    else if(in1) begin
        temp[N-1:0] <= {temp[N-2:0],in1};
    end
    else begin
        temp[N-1:0] <= {temp[N-2:0],1'b0};
    end
end
assign out1 = temp[N-1];

方法三:计数器实现任意周期延时

该方法较为节省资源,能实现任意周期的延时

parameter delay_per = 8'h4;//延时周期数
reg flag;
reg [7:0] delay_count;

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        flag <= 0;
        end
    else if(in1)begin
        flag <= 1;
        end
    else if(delay_count == delay_per)begin
        flag <= 0;
        end
end

always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
        delay_count <= 0;
        out1 <= 0;
        end
    else if(delay_count == delay_per && flag == 1'b1)begin
        delay_count <= 0;
        out1 <= 1;
        end
    else if(flag == 1'b1)begin
        delay_count <= delay_count + 1'b1;
        out1 <= 0;
        end
    else begin
        delay_count <= 0;
        out1 <= 0;
    end
end

小结

文章介绍了三种实现信号周期延时的方法,但需要注意的是,在方法三中,如果信号间隔的周期数小于延时的周期,这种方法就不太合适了。此时推荐使用方法二,或者使用FIFO来实现信号延时。

最后

以上就是体贴狗最近收集整理的关于Verilog实现任意时钟周期延时的方法小结的全部内容,更多相关Verilog实现任意时钟周期延时内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(127)

评论列表共有 0 条评论

立即
投稿
返回
顶部