开关量检测

开关量在检测过程中可能会产生抖动,程序需要进行必要的滤波处理。

CLK: 时钟,这里接入25M的时钟,WOBBLE_DELAY参数是抖动时间,它的值根据时钟的不同改变。

EN:检测开关。

LOGIC_IN: 开关量的输入引脚。

LOGIC_IN_MASK:开关量的屏蔽位。

LOGIC_IN_INT:开关量中断。

LOGIC_IN_STATE: 开关量的状态,仅在打开检测开关(EN)时读入的值有效。

CLEAR_INT:中断来临后,主机读取中断后写入1清中断。

 

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. module LogicInMan  
  2. #(parameter WOBBLE_DELAY = 10 * 25000)  
  3. (  
  4.     CLK, EN, LOGIC_IN, LOGIC_IN_MASK, LOGIC_IN_INT, LOGIC_IN_STATE, CLEAR_INT  
  5. );  
  6. input CLK, EN;  
  7. input[7:0] LOGIC_IN;  
  8. input[7:0] LOGIC_IN_MASK;  
  9. output LOGIC_IN_INT;  
  10. output[7:0] LOGIC_IN_STATE;  
  11. inout CLEAR_INT;  
  12.   
  13.   
  14. reg LOGIC_IN_INT;  
  15. reg clear_int_reg;  
  16.   
  17.   
  18. reg[7:0] validLogicInStu;  
  19. reg[7:0] orginLogicInStu;  
  20. reg[7:0] lastLogicIn, curLogicIn;  
  21. wire[7:0] logic_in_state;  
  22.   
  23. assign logic_in_state = validLogicInStu ^ orginLogicInStu;  
  24. assign LOGIC_IN_STATE = logic_in_state;  
  25.   
  26. always @(posedge CLK)  
  27. begin  
  28.   if(!EN)  
  29.     orginLogicInStu <= validLogicInStu;   
  30.       
  31.   lastLogicIn <= curLogicIn;  
  32.   curLogicIn <= LOGIC_IN;  
  33. end  
  34.   
  35. wire time_dly;  
  36. wire start_dly;  
  37.   
  38. assign start_dly = (curLogicIn == lastLogicIn)?1'b1:1'b0;  
  39.   
  40. reg time_dly1, time_dly2;  
  41. wire time_dly_tig;  
  42. assign time_dly_tig = time_dly1 & ~time_dly2;  
  43. always @(posedge CLK)  
  44. begin  
  45.   time_dly1 <= time_dly;  
  46.   time_dly2 <= time_dly1;  
  47. end  
  48.   
  49. always @(posedge CLK)  
  50. begin  
  51.     if(time_dly_tig)  
  52.     begin  
  53.         validLogicInStu <= LOGIC_IN;  
  54.     end  
  55.   
  56. end  
  57.   
  58. reg[31:0] count;  
  59. assign time_dly = (count == WOBBLE_DELAY)? 1'b1:1'b0;  
  60. always @(posedge CLK)  
  61. begin  
  62.     if(!start_dly)  
  63.         count <= 32'd0;  
  64.     else  
  65.     begin  
  66.         if(count < WOBBLE_DELAY)  
  67.             count <= count + 32'd1;  
  68.     end  
  69.   
  70. end  
  71.   
  72.   
  73. reg stu1, stu2;  
  74. wire int_tig;  
  75. assign int_tig = (stu1 != stu2 && (logic_in_state & LOGIC_IN_MASK))?1'b1:1'b0;  
  76. always @(posedge CLK)  
  77. begin  
  78.   stu1 <= logic_in_state;  
  79.   stu2 <= stu1;  
  80. end  
  81.   
  82. always @(posedge CLK)  
  83. begin  
  84.     if(!EN || clear_int_reg)  
  85.         LOGIC_IN_INT <= 1'b0;  
  86.     else  
  87.     begin  
  88.         if(int_tig)  
  89.             LOGIC_IN_INT <= 1'b1;  
  90.     end  
  91. end  
  92.   
  93. always @(posedge CLK)  
  94. begin  
  95.     if(CLEAR_INT)  
  96.         clear_int_reg <= 1'b1;  
  97.     else  
  98.         clear_int_reg <= 1'b0;  
  99. end  
  100.   
  101. assign CLEAR_INT = (!EN || clear_int_reg)?1'b0:1'bz;  
  102.   
  103. endmodule  


1. 程序中一直检测开关量的状态(无论是否打开检测开关),当开关量信号改变时开始记时,当信号稳定10ms后将它看作一个稳定信号。

2. 当打开检测开关时,记录下开关量的原始状态,这样做是考虑开关量常开、常闭或开关量不接的情况,以后的开关量状态与原始的开关量状态相比较(异或关系)。

3. 是否产生一个中断要与开关量屏蔽位相比较。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值