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

相关推荐
red_redemption21 小时前
自由学习记录(141)
学习
xian_wwq21 小时前
【学习笔记】看参识模型
笔记·学习
星雨流星天的笔记本21 小时前
1、用于制备钙钛矿量子点的新三颈烧瓶的洗涤与使用方法
学习
FPGA小迷弟21 小时前
高频时钟设计:FPGA 多时钟域同步与时序收敛实战方案
前端·学习·fpga开发·verilog·fpga
sensen_kiss21 小时前
CPT306 Principles of Computer Games Design 电脑游戏设计原理 Pt.3 实时图形
学习·计算机视觉
東雪木1 天前
编程算法学习——栈与队列算法
学习·算法·排序算法
ADHD多动联盟1 天前
什么是儿童ADHD的运动干预方案?主要有怎样的应对分心走神的疗法?
学习·学习方法·玩游戏
2501_918126911 天前
学习所有6502写游戏地图的语句
汇编·嵌入式硬件·学习·游戏·个人开发
szxinmai主板定制专家1 天前
基于ZYNQ MPSOC船舶数据采集仪器设计(三)振动,流量,功耗,EMC,可靠性测试
arm开发·人工智能·嵌入式硬件·fpga开发
sheji34161 天前
【开题答辩全过程】以 基于微信小程序的少儿编程学习平台为例,包含答辩的问题和答案
学习·微信小程序·小程序