作者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/m.aspx?n=bbs/Electronics/M.1401793570.A.351.html
1F:推 CaskY:腦補給推 06/04 14:38