FPGA|CPLD|ASIC论坛
直播中

张国龙

5年用户 94经验值
擅长:存储技术 控制/MCU
私信 关注
[问答]

关于FPGA进行外部边沿检测,检测不准确问题?

求助各位大佬!
目的是观测到外部出现两个下降沿信号后FPGA做下一步动作(例如led状态翻转闪烁);

外部设备定时发出两个下降沿信号,信号周期及间隔如下图。
信号通过FPGA管脚接入,FPGA内部通过程序边沿检测下降沿并统计数量(数量到达2后重新计数,并发送动作信号),但是最终发现检测结果不准确,有时候能检测到,有时候检测不到。万分感谢您的解答和建议!
下面是verilog代码

  1. //边沿检测
  2. initial num<=1'b0;   //下降沿数量
  3. reg [2:0]num;
  4. always @(negedge signal)  //输入信号
  5. begin
  6. if(num==3'd2)
  7. num<=1'b1;
  8. else
  9. num<=num+1'b1;
  10. end

  11. //检测下降沿数量为2时led翻转


  12. initial led<=1'b0;   
  13. always @(posedge CLK_50M)
  14. begin
  15. if(num==3'd2)
  16. led <= ~led;
  17. else
  18. led <= led;
  19. end



  • 输入的下降沿信号

回帖(2)

卿小小_9e6

2021-8-21 12:58:01

最佳答案

代码写的有问题。

稍后仿真完传上来。
举报

卿小小_9e6

2021-8-23 17:18:57
这应该是你想要的结果。
(输入信号我这边临时使用的其他信号,所以看起来可能不是很理想)

  1. `timescale 1ns / 1ps
  2. module edge_check(
  3.     input   clk_50m_i           ,
  4.     input   rst_n_i             ,
  5.     input   signal_i            ,
  6.     output  led                 

  7.     );   
  8.     //------parameter
  9.     parameter CHECK_NUM = 8'd2  ;
  10.    
  11.     //------边沿检测
  12.     reg [2:0]   num             ;
  13.     reg [0:0]   led             ;
  14. //    initial     num <=  1'b0    ;   //下降沿数量
  15. //    initial     led <=  1'b0    ;   
  16.     reg     signal_reg1         ;
  17.     reg     signal_reg2                    ;
  18.     wire    edge_up             ;
  19.     wire    edge_down           ;
  20.    
  21.     always@(posedge clk_50m_i or negedge rst_n_i)
  22.     begin
  23.         if(!rst_n_i)
  24.         begin
  25.             signal_reg1 <=  signal_i    ;
  26.             signal_reg2 <=  signal_reg1 ;
  27.         end
  28.         else
  29.         begin
  30.             signal_reg1 <=  signal_i    ;
  31.             signal_reg2 <=  signal_reg1 ;
  32.         end
  33.     end
  34.    
  35.     assign  edge_up   = (!signal_reg2)&&  signal_reg1   ;
  36.     assign  edge_down =   signal_reg2 &&(!signal_reg1)  ;
  37.    
  38.     always@(posedge clk_50m_i or negedge rst_n_i)
  39.     begin
  40.         if(!rst_n_i)
  41.             num <=  3'd0        ;
  42.         else if(edge_up)
  43.         begin
  44. //            if(num == 3'd2)
  45.             if(num == CHECK_NUM)
  46.             num <=  1'b1        ;
  47.             else
  48.             num <=  num +   1'b1;
  49.         end
  50.         else
  51.             num <=  num         ;
  52.     end

  53.     //检测下降沿数量为2时led翻转

  54.     //  
  55.    
  56.     always @(posedge clk_50m_i or negedge rst_n_i)
  57.     begin
  58.         if(!rst_n_i)
  59.             led <=  1'b0        ;
  60. //        else if(num==3'd2)
  61.         else if(edge_up &&(num==CHECK_NUM))
  62.             led <=  ~led        ;
  63.         else
  64.             led <=   led        ;
  65.     end



  66. endmodule


举报
  • edge_check_ok.png

    edge_check.v (2021-8-23 17:18 上传)

    2.17 KB, 下载次数: 1

更多回帖

发帖
×
20
完善资料,
赚取积分