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

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

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

复制代码
1
2
3
4
5
6
7
always @ (posedge clk) begin d1 <= d; d2 <= d1; ....... dout <= dn; end

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

方法二:移位寄存器延时

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//延时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];

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

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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实现任意时钟周期延时内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部