你的设计是不是可以改成这样?" G, q! R. \7 \0 {6 c0 q" y always @ (posedge SYSCLK or negedge RST_B) begin if(!RST_B) TIME_CNT <= `UD 20'h0;0 S* j# y/ C& N8 E! J else if(TIME_CNT == 20'hf4240) TIME_CNT <= `UD 20'h0; else 0 y) M- ` B, s% h TIME_CNT <= `UD TIME_CNT +1'h1; end3 m! c# l2 u6 T# P. {! j( k! ?1 f2 u //Save the key value when some key is press8 h* \5 { a( T' _7 c4 u } always @ (posedge SYSCLK or negedge RST_B) begin if(!RST_B); b" ]* V x0 r KEY_REG <= `UD 2'h3; else if(TIME_CNT == 20'h0) KEY_REG <= {KEY_REG[0] , KEY_B}; end# j" n& d3 q7 e$ i6 @1 E5 w& j, t% o ) ]/ c" ^/ S- c' {5 ?0 ~: T. T+ G : j# ~) ?) J3 g) F+ V: G$ v //Output control. always @ (posedge SYSCLK or negedge RST_B)5 B4 s; D) V. c8 n' ?/ W begin) S2 F3 h \/ w4 ] `7 Q, l, I if(!RST_B) LED_B <= `UD 1'h1; else if((KEY_REG == 2'b01) && (TIME_CNT == 20'hf4240)) LED_B <= `UD ~LED_B;; y/ _9 C( }' s G ] end |
你检查一下always或者是initial这里面的敏感参数列表,如果一开始不能有触发状态可能导致未知状态出现 |
always @ (posedge SYSCLK or negedge RST_B) begin if(!RST_B) *********************************** 5 r$ r- ^' p$ c& D$ m 应该是和这个有关系 |
来人啊!怎么没人哦!( K+ y# u1 T1 l: {# T |
另外,此程序是利用延时20ms的方法实现按键去抖动的,它是每隔20ms采样一次键值,我的疑问就是,它会不会刚好在20ms的时候,按键正在抖动,恰好把抖动的键值给采样了? |
下面贴上源代码!. g& {! v6 V% f3 G `define UD #1; P7 E4 ]# r# P; N$ ^* z3 D 8 v* v9 J/ g; D. j5 T! F: c module KEY_TEST* Q& n- E; a: _: V# `* F/ r6 r; z (+ i: ]% Z% U. r //Input ports. SYSCLK, RST_B, KEY_B, ' Z' _1 ]1 |: H6 \! Y2 t' F- T# f //Output ports.: t$ W4 l- T+ p( D1 B LED_B- _% B T+ J% X/ u4 Z );% E5 u$ x" \5 E% l# h //=========================================================================== //Input and output declaration //=========================================================================== W9 n4 [- R8 @ input SYSCLK; //System clock, 50MHz.9 n9 j7 K0 a/ r" O x3 W. H input RST_B; //Global reset, low active. input KEY_B; //Key input, low active.# S9 Q- m; m* U+ e& f' k. G - S9 k! @! q1 I output LED_B; //Led output, low active.) m1 o5 J8 g7 X' @$ g7 b0 u+ v q( Y$ f7 V; b: W3 a7 N4 \ //=========================================================================== //Wire and reg declaration8 y8 l, X% a8 l6 m0 [ //=========================================================================== 5 m1 G. X0 N9 ^7 Z5 E wire SYSCLK;- R3 z8 h: H4 \ wire RST_B;1 Y+ l0 G0 B7 F, ^8 V wire KEY_B; & s- w! P7 h* E3 H- L- ?1 t; H( D reg LED_B;( V) w# D% R4 M( s2 f& G 2 H: f, s$ [$ l. N //=========================================================================== //Wire and reg in the module - S! E) w" x$ F; `6 ]9 Q# J //=========================================================================== t$ s4 t- ^ Z& `: u4 I6 W/ m reg [19:0] TIME_CNT; //Counter, count press key time.6 C+ ?! k8 P& z7 {, i/ l) j reg [1:0] KEY_REG; //Save the input one cycle every 20ms. reg LED_B_N; //Next value of LED_B.* t9 T5 E- p# x( l4 C ! y: [2 [: s) X& p2 i$ E; Y1 d) } wire [19:0] TIME_CNT_N; //Next value of TIME_CNT. reg [1:0] KEY_REG_N; //Next value of KEY_REG. , y! r8 B2 l8 Y4 r1 j# _4 e //=========================================================================== //Logic //===========================================================================' B# t5 O6 b) b" F# F 3 U( m& q/ W1 W, A1 N! n //Count the time the key is pressed, free running., B) i( g2 Q2 H7 T9 l always @ (posedge SYSCLK or negedge RST_B) begin+ D" B5 I2 H$ b8 ^" M( I# p. _ if(!RST_B)# [7 K3 _* M+ D; S- x TIME_CNT <= `UD 20'h0; else TIME_CNT <= `UD TIME_CNT_N;* _- {' ?* e" r end //Count cycle 20ms( a$ z% H) s4 @* w, N assign TIME_CNT_N = (TIME_CNT == 20'hf4240) ? 20'h0 : TIME_CNT +1'h1; //Save the key value when some key is press.& V6 X1 j6 N! Y always @ (posedge SYSCLK or negedge RST_B)8 A9 J5 O5 b4 I' [, r2 U begin if(!RST_B) KEY_REG <= `UD 2'h3; else KEY_REG <= `UD KEY_REG_N;( l9 k. t9 N! w5 {1 `# V end always @ (*) begin: x3 F/ }. b3 r if(TIME_CNT == 20'h0) KEY_REG_N = {KEY_REG[0] , KEY_B};, l8 p& Z( \ W: ~! O8 ^ else KEY_REG_N = KEY_REG; end //Output control. always @ (posedge SYSCLK or negedge RST_B)& m: x& [ |5 s- d6 q" I- i begin' x+ s, c; E& j7 ^ if(!RST_B) LED_B <= `UD 1'h1;/ D ]2 ~" R9 |/ d) J else LED_B <= `UD LED_B_N; end8 e, d2 R, W; d k, J6 R, P5 A- i$ g # w: r9 }6 H/ ]7 m$ z$ x always @ (*)1 @! A0 x" C9 y. t* c+ J begin if((KEY_REG == 2'b01) && (TIME_CNT == 20'hf4240)) LED_B_N = ~LED_B;! W' a3 Z2 J4 S6 Q2 w8 P else LED_B_N = LED_B;# O# O9 e* W/ W# i2 c& r end ; F- X$ f; S$ Q endmodule |
关于我们|手机版|EDA365 ( 粤ICP备18020198号 )
GMT+8, 2025-2-20 14:51 , Processed in 0.060158 second(s), 37 queries , Gzip On.
地址:深圳市南山区科技生态园2栋A座805 电话:19926409050