马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 wlmnzf 于 2014-12-9 18:08 编辑
实现一个消抖模块,并通过调用它来达到按一个按钮就亮一个led灯 代码如下,前面一个是直接在消抖模块中控制led(成功),后一个是在别的模块中调用消抖模块,(失败)
- module xiaodou(pinIn,clr,clk,h2lSig,l2hSig,cnt,out);
- input pinIn;
- input clr;
- input clk;
- output reg h2lSig;
- output reg l2hSig;
- reg stateNow;//当前状态
- reg stateNext;//检测后的状态
- output reg [10:0] cnt;
- output reg [7:0] out;
-
- always @( posedge clk or posedge clr)
- if ( clr )
- begin
- stateNow<=0;//与实验要求不同,这里值为零
- stateNext<=0;
- h2lSig<=0; //松开
- l2hSig<=0;//按下
- cnt <= 0;
- end
- else
- begin
- if(stateNow==0)
- begin
- if(pinIn==1)//按下
- begin
- stateNext<=1;
- if(cnt<500) cnt <= cnt+1;
- else
- begin
- case(out)
- 8'b00000000:out<=8'b10000000;
- 8'b10000000:out<=8'b11000000;
- 8'b11000000:out<=8'b11100000;
- 8'b11100000:out<=8'b11110000;
- 8'b11110000:out<=8'b11111000;
- 8'b11111000:out<=8'b11111100;
- 8'b11111100:out<=8'b11111110;
- 8'b11111110:out<=8'b11111111;
- 8'b11111111:out<=8'b10000000;
- default:out<=8'b00000000;
- endcase
- l2hSig<=1;
- h2lSig<=0;
- stateNow<=1;
- cnt<=0;
- end
- end
- else
- begin
- stateNext<=0;
- cnt<=0;
- end
- end
- else //if(stateNow==1)
- begin
- if(pinIn==0) //松开
- begin
- stateNext<=0;
- if(cnt<500) cnt <= cnt+1;
- else
- begin
- l2hSig<=0;
- h2lSig<=1;
- stateNow<=0;
- cnt<=0;
- end
- end
- else
- begin
- cnt<=0;
- stateNext<=1;
- end
- end
- end
- endmodule
复制代码
- module wlmALL(clr,clk,in,out,h2lSig,l2hSig);
- input in;
- reg cnt;
- output reg [7:0]out=8'b00000000;
- input clr;
- input clk;
- reg [10:0] i;
- //reg [7:0] tmp=8'b00000000;
- reg flag;
- output h2lSig;
- output l2hSig;
- xiaodou XD(
- .pinIn (in),
- .clr (clr),
- .clk (clk),
- .h2lSig(h2lSig),
- .l2hSig(l2hSig)
- );
- always @(l2hSig)
- if(l2hSig==1)
- begin
- case(out)
- 8'b00000000:out<=8'b10000000;
- 8'b10000000:out<=8'b11000000;
- 8'b11000000:out<=8'b11100000;
- 8'b11100000:out<=8'b11110000;
- 8'b11110000:out<=8'b11111000;
- 8'b11111000:out<=8'b11111100;
- 8'b11111100:out<=8'b11111110;
- 8'b11111110:out<=8'b11111111;
- 8'b11111111:out<=8'b10000000;
- default:out<=8'b00000000;
- endcase
- end
- endmodule
- module xiaodou(pinIn,clr,clk,h2lSig,l2hSig);
- input pinIn;
- input clr;
- input clk;
- output reg h2lSig;
- output reg l2hSig;
- reg stateNow;//当前状态
- reg stateNext;//检测后的状态
- reg [20:0] cnt;
-
- always @( posedge clk or posedge clr)
- if ( clr )
- begin
- stateNow<=0;//与实验要求不同,这里值为零
- stateNext<=0;
- h2lSig<=0; //松开
- l2hSig<=0;//按下
- cnt <= 0;
- end
- else
- begin
- if(stateNow==0)
- begin
- if(pinIn==1)//按下
- begin
- stateNext<=1;
- if(cnt<70000) cnt <= cnt+1;
- else
- begin
- l2hSig<=1;
- h2lSig<=0;
- stateNow<=1;
- cnt<=0;
- end
- end
- else
- begin
- stateNext<=0;
- cnt<=0;
- end
- end
- else //if(stateNow==1)
- begin
- if(pinIn==0) //松开
- begin
- stateNext<=0;
- if(cnt<70000) cnt <= cnt+1;
- else
- begin
- l2hSig<=0;
- h2lSig<=1;
- stateNow<=0;
- cnt<=0;
- end
- end
- else
- begin
- cnt<=0;
- stateNext<=1;
- end
- end
- end
- endmodule
复制代码
|