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题目的一些笔记备忘

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务