[verilog] 一个按键具有两个功能(如:Start/Stop信号)

[复制链接]
 楼主| zhangyuhua 发表于 2017-3-12 20:07 | 显示全部楼层 |阅读模式
本帖最后由 zhangyuhua 于 2017-3-12 20:27 编辑

     今天在学习制作一个倒计时系统时,学到了一个新的知识点。     一个按键具有两种功能作用。当按键首次被按下时,代表给FPGA发送了一个Start信号,系统开始计时;当再次按下此按键时,代表给FPGA发送了一个Stop信号,系统停止计时。(注释:key=1-------按键没被按下;                                                                                                                                                                                                                                     key=0-------按键被按下      )模块信号列表:
信号名 位宽 I/O 备注
sclk 1 input 系统时钟(50M)
rst_n1 input 系统复位(低电平有效)
key1 input 按键(key=1表明按键没被按下;key=0表明按键被按下)
cnt4 output 计数
源代码和Modelsim仿真图如下:
  1. //一个按键具有两种功能作用。(如:按一下表示开始(Start)信号,而再按一下表示停止(Stop)信号)
  2. module        one_have_two(
  3.                                         //System Signals
  4.                                         input                                sclk                ,
  5.                                         input                                rst_n                ,
  6.                                         //Interface
  7.                                         input                                key                        ,        //key=1----The key not is pressed
  8.                                                                                                                 //key=0----The key is pressed
  9.                                         //Others
  10.                                         output        reg        [3:0]        cnt
  11.                                 );
  12. //========================================================================\
  13. // **********Define Parameter and Internal Signals*******************
  14. //========================================================================/
  15. parameter        END_CNT                =        14                ;
  16.                                 
  17. wire       add_cnt    ;
  18. wire      end_cnt    ;
  19. reg       flag           ;

  20. //========================================================================\
  21. // **********Main Code*******************
  22. //========================================================================/
  23. //cnt
  24. always        @(posedge sclk or negedge rst_n)
  25.      begin
  26.            if(!rst_n)
  27.                 cnt<='d0;
  28.           else        if(add_cnt)
  29.                      if(end_cnt)
  30.                          cnt<='d0;
  31.                      else        cnt<=cnt+1'b1;
  32.                                 
  33.     end
  34. assign        add_cnt=flag;
  35. assign        end_cnt=add_cnt &&        cnt==END_CNT;

  36. //flag
  37. always        @(posedge sclk or negedge rst_n)
  38.      begin
  39.           if(!rst_n)
  40.              flag<=1'b0;
  41.           else        if(key==1'b1 )         //The key not is pressed
  42.                     flag<=1'b0;
  43.                 else        flag<=~flag;     //The key is pressed
  44.     end

  45. endmodule





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

26

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

14

主题

26

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部