FPGA之上升沿检测

2019-07-15 22:56发布

脉冲检测计数应用也是蛮重要的,原理也是挺简单的,直接上代码
`timescale 1ns / 1ps
module PD_up(
               
                clk                        ,                        //系统时钟 50MHz        ;
                rest_n                ,                        //系统复位信号        低电平有效        ;
                signal_in        ,                        //待检测信号输入        ;
                rising_flag                                //上升沿标        ;
               
    );

input         clk                        ;
input          signal_in        ;
input         rest_n                ;
output        rising_flag        ;                       

/****************************************************************

signal_in   0 0 0 1 1 0
~signal_in         1 1 1 0 0 1
signal_in_d    0 0 0 1 1 0
-----------------------------
rising_flag    0 0 0 0 1          signal_in_d & ~signal_in  下降沿检测
                           1 1 0 1 1   
                           0 0 1 0 0  ~[signal_in_d | ~signal_in] 上升沿检测       

***************************************************************/

reg                signal                ;                        //待检测信号输入寄存器;
reg                rising_flag        ;                        //上升沿标寄存器,值为 1 被检信号上升沿到来;
reg                signal_in_d        ;                        //signal_in_d 比 signal_in延迟一个时钟周期;

always@(posedge clk or negedge rest_n)begin
        if(!rest_n)begin
                signal <= 0;
        end
                else begin
                        signal <= signal_in;
                end
end


always@(posedge clk or negedge rest_n)begin
        if(!rest_n)begin
                signal_in_d <= 0;
        end
                else begin
                        signal_in_d <= signal;
                end
end

always@(*)begin                                        //上升沿检测;
        rising_flag = ~((~signal) | signal_in_d);
end

endmodule


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
根号2
2019-07-16 01:38
测试代码:

module tb_PD_up;

        // Inputs
        reg clk;
        reg rest_n;
        reg signal_in;

        // Outputs
        wire rising_flag;

        // Instantiate the Unit Under Test (UUT)
        PD_up uut (
                .clk(clk),
                .rest_n(rest_n),
                .signal_in(signal_in),
                .rising_flag(rising_flag)
        );

        initial begin
                // Initialize Inputs
                clk = 0;
       
               

                // Wait 100 ns for global reset to finish
                #100;
        forever #10 clk = ~clk;
                // Add stimulus here

        end
       
        initial begin
                rest_n = 0;
                #100;
               
                rest_n = 1;
        end
       
        initial begin
        signal_in = 0;
        #100;
       
        #200 signal_in = 0;
        #50  signal_in = 1;
        #100 signal_in = 0;
        #300 signal_in = 1;
        #50  signal_in = 0;
       
       
        end
      
endmodule

一周热门 更多>