打印
[verilog]

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

[复制链接]
907|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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仿真图如下:
//一个按键具有两种功能作用。(如:按一下表示开始(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





相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

26

帖子

1

粉丝