作者appendixisu (不知道我是谁)
看板Electronics
标题Re: [问题] verilog 一个按键多重功能
时间Tue Jun 3 19:06:07 2014
原文恕删~~
我自己脑补了你想要做的事情
1.有二个实体的按键 按的时候是0 放开的时候是1
2.功能是一个计时装置
3.其中一个按键 按一下开始计时 按一下暂停
4.另外一个按键 按一下暂停 按一下归零
//=============================================
// Timer Counter
//=============================================
module Timer_Counter(reset, clk, button1, button2, cnt_out);
input reset, clk ; // High active reset
input button1 ; // Function 3
input button2 ; // Function 4
output [31:0] cnt_out ; // Counter Value
reg [31:0] cnt_out ;
reg bton1_buf0, bton1_buf1, bton1_buf2 ;
reg bton2_buf0, bton2_buf1, bton2_buf2 ;
reg cnt_pause, cnt_preset ;
//==========================================
// Button Buffer & falling edge detect
//==========================================
always@(posedge reset or posedge clk) begin
if (reset)
{bton1_buf0, bton1_buf1, bton1_buf2} <= 3'b000 ;
else
{bton1_buf0, bton1_buf1, bton1_buf2} <=
{button1, bton1_buf0, bton1_buf1} ;
end
always@(posedge reset or posedge clk) begin
if (reset)
{bton2_buf0, bton2_buf1, bton2_buf2} <= 3'b000 ;
else
{bton2_buf0, bton2_buf1, bton2_buf2} <=
{button2, bton2_buf0, bton2_buf1} ;
end
wire bton1_f_edge = ~bton1_buf1 & bton1_buf2 ;
wire bton2_f_edge = ~bton2_buf1 & bton2_buf2 ;
//
// 注解:我喜欢把非同步的讯号,经过3个FF後,才做判断edge的动作
// 这样至少会有1T的Clock时间来deglich
//
//==========================================
// Counter control
//==========================================
always@(posedge reset or posedge clk) begin
if (reset)
cnt_pause <= 1'b1 ;
else if (cnt_pause && bton1_f_edge)
cnt_pause <= 1'b0 ;
else if (!cnt_pause && (bton1_f_edge || bton2_f_edge))
cnt_pause <= 1'b1 ;
end
always@(posedge reset or posedge clk) begin
if (reset)
cnt_preset <= 1'b0 ;
else if (cnt_pause && bton2_f_edge)
cnt_preset <= 1'b1 ;
else
cnt_preset <= 1'b0 ;
end
//==========================================
// Counter
//==========================================
always@(posedge reset or posedge clk) begin
if (reset) // async reset
cnt <= 32'h0000_0000 ;
else if (cnt_preset) // sync reset
cnt <= 32'h0000_0000 ;
else if (cnt_pause)
cnt <= cnt ;
else
cnt <= cnt + 1'b1 ;
end
wire cnt_out = cnt ;
endmodule
大概的想法就是这样!!~~把code分成三个部分
1.判断按键有没有按
2.按了要做什麽动作
3.让计数器依照动作来动作
希望对你有帮助~~
P.S. 我没有做过Compiler 所以有错字请见谅!!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.132.37.177
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Electronics/M.1401793570.A.351.html
1F:推 CaskY:脑补给推 06/04 14:38