前言模块化设计是FPGA设计中一个很重要的设计原则,它能够使一个大型设计的分工协作和仿真测试更加容易,使代码维护和升级更加便利。本篇体验由蜂鸣器和按键两个模块组成的按键控制蜂鸣器演示,并考虑按键消抖。 代码分析1_Verilog3_top_key_beep 模块划分如下,由两个模块key_debounce和beep_control组成
Key_debounce模块实现消抖,在按键变化时开始定时1000000个CLK, 每个CLK递减1,直到减少到1,则认为有按键变化且稳定,设置标志key_flag 如果递减到1之前按键又有变化,则重新从1000000开始递减。 如果递减到0则认为按键一直没变,不再递减,直到等待下一次按键变化。
beep_contral模块在按键按下时翻转蜂鸣器输出
- module beep_control(
- //input
- input sys_clk, //系统时钟
- input sys_rst_n, //复位信号,低电平有效
- input key_flag, //按键有效信号
- input key_value, //消抖后的按键信号
- output reg beep //蜂鸣器控制信号
- );
- //*****************************************************
- //** main code
- //*****************************************************
- 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
复制代码
顶层模块例化两个模块
- module top_key_beep(
- input sys_clk, //时钟信号50Mhz
- input sys_rst_n, //复位信号
- input key, //按键信号
- output beep //蜂鸣器控制信号
- );
- //wire define
- wire key_value;
- wire key_flag;
-
- //*****************************************************
- //** main code
- //*****************************************************
-
- //例化按键消抖模块
- key_debounce u_key_debounce(
- .sys_clk (sys_clk),
- .sys_rst_n (sys_rst_n),
- .key (key),
- .key_flag (key_flag),
- .key_value (key_value)
- );
- //例化蜂鸣器控制模块
- beep_control u_beep_control(
- .sys_clk (sys_clk),
- .sys_rst_n (sys_rst_n),
- .key_flag (key_flag),
- .key_value (key_value),
- .beep (beep)
- );
- endmodule
复制代码
测试生成bit文件下载,和之前一样不再赘述 测试:按键KEY0,可以开关蜂鸣器,功能OK。 总结这一篇,体验了模块化设计思想和按键消抖的思路,测试了蜂鸣器和按键。
|