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博客

相关推荐
川石课堂软件测试2 小时前
零基础小白如何学习自动化测试
python·功能测试·学习·测试工具·jmeter·压力测试·harmonyos
2301_809051142 小时前
Linux 数据库开发 学习笔记
笔记·学习·数据库开发
爱喝水的鱼丶2 小时前
SAP-ABAP:SAP 简单报表输出开发系列(共6篇)第三篇:SAP ALV 报表样式定制:字段布局与交互功能配置
服务器·开发语言·学习·交互·sap·abap
很楠爱上2 小时前
Node.js 模块化学习笔记
笔记·学习·node.js
毕竟是shy哥2 小时前
CLIP:从自然语言监督中学习可迁移的视觉模型
学习
川石课堂软件测试2 小时前
作为一名测试工程师如何学习Kubernetes(k8s)技能
学习·测试工具·容器·职场和发展·kubernetes·测试用例·harmonyos
tryqaaa_2 小时前
学习日志(五)【php反序列化全加例题】【pop链,字符逃逸,session,伪协议】
android·学习·php·web·pop·session
li星野3 小时前
FastAPI 参数详解:路径参数、查询参数与请求体 —— 从入门到实战
服务器·学习·fastapi
承渊政道3 小时前
【MySQL数据库学习】(MySQL数据类型)
数据库·学习·mysql·ubuntu·bash·数据库开发·数据库系统
WangX-西石油3 小时前
DVWA靶场Low级别Brute Force学习
学习·web安全·网络安全