FPGA-边沿检测器

    所谓边沿检测器,就是检测输入信号的上升沿(pos_edge)和下降沿(nos_edge),上升沿就是指输入信号由低电平变为高电平,下降沿指的是输入信号由高电平变为低电平。
    本次设计主要是对上升沿(pos_edge)和下降沿进行检测,事先要定义一个位宽位一位的输入信号data;还需要用定义两个位宽位一位的寄存器a和b;还需要定义两个输出信号pos_edge和nos_edge.
    a和b这两个寄存器的作用分别是对输入信号t1时刻的数据和t0时刻的数据进行存储当a&(~b)的值为1时,那么检测到输入信号为由低电平变为高电平,即pos_edge的值为1;当(~a)&b的值为1时,那么检测到输入信号由高电平变为低电平,即nos_edge的值为1.其主要实现代码如下:

module edge_detect(clk,rest,data,pos_edge,no_edge);
input clk;
input rest;
input data;

output pos_edge;
output no_edge;

reg a;
reg b;

always@(posedge clk or negedge rest)
    begin
        if(!rest)
            begin
                a <= 0;
                b <= 0;
            end
        else
            begin
                a <= data;
                b <= a;
            end
    end
assign pos_edge =(a&(~b))?1:0;
assign no_edge  = ((~a)&b)?1:0;    
endmodule

仿真代码如下:

`timescale 1ns/1ns
module edge_detect_tb;
reg clk;
reg rest;
reg data;

wire pos_edge;
wire no_edge;

edge_detect edge_detect0(
            .clk(clk),
            .rest(rest),
            .data(data),
            .pos_edge(pos_edge),
            .no_edge(no_edge)
        );

parameter temp=20;
initial clk=1;
always#(temp/2) clk=~clk;
initial
begin
    rest=0;
    #temp;
    rest=1;data=1;
    #(temp*200);
    $stop;
end
always@(posedge clk)
#(temp*5) data=~data;
endmodule

仿真结果
这里写图片描述
边沿检测电路将会用运到按键消抖的电路中,精彩内容将在后续推出。

你可能感兴趣的:(FPGA)