本帖最后由 zhangyuhua 于 2017-3-12 20:27 编辑
今天在学习制作一个倒计时系统时,学到了一个新的知识点。 一个按键具有两种功能作用。当按键首次被按下时,代表给FPGA发送了一个Start信号,系统开始计时;当再次按下此按键时,代表给FPGA发送了一个Stop信号,系统停止计时。(注释:key=1-------按键没被按下; key=0-------按键被按下 )模块信号列表:
信号名 | 位宽 | I/O | 备注 | sclk | 1 | input | 系统时钟(50M) | rst_n | 1 | input | 系统复位(低电平有效) | key | 1 | input | 按键(key=1表明按键没被按下;key=0表明按键被按下) | cnt | 4 | output | 计数 | 源代码和Modelsim仿真图如下:
- //一个按键具有两种功能作用。(如:按一下表示开始(Start)信号,而再按一下表示停止(Stop)信号)
- module one_have_two(
- //System Signals
- input sclk ,
- input rst_n ,
- //Interface
- input key , //key=1----The key not is pressed
- //key=0----The key is pressed
- //Others
- output reg [3:0] cnt
- );
- //========================================================================\
- // **********Define Parameter and Internal Signals*******************
- //========================================================================/
- parameter END_CNT = 14 ;
-
- wire add_cnt ;
- wire end_cnt ;
- reg flag ;
- //========================================================================\
- // **********Main Code*******************
- //========================================================================/
- //cnt
- always @(posedge sclk or negedge rst_n)
- begin
- if(!rst_n)
- cnt<='d0;
- else if(add_cnt)
- if(end_cnt)
- cnt<='d0;
- else cnt<=cnt+1'b1;
-
- end
- assign add_cnt=flag;
- assign end_cnt=add_cnt && cnt==END_CNT;
- //flag
- always @(posedge sclk or negedge rst_n)
- begin
- if(!rst_n)
- flag<=1'b0;
- else if(key==1'b1 ) //The key not is pressed
- flag<=1'b0;
- else flag<=~flag; //The key is pressed
- end
- endmodule
|