按键的使用(一)------verilog

摘要:
在这个实验中,只使用前三种效果。代码如下:_函数。v**创建日期:2015.03**函数:键的一些函数:1.按一次**操作:M5C06N3L114C7**版权所有。**版本:V1.0***---------------------------修改格式------------------**修改者:**修改数据:**修改内容:***************************************/modulekey_函数;输入clk;//24分钟;输入键_1;//按1键可按下有效的输入键_2;//按键2。按下持续有效的输入键_3;//按键3。按无效键释放有效输出_1;//当键1有效时,翻转输出d_ 2;//当键1有效时,翻转输出d_ 3;//当键1有效时,翻转//------------------------------//频率被划分为4hz,这样下载到板上的现象明显_4hz;本地参数cnt_4hz=23'd5999999;//实际设计//localparamcnt_4hz=23'd599;//Reg[22:0]cnt用于模拟试验;always@beginif(!key_2)开始时间˂=0;elsecnt˂=cnt+1;endelsecnt˂=0;endassignclk_4hz=;//4HZ时钟,只有一个时钟时间//----------------键1-----------------reg[2:0]键_1_reg;线键1_负;always@beginif(!rst_n)开始键_1_reg˂=3'b111;//未按下默认键时的高电平endelsebeginkey 1_ reg˂={key_1_reg[1:0],key_1};endendassignkey_1_neg=密钥_1_reg[2]&;regled_ d1;always@beginif(!Key_2)//如果//当4hz时钟为高时,LED_ d2˂=~LED_ d2,则按键开始;elseled_ d2˂=发光二极管d2;end//--------------键3----------------reg[2:0]键_3_reg;线键_ 3_位置;always@beginif (!

 按键在项目中应用还是很频繁的,这里主要介绍按键的几种用法。

1、按下一次有效:按下一次计数器增加一下。

2、按下连续有效:按下不松,计数器就一直增加。

3、按下无效,松开有效:按下时计数器值不变,按键释放的时候计数器增加一下。

4、一键多用:点击与长击,单击与双击:这个比较复杂。

本试验只学习使用前3种作用。代码如下:

  

按键的使用(一)------verilog第1张按键的使用(一)------verilog第2张
/********************************Copyright**************************************                           
**----------------------------File information--------------------------
** File name  :key_function.v  
** CreateDate :2015.03
** Funtions   :按键的一些作用:1、按下一次有效。2、按下连续有效。3、按下无效,松开有效。默认按键已经消抖。
** Operate on :M5C06N3L114C7
** Copyright  :All rights reserved. 
** Version    :V1.0
**---------------------------Modify the file information----------------
** Modified by   :
** Modified data :        
** Modify Content:
*******************************************************************************/
 
module  key_function (
           clk,
           rst_n,
           
                     key_1,
                     key_2,
                     key_3,
                     
                     led_1,
                     led_2,
                     led_3
             );
 input          clk;            //24M
 input          rst_n;
 input          key_1;          //按键1,按下一次有效
 input          key_2;          //按键2、按下连续有效
 input          key_3;          //按键3、按下无效释放有效
 
 output         led_1;          //按键1有效时,翻转
 output         led_2;          //按键1有效时,翻转 
 output         led_3;          //按键1有效时,翻转
 
 //------------------------------
 //分频到4hz(250ms),使下载到板子的现象明显
 wire        clk_4hz;
 localparam  cntt_4hz = 23'd5999999;         //实际设计
// localparam  cntt_4hz = 23'd599;               //仿真测试用
 reg      [22:0]      cnt;
 always @(posedge clk or negedge rst_n)
 begin
  if(!rst_n)
   begin
      cnt <= 0;
    end
  else  if(!key_2)
    begin
      if(cnt == cntt_4hz)
               cnt <= 0;
            else 
                cnt <= cnt + 1;
    end
    else 
        cnt <= 0; 
  end
    
assign  clk_4hz = (cnt == cntt_4hz);         //4HZ的时钟,只有一个clk的时间

//----------key1----------------
reg     [2:0]    key_1_reg;
wire             key_1_neg;
always @(posedge clk or negedge rst_n)
 begin
  if(!rst_n)
   begin
       key_1_reg <= 3'b111;                //默认按键没有按下时为高电平
    end
  else 
    begin
        key_1_reg  <= {key_1_reg[1:0],key_1};
    end
  end

assign key_1_neg = key_1_reg[2]&(~key_1_reg[1]);

reg      led_d1;
always @(posedge clk or negedge rst_n)
 begin
  if(!rst_n)
   begin
      led_d1 <= 0;
    end
  else if(key_1_neg)
    begin
      led_d1 <= ~led_d1; 
    end
    else 
          led_d1 <= led_d1;     
  end
//--------------key2--------------
 reg             led_d2;
 always @(posedge clk or negedge rst_n)
 begin
  if(!rst_n)
   begin
     led_d2  <= 0;
    end
  else if(!key_2)               //按键按下后
    begin
     if(clk_4hz)                //4hz时钟高电平来的时候
            led_d2  <= ~led_d2;
          else 
                led_d2  <= led_d2;    
    end
  end
    
//--------------key3--------------
reg    [2:0]     key_3_reg;
wire             key_3_pos;
always @(posedge clk or negedge rst_n)
 begin
  if(!rst_n)
   begin
       key_3_reg <= 3'b111;                //默认按键没有按下时为高电平
    end
  else 
    begin
        key_3_reg  <= {key_3_reg[1:0],key_3};
    end
  end

assign key_3_pos = ~key_3_reg[2]&key_3_reg[1];

reg      led_d3;
always @(posedge clk or negedge rst_n)
 begin
  if(!rst_n)
   begin
      led_d3 <= 0;
    end
  else if(key_3_pos)
    begin
      led_d3 <= ~led_d3; 
    end
    else 
          led_d3 <= led_d3;     
  end

    
//---------------------
assign led_1 = led_d1;
assign led_2 = led_d2;
assign led_3 = led_d3;

endmodule
View Code

仿真代码:

按键的使用(一)------verilog第3张按键的使用(一)------verilog第4张
/********************************Copyright**************************************                           
**----------------------------File information--------------------------
** File name  :key_function_testbench.v  
** CreateDate :2015.03
** Funtions   :按键功能的测试文件
** Operate on :M5C06N3L114C7
** Copyright  :All rights reserved. 
** Version    :V1.0
**---------------------------Modify the file information----------------
** Modified by   :
** Modified data :        
** Modify Content:
*******************************************************************************/
 
`timescale 1 ns/1 ns

module  key_function_testbench ;
 reg          clk;            //24M
 reg          rst_n;
 reg          key_1;          //按键1,按下一次有效
 reg          key_2;          //按键2、按下连续有效
 reg          key_3;          //按键3、按下无效释放有效
 
 wire         led_1;          //按键1有效时,翻转
 wire         led_2;          //按键1有效时,翻转 
 wire         led_3;          //按键1有效时,翻转
    
key_function   key_function_1(
                                         .clk,
                                         .rst_n,
                                         
                                         .key_1,
                                         .key_2,
                                         .key_3,
                                         
                                         .led_1,
                                         .led_2,
                                         .led_3
                                             );

parameter  tck = 24;
parameter  t = 1000/tck;

always  #(t/2)   clk = ~clk;

    initial 
        begin
      clk = 0;
            rst_n = 0;
            key_1 = 1;
            key_2 = 1;
            key_3 = 1;
            
        
         #(100*t)  rst_n = 1;
         
         #(100*t)  key_1 = 1;
         #(60*t)   key_1 = 0;
         #(40*t)   key_1 = 1;
         #(60*t)   key_1 = 0;
         #(40*t)   key_1 = 1;
         #(60*t)   key_1 = 0;
         #(40*t)   key_1 = 1;
         #(60*t)   key_1 = 0;
         #(40*t)   key_1 = 1;
         
         
         #(100*t)  key_2 = 1;
         #(60*t)   key_2 = 0;
         #(10000*t);
         #(40*t)   key_2 = 1;
         #(60*t)   key_2 = 0;
         #(10000*t);
         #(40*t)   key_2 = 1;
         #(60*t)   key_2 = 0;
         #(10000*t);
         #(40*t)   key_2 = 1;

         #(100*t)  key_3 = 1;
         #(60*t)   key_3 = 0;
         #(40*t)   key_3 = 1;
         #(60*t)   key_3 = 0;
         #(40*t)   key_3 = 1;
         #(60*t)   key_3 = 0;
         #(40*t)   key_3 = 1;
         #(60*t)   key_3 = 0;
         #(40*t)   key_3 = 1;
         
        end
    
endmodule 
View Code

仿真波形:

 1、按键按下时一次有效:

  按键的使用(一)------verilog第5张

2.按下连续有效:

按键的使用(一)------verilog第6张

3、按键释放时有效

按键的使用(一)------verilog第7张

免责声明:文章转载自《按键的使用(一)------verilog》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇多人开发时Git下冲突的产生和解决使用homebrew安装mysql下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Element-ui局部添加loading效果

Vue+element ui在加载表数据元素加载微调器=“el icon loading”时在测试过程中遇到问题:constloading=this$loading({lock://is与修改器相同text://ofv-loading图标目标:...

html2canvas踩坑日记

在html2canvas&lt;html2canvas(document.querySelector(“#capture”)).then(canvas=&gt;{document.body.appendChild(canvas)});//图片地址是文档。身体appendChild(画布);...

mysql修改字段防止锁表

步骤1:修改大表、addcolumn或dropcolumn的字段,操作完成后将锁定该表。此时,查询ok、insert和update将等待锁定。...

VMP加壳(三):VMP壳爆破实战-破解某编辑类软件

同时,记住在内存视图中向VMP0段提供断点后继续单击确认按钮,以查看调用方法的位置(此处的返回地址为0x5E01E9),但此处返回push(或vm条目)。这个地方会是验证码检测的入口吗!通过字符串查找各种键提示(sn、不正确注册等)的内存:通过访问断点查找键代码,然后找出调用该函数的函数,这与JCC指令的距离更远。...

buildroot使用介绍【转】

整个Buildroot由Makefile脚本和Kconfig配置文件组成。就像编译Linux内核一样,您可以编译一个完整的Linux系统软件,该软件可以通过buildroot配置和menuconfig修改直接写入机器。使用buildroot构建基于qemu的虚拟开发平台。请参阅通过buildroot+qemu构建ARM Linux虚拟开发环境。工具链--˃配...

DB2字符函数简介及使用

Param2可以是编码单元16-16位UTF-16编码,也就是说,字符串表示为16位UTF-18编码字符串。Codeunits32-32位UTF-32编码,即字符串表示为32位UTF 32编码字符串。请注意,定义为FORBITDATA的字符串不能转换为图形字符。如果length<length,则来自的原始字符串短于结果中的长度。...