【黑金教程笔记之004】【建模篇】【Lab 03 消抖模块之一】—笔记

设计思路:

(1)       一旦检测到按键资源按下(从高电平到低电平),“电平检测模块”就会拉高H2L_Sig电平,然后拉低。

(2)       “10ms延迟模块”检测到H2L_Sig高电平,就会利用10ms过滤H2L_Sig,拉高输出。

(3)       当按键被释放,“电平检测模块”会拉高L2H_Sig电平,然后拉低。

(4)       “10ms延迟模块”检测到L2H_Sig就会利用10ms过滤L2H_Sig然后拉低输出。

模块:

 1 /***********************************************************
 2 module name: detect_module.v
 3 function: detect pin‘s level change
 4
 5 by yf.x
 6 2014-11-05
 7
 8 ************************************************************/
 9
10 module detect_module(
11 CLK,
12 RST_n,
13 Pin_in,
14 H2L_Sig,
15 L2H_Sig
16 );
17
18 input CLK;
19 input RST_n;
20 input Pin_in;
21 output H2L_Sig;
22 output L2H_Sig;
23
24 /**************************************************************/
25 //DE2-115 use 50MHz oscillator,50M*0.0001-1=4_999
26 parameter T100us=11‘d4999;
27
28 /**************************************************************/
29
30 reg [10:0]count1;
31 reg isEn;
32
33 always @(posedge CLK or negedge RST_n)    //100us timer
34 if(!RST_n)
35   begin
36     count1<=11‘d0;
37      isEn<=1‘b0;
38   end
39 else if(count1==T100us)
40   isEn<=1‘b1;
41 else
42   count1<=count1+1‘b1;
43
44  /***********************************************************/
45
46 reg H2L_F1;
47 reg H2L_F2;
48 reg L2H_F1;
49 reg L2H_F2;
50
51 always @(posedge CLK or negedge RST_n)
52 if(!RST_n)
53   begin
54     H2L_F1<=1‘b1;
55      H2L_F2<=1‘b1;
56     L2H_F1<=1‘b0;
57     L2H_F2<=1‘b0;
58   end
59 else
60   begin
61     H2L_F1<=Pin_in;
62     H2L_F2<=H2L_F1;
63     L2H_F1<=Pin_in;
64     L2H_F2<=L2H_F1;
65   end
66
67 /*****************************************************/
68
69 assign H2L_Sig=isEn?(!H2L_F1&H2L_F2):1‘b0;
70 assign L2H_Sig=isEn?(!L2H_F2&L2H_F1):1‘b0;
71
72 /*****************************************************/
73
74 endmodule
75
76
77   
  1 /***************************************************
  2 module name: delay_module.v
  3 function: delay 10ms.
  4
  5 by yf.x
  6 2014-11-05
  7
  8 ***************************************************/
  9
 10 module delay_module(
 11 CLK,
 12 RST_n,
 13 H2L_Sig,
 14 L2H_Sig,
 15 Pin_out
 16 );
 17
 18 input CLK;
 19 input RST_n;
 20 input H2L_Sig;
 21 input L2H_Sig;
 22 output Pin_out;
 23
 24 /**************************************************/
 25 //5M*0.001-1=49_999
 26 parameter T1ms=16‘d49_999;
 27
 28 /**************************************************/
 29
 30 reg [15:0]count1;
 31
 32 always @(posedge CLK or negedge RST_n)
 33 if(!RST_n)
 34   count1<=16‘d0;
 35 else if(iscount && count1==T1ms)
 36   count1<=16‘d0;
 37 else if(iscount)
 38   count1<=count1+1‘b1;
 39 else if(!iscount)
 40   count1<=16‘d0;
 41
 42 /****************************************************/
 43
 44 reg [3:0]count_ms;
 45
 46 always @(posedge CLK or negedge RST_n)
 47 if(!RST_n)
 48   count_ms<=4‘d0;
 49 else if(iscount && count1==T1ms)
 50   count_ms<=count_ms+1‘b1;
 51 else if(!iscount)
 52   count_ms<=4‘d0;
 53
 54 /*******************************************************/
 55
 56 reg iscount;
 57 reg rPin_out;
 58 reg [1:0]i;
 59
 60 always @(posedge CLK or negedge RST_n)
 61 if(!RST_n)
 62   begin
 63     iscount<=1‘b0;
 64     rPin_out<=1‘b0;
 65     i<=2‘d0;
 66   end
 67 else
 68   case(i)
 69     2‘d0:
 70     if(H2L_Sig)
 71       i<=2‘d1;
 72     else if(L2H_Sig)
 73        i<=2‘d2;
 74
 75      2‘d1:
 76      if(count_ms==4‘d10)
 77      begin
 78        iscount<=1‘b0;
 79        rPin_out<=1‘b1;
 80        i<=2‘d0;
 81      end
 82      else
 83        iscount<=1‘b1;
 84
 85     2‘d2:
 86      if(count_ms==4‘d10)
 87      begin
 88        iscount<=1‘b0;
 89        rPin_out<=1‘b0;
 90        i<=2‘d0;
 91      end
 92      else
 93        iscount<=1‘b1;
 94     endcase
 95
 96 /**************************************************/
 97
 98 assign Pin_out=rPin_out;
 99
100 /**************************************************/
101
102 endmodule
103
104
105
106     
 1 /****************************************
 2 module name: debounce_module.v
 3 function: debounce a key
 4 pin assignments(for DE2-115):
 5 ---------------------------------
 6 CLK----------------------CLOCK_50
 7 RST_n--------------------KEY[0]
 8 Pin_in-------------------KEY[3]
 9 Pin_out------------------LEDG[3]
10
11 ****************************************/
12
13 module debounce_module(
14 CLK,
15 RST_n,
16 Pin_in,
17 Pin_out
18 );
19
20 input CLK;
21 input RST_n;
22 input Pin_in;
23 output Pin_out;
24
25 /*******************************/
26
27 wire H2L_Sig;
28 wire L2H_Sig;
29
30 detect_module u0(
31 .CLK(CLK),
32 .RST_n(RST_n),
33 .Pin_in(Pin_in),    //input from top
34 .H2L_Sig(H2L_Sig),  //output to u1
35 .L2H_Sig(L2H_Sig)   //output to u1
36 );
37
38 /***************************************/
39
40 delay_module u1(
41 .CLK(CLK),
42 .RST_n(RST_n),
43 .H2L_Sig(H2L_Sig),  //input from u1
44 .L2H_Sig(L2H_Sig),   //input from u1
45 .Pin_out(Pin_out)   //output to top
46 );
47
48 /***************************************/
49
50 endmodule

疑问:

(1)       iscount的作用?

使能2个计数器(count1和count_ms)。

(2)       延迟10ms的目的?

过滤H2L_Sig和L2H_Sig。

detect_module里延迟100us,过滤最初的不稳定状态,至于为何用100us,猜的。

模块框图:

实验三结论:

功能模块对功能模块的组合建模。

时间: 2024-08-24 11:46:03

【黑金教程笔记之004】【建模篇】【Lab 03 消抖模块之一】—笔记的相关文章

【黑金教程笔记之005】【建模篇】【Lab 04 消抖模块之二】—笔记

实验四和实验三的区别在于输出.实验三是检测到由高到低的电平变化时就拉高输出,检测到由低到高的电平变化时就拉低输出.而实验四检测到由高到低的电平变化时产生一个100ms的高脉冲.当检测到由低到高的电平变化时,只有消抖操作. 模块: 1 /*********************************************************** 2 module name: detect_module.v 3 function: detect pin's level change 4 5

【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二:按键模块① - 消抖

实验二:按键模块① - 消抖 按键消抖实验可谓是经典中的经典,按键消抖实验虽曾在<建模篇>出现过,而且还惹来一堆麻烦.事实上,笔者这是在刁难各位同学,好让对方的惯性思维短路一下,但是惨遭口水攻击 ... 面对它,笔者宛如被甩的男人,对它又爱又恨.不管怎么样,如今 I'll be back,笔者再也不会重复一样的悲剧. 按键消抖说傻不傻说难不难.所谓傻,它因为原理不仅简单(就是延迟几下下而已),而且顺序语言(C语言)也有无数不尽的例子.所谓难,那是因为人们很难从单片机的思维跳出来 ... 此外,

【黑金教程笔记之001】veriloghdl 扫盲文—笔记&amp;勘误

001_veriloghdl 扫盲文—笔记&勘误 2014/10/31 原文作者:akuei2 联系方式:blog.ednchina.con/akuei2 勘误001: Page 3 0.1 各种HDL语言 下面的几段里的VDL应为VHDL. 勘误002: Page 3 0.2 HDL语言的层次 上面的一行 笔记 应为 笔者. 勘误003: Page 5 0.4 Verilog hdl语言真的有那么难掌握? 上面一段倒数第三行括号里的文字 很习 应为 很习惯. 勘误004: Page 5 代码m

Verilog HDL那些事_建模篇笔记(实验一,实验二)

实验一:永远的流水灯 扫描频率配置为100Hz,即是说扫描周期为10ms.这里需要注意的是扫描周期的概念.流水灯嘛,顾名思义,扫描周期指的是流水灯扫一轮所需要的时间.听到说周期,就应该想到在建模的时候需要写计数器模块,这个计数器模块应该是神一般的独立存在,独立运行.每隔10ms复位一次,复位后又重新开始计数. 实验二:闪耀灯和流水灯 闪耀灯涉及到闪耀频率,流水灯涉及到扫描频率的概率.这里先区分一下闪耀频率和扫描频率的概念.闪耀频率对应闪耀周期,闪耀周期是针对于单个LED灯而言的,即是指LED灯亮

SaltStack 学习笔记 - 第十二篇: SaltStack Web 界面

SaltStack 有自身的用python开发的web界面halite,好处是基于python,可以跟salt的api无缝配合,确定就比较明显,需要个性化对web界面进行定制的会比较麻烦,如果喜欢体验该界面的可以参考下面的文章  http://rfyiamcool.blog.51cto.com/1030776/1275443/ 我是运用另一个python+php来进行web开发,具体需要的工具有在我的另一篇文章里面介绍过,这里再重新进行整个开发介绍 首先介绍php 跟python通信的工具 pp

树莓派玩耍笔记3 -- LCD1602显示篇

LCD1602是一块成本低廉的输出设备,它有着体积小.操作简单.功耗低等优点,所以在一些DIY 产品上会用它来输出一些信息.昨天在使用时,虽然借鉴网上的资源,但是仍然有遇到一些问题,在这里写出来以便大家遇到时能够正确处理. 一.LCD1602 相关[1] 工业字符型液晶,能够同时显示16x02即32个字符.(16列2行) 1.1 管脚 1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线. 引脚 符号 功能说明 1 VSS 一般接地 2 VDD 接电源(+5V

现代C++学习笔记之二入门篇2,数据转换

static_cast:    这种强制转换只会在编译时检查. 如果编译器检测到您尝试强制转换完全不兼容的类型,则static_cast会返回错误. 您还可以使用它在基类指针和派生类指针之间强制转换,但是,编译器在无法分辨此类转换在运行时是否是安全的. dynamic_cast: dynamic_cast在运行时检查基类指针和派生类指针之间的强制转换. dynamic_cast 是比 static_cast 更安全的强制类型转换,但运行时检查会带来一些开销. const_cast:    con

【LaTeX】E喵的LaTeX新手入门教程(1)准备篇

昨天熄灯了真是坑爹.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新手入门教程(2)基础排版上一期测试答案1.大家一开始想到的肯定是\LaTeX{}er.其实\LaTeX er也可以的.2.\LaTeX{} er或\LaTeX\ er数学模式现在我们打算在文档中插入一些数学公式什么的了:按照正常的情况来说,数学公式里面的字符一般都是斜体,而我们要用\textit来一点点把需要变的文字变成斜体这显然是一件极其坑爹的事情.TeX的创造者高爷爷表示他搞T

[Aaronyang] 写给自己的WPF4.5 笔记11[自定义控件-AyImageButton篇 1/4]

我的文章一定要对读者负责-否则不是好文章  ----       www.ayjs.net  aaronyang技术分享 文章导航: 介绍vs2013 WPF开发,属性代码相关技巧 实战AyImageButton 1.0细用慢讲,学会用户控件,依赖属性,属性回调事件 诞生AyImageButton 1.1 支持 控件简单写法,支持自定义AyImageButton写法,提供详细的API 效果图: AyImageButton记录 源码下载:http://pan.baidu.com/s/1eQlHly