Verilog写题笔记24----------边沿检测
边沿检测
https://www.nowcoder.com/practice/fed4247d5ef64ac68c20283ebace11f4
三个输入:
1、时钟信号clk
2、复位信号rst_n
3、数据信号a
两个输出:
1、上升沿指示信号:rise
2、下降沿指示信号:down
边沿检测也是一个经典的Verilog编程套路:利用非延时检测延一拍的特性找到变换的上升或下降沿。Verilog中存在阻塞赋值和非阻塞赋值,教科书上会告诉你,非阻塞赋值是并行的,阻塞赋值是顺序执行的。这是正确但没用的知识。阻塞延时和非阻塞延时的最大区别在于非阻塞延时延一拍的特征。
用一个变量a_reg跟随信号a,当a改变,在下一个上升沿后,a_reg才会改变,这就造成只有在改变时,a和a_reg的值只有在a改变时会不一样。这就是经典的利用非阻塞赋值延一拍进行边沿检测。
这个帖子仅是笔记,所以我在这里只将边沿检测的大思路写出来,如果读者不了解,可以自行查阅相关资料。整个代码如下:
`timescale 1ns/1ns module edge_detect( input clk, input rst_n, input a, output reg rise, output reg down ); reg a_reg; always@(posedge clk or negedge rst_n)//用a_reg对a进行跟随 if(rst_n == 1'b0) a_reg <= 1'b0; else a_reg <= a; always@(posedge clk or negedge rst_n)//下降沿检测 if(rst_n == 1'b0) down <= 1'b0; else if(a == 1'b0 && a_reg == 1'b1) down <= 1'b1; else down <= 1'b0; always@(posedge clk or negedge rst_n)//上升沿检测 if(rst_n == 1'b0) rise <= 1'b0; else if(a == 1'b1 && a_reg == 1'b0) rise <= 1'b1; else rise <= 1'b0; endmodule
verilog写题笔记 文章被收录于专栏
写Verilog题目的一些笔记备忘