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

实验四和实验三的区别在于输出。实验三是检测到由高到低的电平变化时就拉高输出,检测到由低到高的电平变化时就拉低输出。而实验四检测到由高到低的电平变化时产生一个100ms的高脉冲。当检测到由低到高的电平变化时,只有消抖操作。

模块:

 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 [6:0]count_ms;
 45
 46 always @(posedge CLK or negedge RST_n)
 47 if(!RST_n)
 48   count_ms<=7‘d0;
 49 else if(iscount && count1==T1ms)
 50   count_ms<=count_ms+1‘b1;
 51 else if(!iscount)
 52   count_ms<=7‘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‘d3;
 74
 75      2‘d1:
 76      if(count_ms==7‘d10)
 77      begin
 78        iscount<=1‘b0;
 79        rPin_out<=1‘b1;
 80        i<=2‘d2;
 81      end
 82      else
 83        iscount<=1‘b1;
 84
 85      2‘d2:
 86      if(count_ms==7‘d100)
 87      begin
 88        iscount<=1‘b0;
 89        rPin_out<=1‘b0;
 90        i<=2‘d0;
 91      end
 92      else
 93        iscount<=1‘b1;
 94
 95     2‘d3:
 96      if(count_ms==7‘d10)
 97      begin
 98        iscount<=1‘b0;
 99        i<=2‘d0;
100      end
101      else
102        iscount<=1‘b1;
103     endcase
104
105 /**************************************************/
106
107 assign Pin_out=rPin_out;
108
109 /**************************************************/
110
111 endmodule
112
113
114
115     
 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 by yf.x
12 2014-11-05
13
14 ****************************************/
15
16 module debounce_module(
17 CLK,
18 RST_n,
19 Pin_in,
20 Pin_out
21 );
22
23 input CLK;
24 input RST_n;
25 input Pin_in;
26 output Pin_out;
27
28 /*******************************/
29
30 wire H2L_Sig;
31 wire L2H_Sig;
32
33 detect_module u0(
34 .CLK(CLK),
35 .RST_n(RST_n),
36 .Pin_in(Pin_in),    //input from top
37 .H2L_Sig(H2L_Sig),  //output to u1
38 .L2H_Sig(L2H_Sig)   //output to u1
39 );
40
41 /***************************************/
42
43 delay_module u1(
44 .CLK(CLK),
45 .RST_n(RST_n),
46 .H2L_Sig(H2L_Sig),  //input from u1
47 .L2H_Sig(L2H_Sig),   //input from u1
48 .Pin_out(Pin_out)   //output to top
49 );
50
51 /***************************************/
52
53 endmodule

实验四说明:

实验四和实验三代码部分的区别在delay_module.v的case部分。

时间: 2024-10-14 12:43:25

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

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

设计思路: (1)       一旦检测到按键资源按下(从高电平到低电平),“电平检测模块”就会拉高H2L_Sig电平,然后拉低. (2)       “10ms延迟模块”检测到H2L_Sig高电平,就会利用10ms过滤H2L_Sig,拉高输出. (3)       当按键被释放,“电平检测模块”会拉高L2H_Sig电平,然后拉低. (4)       “10ms延迟模块”检测到L2H_Sig就会利用10ms过滤L2H_Sig然后拉低输出. 模块: 1 /********************

【黑金原创教程】【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灯亮

【史上最强JavaSE笔记】之数组篇

各位程序猿,各位攻城狮,各位蜥蜴鸥以及各位棕鲸鲤们~~大家好,我是潘师傅,欢迎大家收看由我为你们带来的[史上最强JavaSE笔记]系列,其实也可以叫[嘻哈JavaSE笔记]的,第一次在博客园发帖,想想还真是有点小激动呢,各位求支持呀,哈哈,那么回归正题,我把自己之前学习积累的笔记拿出来跟大家分享一下,方便大家更好的理解和复习,希望能够对大家有所帮助哈,这次发的是JavaSE方面数组篇的,内容不一定全面哦,欢迎大家前来留言交流哈,不足的地方还望大家多多指出和指导哈~(由于首次发文章,布局可能比较乱

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

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

第十七篇:实例分析(3)--初探WDDM驱动学习笔记(十)

续: 还是记录一下, BltFuncs.cpp中的函数作用: CONVERT_32BPP_TO_16BPP 是将32bit的pixel转换成16bit的形式. 输入是DWORD 32位中, BYTE 0,1,2分别是RGB分量, 而BYTE3则是不用的 为了不减少color的范围, 所以,都是取RGB8,8,8的高RGB5, 6, 5位, 然后将这16位构成一个pixel. CONVERT_16BPP_TO_32BPP是将16bit的pixel转换成32bit的形式 输入是WORD 16BIT中

第十七篇:实例分析(4)--初探WDDM驱动学习笔记(十一)

感觉有必要把 KMDDOD_INITIALIZATION_DATA 中的这些函数指针的意思解释一下, 以便进一步的深入代码. DxgkDdiAddDevice 前面已经说过, 这个函数的主要内容是,将BASIC_DISPLAY_DRIVER实例指针存在context中, 以便后期使用, 支持多实例. DxgkDdiStartDevice 取得设备信息, 往注册表中加入内容, 从POST设备中获取FRAME BUFFER以及相关信息(DxgkCbAcquirePostDisplayOwnershi

【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