Verilog语法学习——边沿检测

边沿检测

代码

verilog 复制代码
module edge_detection(
	input 		sys_clk,
	input 		sys_rst_n,
	input 		signal_in,
	
	output 		edge_rise,
	output 		edge_down
);
	//存储上一个时钟周期的输入信号
	reg signal_in_prev;
	
	always @(posedge sys_clk or negedge sys_rst_n) begin
		if(!sys_rst_n)
			signal_in_prev <= 0;
		else begin
			signal_in_prev <= signal_in;	//两个信号相差一个时钟周期
		end
	end
	//上升沿检测:signal_in_prev为0,signal_in为1
	assign edge_rise = signal_in & ~signal_in_prev;
	assign edge_down = ~signal_in & signal_in_prev;
endmodule

若为下降沿检测,则为:

verilog 复制代码
assign edge_detected = ~signal_in & signal_in_prev;

TB文件

verilog 复制代码
`timescale 1ns/1ps

module tb_top();

//接口声明
reg sys_clk;
reg sys_rst_n;
reg signal_in;

wire edge_rise;
wire edge_down;

//对被测的设计进行例化

edge_detection	u_edge_detection(
	.sys_clk	    (sys_clk),
	.sys_rst_n	    (sys_rst_n),
	.signal_in		(signal_in),
	
	.edge_rise		(edge_rise),
	.edge_down		(edge_down)
);

//产生时钟
initial sys_clk = 1;
always #10 sys_clk = ~sys_clk;


//测试激励产生
initial begin
	sys_rst_n = 0;
	signal_in = 0;
	#117;
	sys_rst_n = 1;
	signal_in = 1;
	#217;
	signal_in = 0;
	#317;
	signal_in = 1;
	#517;
	signal_in = 0;
	#317;
	signal_in = 1;
	#737;

	signal_in = 1;
	#519;
	signal_in = 0;
	#817;
	signal_in = 1;
	#417;
	signal_in = 0;
	#107;
	signal_in = 1;
	#300;
end

endmodule

注意,若TB文件中输入信号signal_in的上升\下降沿和sys_clk同步,则检测不出边沿。所以我将输入信号的持续时间都设定为随机数字,来和sys_clk产生区别

仿真波形


改进

若出现不定值x或高阻值z,则检测不准确。

可以改进为:

verilog 复制代码
assign edge_detected = ((a & ~signal_in_prev)===1)?1:0;//上升沿检测

assign edge_detected = ((~a & signal_in_prev)===1)?1:0;//下降沿检测

解释:

  • ==和!==称为逻辑等式运算符,其结果由两个操作数的值决定。真值表如下:
== 0 1 x z
0 1 0 x x
1 0 1 x x
x x x x x
z x x x x
  • ===和!===常用于case表达式的判别,所以又称为case等式运算符。它是对操作数进行按位比较,两个操作数必须完全一致,结果才为1。若两个操作数对应位都出现不定值x或高阻值z,则也可认为是相同的。真值表如下:
=== 0 1 x z
0 1 0 0 0
1 0 1 0 0
x 0 0 1 0
z 0 0 0 1

参考

(201条消息) Verilog 相等运算符之相等和全等_verilog 全等_蒋楼丶的博客-CSDN博客

相关推荐
Canmag 兴隆磁性4 小时前
中大型钕铁硼产品的磁通测量与自动分选:一条产线自动化的工程实现思路
运维·学习·自动化·永磁材料
小黄人软件6 小时前
桌面需要整理吗?有工具自动分类
学习
老衲不用@飘柔7 小时前
SFP与SFP+学习知识整理
学习
X54先生(人文科技)7 小时前
社会嵌入式终身学习机器与修复时代-ELR架构和技术演化探讨
人工智能·深度学习·学习·架构·开源协议
电子云与长程纠缠8 小时前
UE5魂系游戏开发教程05
开发语言·学习·游戏·ui·ue5
syagain_zsx8 小时前
BRpc 二次封装:Channel 管理、服务管理与回调工厂
c++·学习·程序人生·rpc·谷歌
其实防守也摸鱼8 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
我命由我123458 小时前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法
kkkkkkkkkk_Z9 小时前
新手自学嵌入式 | 学习日记:Linux驱动复习之系统移植(U-Boot篇)
linux·运维·学习
Rabitebla9 小时前
【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑
linux·c++·笔记·学习·算法