1.試驗(yàn)任務(wù):
使用按鍵控制蜂鳴器發(fā)聲。 初始狀態(tài)為蜂鳴器鳴叫,按下開關(guān)后蜂鳴器停
止鳴叫,再次按下開關(guān),蜂鳴器重新鳴叫。
2. 按鍵消抖
3.程序設(shè)計(jì)
文章來源:http://www.zghlxwxcb.cn/news/detail-520481.html
3.1消抖模塊
// An highlighted block
module key_debounce( //消抖模塊
input sys_clk, //時(shí)鐘信號,50Mhz
input sys_rst_n, //復(fù)位信號
input key, //按鍵
output reg key_flag, //按鍵有效的標(biāo)志
output reg key_value //按鍵有效的值
);
reg key_reg; //key的寄存器,比對兩個(gè)時(shí)鐘時(shí)將值放在寄存器內(nèi)
reg [19:0]delay_cnt; //延時(shí)20ns的寄存器,20ms=20000000ns,20000000ns/20=1000000個(gè)時(shí)鐘周期,位寬為20位
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin //按下復(fù)位按鍵
key_reg <= 1'b1; //key_reg按鍵為低電平有效,所以拉高
delay_cnt <= 20'd0; //計(jì)數(shù)器清零
end
else begin
key_reg <= key; //將key的值存入寄存器中(注,key的值等到下一個(gè)邊沿過來時(shí),才會(huì)傳遞給key_reg,既key_reg的值和key的值相差一個(gè)時(shí)鐘周期)
if(key_reg!=key) //上一個(gè)值是否和當(dāng)前值相同,若按下按鍵則當(dāng)前值和上一值不同,則進(jìn)入該語句
delay_cnt <= 32'd100_0000; //把delay_cnt寄存器充滿20ms
else if(key_reg==key)begin //上一個(gè)值是否和當(dāng)前值相同,若沒有按按鍵則當(dāng)前值和上一值相同,則進(jìn)入該語句
if(delay_cnt > 32'd0)
delay_cnt <=delay_cnt-1'b1; //
else
delay_cnt <=delay_cnt;
end
end
end
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
key_flag <= 1'b0; //如果復(fù)位將flag清零
key_value <= 1'b1; //為低時(shí)才判定按鍵按下
end
else begin
if(delay_cnt == 32'd1)begin
key_flag <= 1'b1;
key_value <= key;
end
else begin
key_flag <= 1'b0;
key_value <= key_value;
end
end
end
endmodule
3.2消抖模塊流程圖
文章來源地址http://www.zghlxwxcb.cn/news/detail-520481.html
3.3 蜂鳴器驅(qū)動(dòng)模塊程序
// An highlighted block
module beep_control( //消抖模塊
input sys_clk, //時(shí)鐘信號,50Mhz
input sys_rst_n, //復(fù)位信號
input key_flag, //按鍵有效的標(biāo)志
input key_value, //按鍵有效的值
output reg beep
);
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
beep <= 1'b1;
else if(key_flag&&(~key_value))
beep <=~beep;
end
endmodule
3.4 頂層例化模塊程序
// An highlighted block
module top_key_beep(
input sys_clk, //時(shí)鐘信號,50Mhz
input sys_rst_n, //復(fù)位信號
input key,
output beep
);
wire key_flag;
wire key_value;
key_debounce key_debounce_u(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.key (key),
.key_flag (key_flag),
.key_value (key_value)
);
beep_control beep_control_u(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.key_flag (key_flag),
.key_value (key_value),
.beep (beep)
);
endmodule
3.5 ucf模塊
// An highlighted block
NET sys_clk TNM_NET = sys_clk_pin;
TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 20ns HIGH 50%;
#------------------------------系統(tǒng)時(shí)鐘和復(fù)位-----------------------------------
NET sys_clk LOC = N8 | IOSTANDARD = "LVCMOS33";
NET sys_rst_n LOC = G16 | IOSTANDARD = "LVCMOS33";
NET "key" LOC = P5 | IOSTANDARD = "LVCMOS33";
NET beep LOC = P4 | IOSTANDARD = "LVCMOS33";
到了這里,關(guān)于key_beep按鍵控制蜂鳴器程序及流程圖的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!