一、代码
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/10/25 21:22:45
// Design Name:
// Module Name: deceted_negedge
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module deceted_negedge(
input clk,
input rst_n,
input in,
output raising_edge_detect,
output falling_edge_detect,
output double_edge_detect
);
reg reg_r1,reg_r0;
//打两个拍子
always@(posedge clk or negedge rst_n) begin
if(~rst_n)begin
reg_r0<='b0;
reg_r1<='b1;
end
else begin
reg_r0<=in;
reg_r1<=reg_r0;
end
end
assign raising_edge_detect= reg_r0 &(~reg_r1);//检测上升沿
assign falling_edge_detect= reg_r1 &(~reg_r0);//检测下降沿
assign double_edge_detect= reg_r1 ^reg_r0 ;//双边检测
endmodule
二、仿真文件
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/10/25 21:35:02
// Design Name:
// Module Name: tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module tb();
reg clk;
reg rst_n;
reg in;
wire raising_edge_detect;
wire falling_edge_detect;
wire double_edge_detect;
initial begin
clk=0;
rst_n=0;
in=0;
#100
clk=1;
rst_n=1;
in=1;
#100
in=0;
#100
in=1;
#100
in=0;
end
always #5 clk=~clk ;
deceted_negedge u0(
.clk(clk),
.rst_n(rst_n),
.in(in),
.raising_edge_detect(raising_edge_detect),
.falling_edge_detect(falling_edge_detect),
.double_edge_detect(double_edge_detect)
);
endmodule
三、结果
总结
边沿检测用到的知识点:首先要打两个拍子,然后经过取反操作,再进行于运算,如果是双边检测的话就需要经过异或操作。昨天是程序员的节日,祝愿所有的程序员少遇到bug,一次通过。
--晓凡 2022年10月25日于桂林书