方法一:非阻塞赋值延时打拍
这个方法是最简单的实现延时的方法,缺点是如果延时的周期比较长的话,要写的东西也会变得很多
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];
方法三:计数器实现任意周期延时
该方法较为节省资源,能实现任意周期的延时文章来源:https://www.toymoban.com/news/detail-510081.html
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来实现信号延时。文章来源地址https://www.toymoban.com/news/detail-510081.html
到了这里,关于Verilog实现任意时钟周期延时的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!