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

全部评论

相关推荐

04-27 08:59
常州大学 Java
牛客139242382号:《两门以上汇编语言》
点赞 评论 收藏
分享
我看到好多人都在说0offer好焦虑,结果一看是投了百度快手字节啥的。好像大家都是只想通过校招进大厂,对小公司是不考虑的吗😂可是能进大厂的难道不是只有少部分人吗,真心发问
梦想是成为七海千秋:沉默的大多数吧,喜欢晒的都是能引起共鸣的大厂,找小厂的人,别人也不认识你这个小厂,就自己偷偷找了实际上大多数人哪有什么机会能找到大厂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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