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
1楼-- · 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
根号2
2楼-- · 2019-07-16 05:09
 精彩回答 2  元偷偷看……
根号2
3楼-- · 2019-07-16 08:53
  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. ***************************************************************/
复制代码
根号2
4楼-- · 2019-07-16 11:15
根号2 发表于 2016-4-3 19:20

加载代码缩进怎么跟我写程序不一样啊。这里面~signal_in是signal的取反。signal_in_d比signal_in滞后一个时钟周期
这里是上升沿检测的原理说明:下降沿跟上升沿检测稍微有点区别。
E%$3$F4U5{Q@I{C5$H[7XGJ.png
根号2
5楼-- · 2019-07-16 11:33
待会儿写下降沿检测,如有错误还望,各位大神批评指正!!
根号2
6楼-- · 2019-07-16 11:39
下降沿检测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
复制代码

一周热门 更多>