微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > FPGA之上升沿检测

FPGA之上升沿检测

时间:10-02 整理:3721RD 点击:
脉冲检测计数应用也是蛮重要的,原理也是挺简单的,直接上代码
`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

测试代码:
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

仿真波形。
仿真波形。
仿真波形。


  1. /****************************************************************

  2. signal_in   0 0 0 1 1 0
  3. ~signal_in         1 1 1 0 0 1
  4. signal_in_d    0 0 0 1 1 0
  5. -----------------------------
  6. rising_flag    0 0 0 0 1          signal_in_d & ~signal_in  下降沿检测
  7.                            1 1 0 1 1   
  8.                            0 0 1 0 0  ~[signal_in_d | ~signal_in] 上升沿检测       

  9. ***************************************************************/

复制代码

加载代码缩进怎么跟我写程序不一样啊。这里面~signal_in是signal的取反。signal_in_d比signal_in滞后一个时钟周期
这里是上升沿检测的原理说明:下降沿跟上升沿检测稍微有点区别。


待会儿写下降沿检测,如有错误还望,各位大神批评指正!

下降沿检测verilog代码

  1. `timescale 1ns / 1ps
  2. /************************************************
  3. 下降沿检测verilog代码

  4. 原理:signal = signal_in
  5. signal        0 0 0 1 1 0
  6. ~signal        1 1 1 0 0 1
  7. signal_d        0 0 0 1 1 0
  8. ----------------------------
  9. falling_flag    0 0 0 0 1

  10. falling_flag = (~signal) & signal_d
  11. ************************************************/
  12. module PD_dn(

  13.                 clk              ,                        //系统时钟 50MHz;
  14.                 rest_n           ,                        //系统复位信号,低电平有效;
  15.                 signal_in        ,                        //被检信号输入;
  16.                 falling_flag                                //下降沿检测输出标志;

  17.     );

  18. input         clk              ;
  19. input         rest_n           ;
  20. input         signal_in        ;
  21. output  falling_flag           ;

  22. reg         signal           ;
  23. reg         signal_d         ;
  24. reg         falling_flag     ;

  25. always@(*)begin
  26.         signal <= signal_in;
  27. end

  28. /********得到滞后signal一个时钟周期的signal_d********/
  29. always@(posedge clk or negedge rest_n)begin
  30.         if(!rest_n)begin
  31.                 signal_d <= 0;
  32.         end
  33.                 else begin
  34.                         signal_d <=signal;
  35.                 end
  36. end
  37. /*******************下降沿标志***********************/
  38. always@(*)begin
  39.         if(!rest_n)begin
  40.                 falling_flag <= 0;
  41.         end
  42.                 else begin
  43.                         falling_flag <= (~signal) & signal_d;
  44.                 end
  45. end
  46.        
  47. endmodule

复制代码

仿真波形
仿真波形
仿真波形


测试代码跟上面的一样

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top