原理

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

原理图

代码

 /*--------------------------------------------------------------------------------------
-- 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. 使用MegaCli工具查看Raid磁盘阵列状态

    转载自:http://home.51.com/chenjianghui1987/diary/item/10051836.html 文章本身我不做过多修改了,在这里我就把自己在安装时候碰到的难点跟大家提 ...

  2. How to fix the conflict between ROS Python and Conda

    Problem: Ever since I have installed Conda, ROS does not seem to work. And predictably it is because ...

  3. SVN分支和映射总结和数据库初步使用

    SVN使用总结 常用的诸如检出,update,add就不说了. 1.创建分支-----新建分支目录,在分支文件夹下导入项目folder文件夹.分支不会影响主干trunk的代码,可以随意修改. 2.sv ...

  4. JVM 内存管理机制

    1. 内存分配图:  两栈一区一堆一计数 方法区里面 包含了运行时常量 2. 对象创建过程: new A() 首先加载A的字节码. 分配内存,内存分配方式分两种,如果采用带压缩的垃圾回收策略,则采用“ ...

  5. EJB的调用

    EJB调用.html :first-child{margin-top:0!important}img.plugin{box-shadow:0 1px 3px rgba(0,0,0,.1);border ...

  6. JSON生成c#类代码小工具

    JSON生成c#类代码小工具 为什么写这么个玩意 最近的项目中需要和一个服务端程序通讯,而通讯的协议是基于流行的json,由于是.net,所以很简单的从公司代码库里找到了Newtonsoft.dll( ...

  7. 双主MySQL+keepalived高可用配置

    部署双节点双主数据库服务器mysql 分别在二台服务器上安装mysql,要求同版本或主服务器比从服务器版本高. 主机mysql配置: Vi /etc/my.cnf [mysqld] Log-bin=m ...

  8. this

    JavaScript 中的 this ! 2016-12-28 vvv阿城 JavaScript 转自  https://qiutc.me/post/this-this-this-in-javascr ...

  9. CentOS 程序开机自启动方法总结

    1.把启动程序的命令添加到/etc/rc.d/rc.local文件中 CentOS系统下管理开机自启动的配置文件是/etc/rc.d/rc.local,所以只需编辑这个文件,在里面加入相应的启动命令即 ...

  10. asp.net用户自定义控件传参

    asp.net自定义控件传参的方式有2中: ①字段的方式 在自定义控件的.ascx.cs中定义一个字段,然后在调用页面的page_load方法里面传入参数. 如  在自定义控件中设置字段   publ ...