原理

显示时分秒(日期也可以加上),两个按键调节时间

原理图

代码

 /*--------------------------------------------------------------------------------------
-- Filename ﹕ debounce_module.v
-- Author ﹕tony-ning
-- Description ﹕按键消抖
-- Called by ﹕Top module
-- Revision History ﹕15-10-16
-- Revision 1.0
-- Company ﹕
-- Copyright(c) All right reserved
---------------------------------------------------------------------------------------*/ module debounce_module
(
CLK, //采集时钟,40Hz
RSTn, //系统复位信号
BUTTON_IN, //按键输入信号
BUTTON_OUT //消抖后的输出信号
);
input CLK;
input RSTn;
input BUTTON_IN;
output BUTTON_OUT; reg key_reg1,key_reg2,key_out;
reg [:]count2; always @( posedge CLK)//CLK 50M
begin
count2<=count2+;
if(count2==)
begin
key_reg1<=BUTTON_IN;
count2<=;
end
key_reg2<=key_reg1;
key_out<=key_reg2&(!key_reg1);
end assign BUTTON_OUT = key_out; endmodule /* reg [23:0]cnt;//分频计数器
reg CLK40HZ;//分频时钟
reg BUTTON_IN_Q, BUTTON_IN_2Q, BUTTON_IN_3Q; always@(posedge CLK ) //时钟分频
begin
if(!RSTn)
cnt<=0;
else if(cnt==24'd312_499) //产生40Hz时钟脉冲
begin
cnt<=0;
CLK40HZ<=~CLK40HZ;//40hz时钟输出
end
else begin
cnt<=cnt+1;
end
end always @(posedge CLK40HZ or negedge RSTn)
begin
if(~RSTn)
begin
BUTTON_IN_Q <= 1'b1;
BUTTON_IN_2Q <= 1'b1;
BUTTON_IN_3Q <= 1'b1;
end
else
begin
BUTTON_IN_Q <= BUTTON_IN;
BUTTON_IN_2Q <= BUTTON_IN_Q;
BUTTON_IN_3Q <= BUTTON_IN_2Q;
end
end wire BUTTON_OUT = BUTTON_IN_2Q | BUTTON_IN_3Q;
endmodule */ /*
module debounce_module
(
CLK, RSTn, KEY_set,KEY_add,Pin_set, Pin_add
); input CLK;
input RSTn;
input KEY_set;
input KEY_add;
output Pin_set;
output Pin_add; reg p=1'b0;//按键状态
reg [23:0]cntt;
reg k1f1,k1f2;//KEY_set上升沿检测
reg k2f1,k2f2;//KEY_add上升沿检测 parameter s_wait=1'b0;//等待按键状态
parameter s_delay=1'b1;//按下延时状态 assign Pin_set=k1f2&!k1f1;//读取按键下降沿
assign Pin_add=k2f2&!k2f1; always @ ( posedge CLK or negedge RSTn )//按键消抖状态机
if( !RSTn )
begin
cntt <= 24'd0;
p <= s_wait;
end
else case(p)
s_wait: begin
k1f1<=KEY_set;//记录按键值
k1f2<=k1f1; k2f1<=KEY_add;
k2f2<=k2f1; if(Pin_set| Pin_add)//当按下,切换到延时并按键只输出一个时钟脉冲
begin
p<=s_delay;
k1f1<=0;
k1f2<=0; k2f1<=0;
k2f2<=0;
end
end
s_delay:if(cntt==24'd249_999) //延时T=10ms
begin
cntt<=0;
p<=s_wait;
end
else begin
cntt<=cntt+1;
end endcase endmodule */

按键消抖

 /*--------------------------------------------------------------------------------------
-- Filename ﹕ timer.v
-- Author ﹕tony-ning
-- Description ﹕timer-based STEP PGGA board
-- Called by ﹕--
-- Revision History ﹕15-10-26
-- Revision 1.0
--
---------------------------------------------------------------------------------------*/
module timer
(
CLK,RSTn,keyset,keyadd,hour1,hour2,min1,min2,sec1,sec2,kstate,CLK2HZ
); input CLK;
input RSTn;
input keyset;
input keyadd;
output reg[:]hour1;
output reg[:]hour2;
output reg[:]min1;
output reg[:]min2;
output reg[:]sec1;
output reg[:]sec2;
output [:]kstate;
output reg CLK2HZ;
/*-------------------------------define --------------------------------------*/
parameter idle='d0;//状态值定义
parameter s_hour='d1;
parameter s_minute='d2;
parameter s_second='d3; reg [:]cnt;//分频计数器
reg CLK1HZ;//分频时钟
reg s_hour_cnt;//小时计数进位状态 reg[:] p; //状态机定义
//reg[2:0] p_back; //状态返回 assign kstate=p; always@(posedge CLK ) //时钟分频
begin
if(!RSTn)
cnt<=;
else if(cnt=='d24_999_999) //产生1Hz时钟脉冲
begin
cnt<=;
CLK1HZ<=;
CLK2HZ<=~CLK2HZ;//2hz时钟输出
//min1<=0;
end
else begin
cnt<=cnt+;
CLK1HZ<=;
//min1<=min1+1;
end
end always@(posedge CLK )//状态机切换
begin
if(!RSTn)
p<=idle;
else
case (p)
idle: begin
if (keyset)
p<=s_hour; //next设置小时
else p<=idle;
/***************************************/
case(s_hour_cnt)//小时计数
: begin
if(hour1==)//10进位情况
begin
s_hour_cnt<=;
end
if(hour2 ==)
begin
hour2<=;
hour1<=hour1+;
end
//else hour2<=hour2+1;
end
: if(hour2==)
begin
s_hour_cnt<=;//4进位情况
hour1<=;
hour2<=;
end
endcase
/***************************************/
if(min1==) //分钟计数
begin
min1<=;
hour2<=hour2+;
end
else if(min2==)
begin
min1<=min1+;
min2<=;
end /***************************************/
if(sec1==) //秒计数
begin
sec1<=;
min2<=min2+;
end
else if(sec2==)
begin
sec1<=sec1+;
sec2<=;
end
else if(CLK1HZ)//每秒加一
sec2<=sec2+;
end
s_hour:
begin
if (keyset)
p<=s_minute; //next设置分钟
else p<=s_hour;
/***************************************/
if(keyadd) //小时数值按键设定
begin
case(s_hour_cnt)//小时计数
: begin
if(hour1==)//10进位情况
begin
s_hour_cnt<=;
end
if(hour2 ==)
begin
hour2<=;
hour1<=hour1+;
end
else hour2<=hour2+;
end
: if(hour2==)
begin
s_hour_cnt<=;//4进位情况
hour1<=;
hour2<=;
end
else hour2<=hour2+;
endcase
end
end
s_minute:
begin
if (keyset)
p<=s_second; //next设置秒
else p<=s_minute; if(keyadd) //分钟数值按键设定
begin
if(min1== && min2==) //分钟计数
begin
min1<=;
min2<=;
hour2<=hour2+;
end
else if(min2==)
begin
min1<=min1+;
min2<=;
end
else min2<=min2+;
end
end
s_second:begin
if (keyset)
p<=idle; //next返回正常显示
else p<=s_second; if(keyadd) //秒数值按键设定
begin
if(sec1== && sec2==) //秒计数
begin
sec1<=;
min2<=min2+;
end
else if(sec2==)
begin
sec1<=sec1+;
sec2<=;
end
else sec2<=sec2+;
end
end endcase
end endmodule

时间产生

 /*--------------------------------------------------------------------------------------
-- Filename show_ctrl.v
-- Author ﹕tony-ning
-- Description ﹕数码管显示字符
-- Called by ﹕Top module
-- Revision History 5-10-16
-- Revision 1.0
-- Company
-- Copyright(c) All right reserved
---------------------------------------------------------------------------------------*/
module show_ctrl
(
CLK,RSTn,hour1,hour2,min1,min2,sec1,sec2,kstate,CLK2HZ,lamp4,lamp3,lamp2,lamp1,dualpoint
); input CLK,RSTn;
input [:]hour1;
input [:]hour2;
input [:]min1;
input [:]min2;
input [:]sec1;
input [:]sec2;
input [:]kstate;
input CLK2HZ;
output reg[:]lamp4;
output reg[:]lamp3;
output reg[:]lamp2;
output reg[:]lamp1; output reg dualpoint; /////////////////////////////////////////////////
parameter idle='d0;
parameter s_hour='d1;
parameter s_minute='d2;
parameter s_second='d3; parameter light='b0;
parameter dark='b1; reg [:]number[:]; ///////////////////////////////////////////////
initial
begin
number[] ='b0000001; //abcdefg 0
number[] ='b1001111; //abcdefg 1
number[] ='b0010010; //abcdefg 2
number[] ='b0000110; //abcdefg 3
number[] ='b1001100; //abcdefg 4
number[] ='b0100100; //abcdefg 5
number[] ='b0100000; //abcdefg 6
number[] ='b0001111; //abcdefg 7
number[] ='b0000000; //abcdefg 8
number[] ='b0000100; //abcdefg 9
number[]='b1111111; //abcdefg null
end always@(*)
begin
case(kstate)
idle: begin
lamp4<=number[hour1];
lamp3<=number[hour2];
if(CLK2HZ) dualpoint<=light;
else dualpoint<=dark;
lamp2<=number[min1];
lamp1<=number[min2];
end
s_hour: begin if(CLK2HZ)
begin
lamp4<=number[hour1];
lamp3<=number[hour2];
end
else
begin
lamp4<=number[];
lamp3<=number[];
end
dualpoint<=light;
lamp2<=number[min1];
lamp1<=number[min2];
end
s_minute: begin
lamp4<=number[hour1];
lamp3<=number[hour2];
dualpoint<=light; if(CLK2HZ)
begin
lamp2<=number[min1];
lamp1<=number[min2];
end
else
begin
lamp2<=number[];
lamp1<=number[];
end
end
s_second: begin
lamp4<=number[];
lamp3<=number[];
dualpoint<=light; if(CLK2HZ)
begin
lamp2<=number[sec1];
lamp1<=number[sec2];
end
else
begin
lamp2<=number[];
lamp1<=number[];
end end
endcase
end endmodule

显示控制

 /*--------------------------------------------------------------------------------------
-- Filename ﹕ top.v
-- Author ﹕tony-ning
-- Description ﹕top
-- Called by ﹕
-- Revision History ﹕15-10-16
-- Revision 1.0
-- Company ﹕
-- Copyright(c) All right reserved
---------------------------------------------------------------------------------------*/
module top
(
CLK,RSTn,KEY_set,KEY_add,lamp4,lamp3,lamp2,lamp1,dualpoint
); input CLK;
input RSTn;
input KEY_set;
input KEY_add;
output [:]lamp4;//数码管
output [:]lamp3;
output [:]lamp2;
output [:]lamp1;
output dualpoint; wire [:]hour1;
wire [:]hour2;
wire [:]min1;
wire [:]min2;
wire [:]sec1;
wire [:]sec2;
wire [:]kstate;
wire CLK2HZ;
wire Pin_set;
wire Pin_add; debounce_module KEYset_debounce
(
.CLK(CLK),
.RSTn(RSTn),
.BUTTON_IN(KEY_set),
.BUTTON_OUT(Pin_set)
); debounce_module KEYadd_debounce
(
.CLK(CLK),
.RSTn(RSTn),
.BUTTON_IN(KEY_add),
.BUTTON_OUT(Pin_add)
); timer time_generater
(
.CLK(CLK),
.RSTn(RSTn),
.keyset(Pin_set),
.keyadd(Pin_add),
.hour1(hour1),
.hour2(hour2),
.min1(min1),
.min2(min2),
.sec1(sec1),
.sec2(sec2),
.kstate(kstate),
.CLK2HZ(CLK2HZ)
); show_ctrl show_module
(
.CLK(CLK),
.RSTn(RSTn),
.hour1(hour1),
.hour2(hour2),
.min1(min1),
.min2(min2),
.sec1(sec1),
.sec2(sec2),
.kstate(kstate),
.CLK2HZ(CLK2HZ),
.lamp4(lamp4),
.lamp3(lamp3),
.lamp2(lamp2),
.lamp1(lamp1),
.dualpoint(dualpoint)
); endmodule

顶层调用

PCB

实物图

STEP模块——电子钟的更多相关文章

  1. STEP模块——电子琴

    电子琴原理 什么是声音?上过初中的朋友都知道声音是由震动所产生的.一定频率的震动就产生了一定频率的声音. 理论研究第一步,让喇叭发出do re mi fa sol la si的音,我们先不管do的频率 ...

  2. Simulink仿真入门到精通(二) Simulink模块

    2.1 Simulink模块的组成要素 用户构建系统模型时无需直接面对成千上万行的代码,而是通过模块化图形界面以模块化的方式构建,能够使理解变得容易,让大脑减负.通过层次化模块分布将系统功能模块化,而 ...

  3. ABAQUS/CAE——Context

    Part(部分) 用户在Part单元内生成单个部件,可以直接在ABAQUS/CAE环境下用图形工具生成部件的几何形状,也可以从其他的图形软件输入部件.详细可参考ABAQUS/CAE用户手册第15章. ...

  4. Step By Step(Lua模块与包)

    Step By Step(Lua模块与包) 从Lua 5.1开始,我们可以使用require和module函数来获取和创建Lua中的模块.从使用者的角度来看,一个模块就是一个程序库,可以通过requi ...

  5. step by step 之餐饮管理系统六(数据库访问模块)

    距上次写的博客已经好几个月,一方面公司里面有很多的东西要学,平时的时候又要写代码,所以没有及时更新,不过现在还好,已经成型了,现在把之前的东西贴出来,先看一下现在做的几个界面吧.第一个界面是用颜色用区 ...

  6. step by step 之餐饮管理系统五(Util模块)------附上篇日志模块源码

    这段时间一直在修改日志模块,现在基本上写好了,也把注释什么的都加上了,昨天邮件发送给mark的园友一直报失败,老是退回来,真是报歉,如下图所示:

  7. step by step 之餐饮管理系统四(日志模块实现)

    三天前基本上把数据库表设计的文档写好,今天想到了一个问题,还要再加几个表,一个是log表,用来记录系统日志,另外再加几个字典表,一些需要配置的数据但又不好放在像xml文件里面的数据可以放在这些字典表里 ...

  8. Nginx 模块开发(1)—— 一个稍稍能说明问题模块开发 Step By Step 过程

    1. Nginx 介绍        Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/S ...

  9. step by step 之餐饮管理系统七(点菜模块实现)

    好长时间没有更新这个系列了,一是因为这段时间比较忙,有很多事情,二来要学习新的东西,AngularJs,devExpress这两上框架,都是比较有名的框架,先上图: 上面就是用来点菜的界面,左边是已点 ...

随机推荐

  1. 通过Ztree生成页面html元素Dom树,以及拖拽改变元素的位置

    zTree 是一款依靠 jQuery 实现的多功能 "树插件",http://www.treejs.cn/v3/main.php#_zTreeInfo,功能强大,不多赘述. 下面我 ...

  2. OpenCV2+入门系列(一):OpenCV2.4.9的安装与测试

    这里假设看到这篇文章的人都已经对OpenCV以及机器视觉等最基础的概念有了一定的认识,因此本文不会对OpenCV做任何的介绍,而是直接介绍OpenCV2.4.9的安装与测试.此外本文只是简单的介绍如何 ...

  3. Eclipse 快捷键 (应用中自己总结)

    调试快捷键: 1: resume(F8) 调试中用来直接跳到下一个断点 2:  用来结束JVM 3:step into (F5)跳入函数 4: step over (F6)单步执行 5:step re ...

  4. 单据UI代码开发

    1.构造UI项目后,打开生成的UI项目代码,在Model文件下,如初始化一些字段的值 2.订单明细行中行号设置.订单基本操作按钮提示UFIDA.U9.Base.BaseBP.Agent.dll(代理) ...

  5. LTE 测试文档(翻译)

    Testing Documentation 翻译 (如有不当的地方,欢迎指正!)     1 概述   为了测试和验证 ns-3 LTE 模块,文档提供了几个 test suites (集成在 ns- ...

  6. sql server 查询表结构

    --查询表结构start SELECT 序号 = a.colorder,字段名称 = a.name,字段描述 = f.value, 标识 then '√' else '' end, 主键 FROM s ...

  7. MarkDown常用语法记录

    目录 1. 斜体和粗体 2. 分级标题 3. 超链接 3.1 行内式(推荐) 3.2 行外式 3.3 自动链接 4. 锚点 5. 列表 5.1无序列表 5.2有序列表 6. 引用 7. 插入图像 8. ...

  8. mybatis mysql 调用视图

    java代码 @RequestMapping(value = "/testView", method = RequestMethod.GET) public @ResponseBo ...

  9. MVC使用Membership配置

    MVC的权限管理,环境是MVC4.5,SQL Server2008 修改前 Web.config文件: <system.web> <authentication mode=" ...

  10. 三代PacBio reads纠错 - 专题

    三代纠错的重要性不言而喻,三代的核心优势就是长,唯一的缺点就是错误率高,但好就好在错误是随机分布的,可以通过算法解决,这也就是为什么现在有这么多针对三代开发的纠错工具. 纠错和组装是分不开的,纠错就是 ...