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

设计思路:
(1) 一旦检测到按键资源按下(从高电平到低电平),“电平检测模块”就会拉高H2L_Sig电平,然后拉低。
(2) “10ms延迟模块”检测到H2L_Sig高电平,就会利用10ms过滤H2L_Sig,拉高输出。
(3) 当按键被释放,“电平检测模块”会拉高L2H_Sig电平,然后拉低。
(4) “10ms延迟模块”检测到L2H_Sig就会利用10ms过滤L2H_Sig然后拉低输出。
模块:
/***********************************************************
module name: detect_module.v
function: detect pin's level change by yf.x
2014-11-05 ************************************************************/ module detect_module(
CLK,
RST_n,
Pin_in,
H2L_Sig,
L2H_Sig
); input CLK;
input RST_n;
input Pin_in;
output H2L_Sig;
output L2H_Sig; /**************************************************************/
//DE2-115 use 50MHz oscillator,50M*0.0001-1=4_999
parameter T100us='d4999; /**************************************************************/ reg [:]count1;
reg isEn; always @(posedge CLK or negedge RST_n) //100us timer
if(!RST_n)
begin
count1<='d0;
isEn<='b0;
end
else if(count1==T100us)
isEn<='b1;
else
count1<=count1+'b1; /***********************************************************/ reg H2L_F1;
reg H2L_F2;
reg L2H_F1;
reg L2H_F2; always @(posedge CLK or negedge RST_n)
if(!RST_n)
begin
H2L_F1<='b1;
H2L_F2<='b1;
L2H_F1<='b0;
L2H_F2<='b0;
end
else
begin
H2L_F1<=Pin_in;
H2L_F2<=H2L_F1;
L2H_F1<=Pin_in;
L2H_F2<=L2H_F1;
end /*****************************************************/ assign H2L_Sig=isEn?(!H2L_F1&H2L_F2):'b0;
assign L2H_Sig=isEn?(!L2H_F2&L2H_F1):'b0; /*****************************************************/ endmodule
/***************************************************
module name: delay_module.v
function: delay 10ms. by yf.x
2014-11-05 ***************************************************/ module delay_module(
CLK,
RST_n,
H2L_Sig,
L2H_Sig,
Pin_out
); input CLK;
input RST_n;
input H2L_Sig;
input L2H_Sig;
output Pin_out; /**************************************************/
//5M*0.001-1=49_999
parameter T1ms='d49_999; /**************************************************/ reg [:]count1; always @(posedge CLK or negedge RST_n)
if(!RST_n)
count1<='d0;
else if(iscount && count1==T1ms)
count1<='d0;
else if(iscount)
count1<=count1+'b1;
else if(!iscount)
count1<='d0; /****************************************************/ reg [:]count_ms; always @(posedge CLK or negedge RST_n)
if(!RST_n)
count_ms<='d0;
else if(iscount && count1==T1ms)
count_ms<=count_ms+'b1;
else if(!iscount)
count_ms<='d0; /*******************************************************/ reg iscount;
reg rPin_out;
reg [:]i; always @(posedge CLK or negedge RST_n)
if(!RST_n)
begin
iscount<='b0;
rPin_out<='b0;
i<='d0;
end
else
case(i)
'd0:
if(H2L_Sig)
i<='d1;
else if(L2H_Sig)
i<='d2; 'd1:
if(count_ms=='d10)
begin
iscount<='b0;
rPin_out<='b1;
i<='d0;
end
else
iscount<='b1; 'd2:
if(count_ms=='d10)
begin
iscount<='b0;
rPin_out<='b0;
i<='d0;
end
else
iscount<='b1;
endcase /**************************************************/ assign Pin_out=rPin_out; /**************************************************/ endmodule
/****************************************
module name: debounce_module.v
function: debounce a key
pin assignments(for DE2-115):
---------------------------------
CLK----------------------CLOCK_50
RST_n--------------------KEY[0]
Pin_in-------------------KEY[3]
Pin_out------------------LEDG[3] ****************************************/ module debounce_module(
CLK,
RST_n,
Pin_in,
Pin_out
); input CLK;
input RST_n;
input Pin_in;
output Pin_out; /*******************************/ wire H2L_Sig;
wire L2H_Sig; detect_module u0(
.CLK(CLK),
.RST_n(RST_n),
.Pin_in(Pin_in), //input from top
.H2L_Sig(H2L_Sig), //output to u1
.L2H_Sig(L2H_Sig) //output to u1
); /***************************************/ delay_module u1(
.CLK(CLK),
.RST_n(RST_n),
.H2L_Sig(H2L_Sig), //input from u1
.L2H_Sig(L2H_Sig), //input from u1
.Pin_out(Pin_out) //output to top
); /***************************************/ endmodule
疑问:
(1) iscount的作用?
使能2个计数器(count1和count_ms)。
(2) 延迟10ms的目的?
过滤H2L_Sig和L2H_Sig。
detect_module里延迟100us,过滤最初的不稳定状态,至于为何用100us,猜的。
模块框图:

实验三结论:
功能模块对功能模块的组合建模。
【黑金教程笔记之004】【建模篇】【Lab 03 消抖模块之一】—笔记的更多相关文章
- 【黑金教程笔记之005】【建模篇】【Lab 04 消抖模块之二】—笔记
实验四和实验三的区别在于输出.实验三是检测到由高到低的电平变化时就拉高输出,检测到由低到高的电平变化时就拉低输出.而实验四检测到由高到低的电平变化时产生一个100ms的高脉冲.当检测到由低到高的电平变 ...
- FPGA学习笔记(八)—— 状态机设计实例之独立按键消抖
###### [该随笔中部分内容转载自小梅哥] ######### 独立按键消抖自古以来在单片机和FPGA中都是个不可避免的问题,首先,解释一下什么叫做按键抖动,如图,按键在按下和松开的那个瞬间存在大 ...
- 【黑金教程笔记之001】veriloghdl 扫盲文—笔记&勘误
001_veriloghdl 扫盲文—笔记&勘误 2014/10/31 原文作者:akuei2 联系方式:blog.ednchina.con/akuei2 勘误001: Page 3 0.1 ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二:按键模块① - 消抖
实验二:按键模块① - 消抖 按键消抖实验可谓是经典中的经典,按键消抖实验虽曾在<建模篇>出现过,而且还惹来一堆麻烦.事实上,笔者这是在刁难各位同学,好让对方的惯性思维短路一下,但是惨遭口 ...
- Verilog HDL那些事_建模篇笔记(实验一,实验二)
实验一:永远的流水灯 扫描频率配置为100Hz,即是说扫描周期为10ms.这里需要注意的是扫描周期的概念.流水灯嘛,顾名思义,扫描周期指的是流水灯扫一轮所需要的时间.听到说周期,就应该想到在建模的时候 ...
- [自娱自乐] 4、超声波测距模块DIY笔记(四)——终结篇·基于C#上位机软件开发
前言 上一节我们已经基本上把超声波硬件的发射和接收模块全部做好了,接下来我们着手开发一个软硬结合的基于C#的平面定位软件! 目录 一.整体思路 二.效果提前展示 2-1.软件部分展示 2-2.硬件部分 ...
- 《Kafka权威指南》读书笔记-操作系统调优篇
<Kafka权威指南>读书笔记-操作系统调优篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 大部分Linux发行版默认的内核调优参数配置已经能够满足大多数应用程序的运 ...
- 【LaTeX】E喵的LaTeX新手入门教程(1)准备篇
昨天熄灯了真是坑爹.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新手入门教程(2)基础排版上一期测试答案1.大家一开始想到的肯定是\LaTeX{}er ...
- Pycharm新手教程,只需要看这篇就够了
pycharm是一款高效的python IDE工具,它非常强大,且可以跨平台,是新手首选工具!下面我给第一次使用这款软件的朋友做一个简单的使用教程,希望能给你带来帮助! 目前pycharm一共有两个版 ...
随机推荐
- [NOIP2002] 提高组 洛谷P1033 自由落体
题目描述 在高为 H 的天花板上有 n 个小球,体积不计,位置分别为 0,1,2,….n-1.在地面上有一个小车(长为 L,高为 K,距原点距离为 S1).已知小球下落距离计算公式为 d=1/2*g* ...
- ThinkPHP5 的入门学习
与Tp3.2相比,有一下的不同: (1)目录名称的改变: tp3.2的目录命名首字母皆为大写,例如:Application.Public.Controller.Model.View.ThinkPHP. ...
- iOS - 系统方法中弃用的关键字的了解 NS_AVAILABLE和NS_DEPRECATED
NS_AVAILABLE_IOS(5_0) 这个方法可以在iOS5.0及以后的版本中使用,如果在比5.0更老的版本中调用这个方法,就会引起崩溃. NS_AVAILABLE(_mac, _ios) ...
- loj516 DP一般看规律(set启发式合并)
题目: https://loj.ac/problem/516 分析: 每次将一个颜色更改为另一个颜色相当于将两个集合合并 然后对于答案的更新,一个点插入到一个集合中,那么可能更新答案的就是其前驱节点或 ...
- CEF3研究(三)
一.Off-Screen Rendering 脱屏绘制 CEF的脱屏渲染并不创建源生的浏览器窗口,而是CEF提供主应用程序在无效区域和像素buffer里渲染,然后主应用程序通过鼠标.键盘和焦点事件通知 ...
- 【深入探索c++对象模型】data语义学二
单一继承中,base class 和derived class的对象都是从相同的地址开始,其间差异只在于derived class比较大,用以容纳自己的nonstatic members. 若vptr ...
- markdown 插入latex公式练习
markdown 插入latex公式 $$公式$$表示行间公式,本来Tex中使用\(公式\)表示行内公式,但因为Markdown中\是转义字符,所以在Markdown中输入行内公式使用\\(公式\\) ...
- E. Dreamoon and Strings(Codeforces Round #272)
E. Dreamoon and Strings time limit per test 1 second memory limit per test 256 megabytes input stand ...
- 【转】TestNG中的并发(多线程)
优势 并行(多线程)技术在软件术语里被定义为软件.操作系统或者程序可以并行地执行另外一段程序中多个部分或者子组件的能力 多线程方式拥有很大的优势: 1). 减少测试运行时间 如果测试集里包含了大量的用 ...
- AIX下RAC搭建 Oracle10G(五)安装oracle、建立监听
AIX下RAC搭建系列 AIX下RAC搭建 Oracle10G(五)安装oracle.建立监听 环境 节点 节点1 节点2 小机型号 IBM P-series 630 IBM P-series 630 ...