功能:显示时分秒,能够设置时间。

实现:两个按键,一个进入设置,一个加数字。显示用LCD5110

用状态机实现,总共四种状态

  idle(正常运行)——s_hour(时设置状态)——s_min(分设置状态)——s_sec(秒设置状态)

  四种状态用set键循环切换,add键在后三种状态中可以对值进行加1操作。

代码如下,此处按键输入为消抖后的

需要注意的是时间运行时的判断阈值和按键设置时的判断阈值不同


 /*--------------------------------------------------------------------------------------
-- Filename ﹕ lcd5110.v
-- Author ﹕ZRtech
-- Description ﹕5110显示字符
-- Called by ﹕Top module
-- Revision History ﹕10-5-20
-- Revision 1.0
-- Company ﹕ ZRtech Technology .Inc
-- Copyright(c) 2010, ZRtech Technology Inc, All right reserved
---------------------------------------------------------------------------------------*/
module time_module
(
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; //****************************************************
reg [:]cnt;//分频计数器
reg CLK1HZ;//分频时钟
reg s_hour_cnt;//小时计数进位状态 reg[:] p; //状态机定义
//reg[2:0] p_back; //状态返回 parameter idle='d0;//状态值定义
parameter s_hour='d1;
parameter s_minute='d2;
parameter s_second='d3; 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

 

【代码】verilog之:电子钟的更多相关文章

  1. 利用Xilinx HLS实现LDPC译码器

    1. 概述 采用Xilinx HLS快速实现的部分并行,全流水的LDPC译码器. 环境:Vivado HLS 2018.2 码字:IEEE 802.16e 2/3A 算法:Min-Sum Algori ...

  2. 数字逻辑实践6-> 从数字逻辑到计算机组成 | 逻辑元件总结与注意事项

    00 一些前言 数字逻辑是计算机组成与体系结构的前导课,但是在两者的衔接之间并没有那么流畅,比如对面向硬件电路的设计思路缺乏.这篇总结是在数字逻辑和计组体系结构的衔接阶段进行的. 虽然这篇文是两门课的 ...

  3. 一段比较有意思的代码——介绍system verilog中的新增幅值语句

    system verilog中新加了很多幅值语句,虽然都只适用于阻塞幅值,但是在某些场合中非常实用. 下面是一段有意思的代码,覆盖了一些用法. package definitions; typedef ...

  4. Verilog代码规范I

    Verilog代码规范I "规范"这问题 "规范"这个富含专业气息的词汇(个人感觉),其实规范这种东西,就是大家都约定熟成的东西,一旦你不遵守这个东西,专业人士 ...

  5. Verilog HDL基础语法讲解之模块代码基本结构

    Verilog HDL基础语法讲解之模块代码基本结构   本章主要讲解Verilog基础语法的内容,文章以一个最简单的例子"二选一多路器"来引入一个最简单的Verilog设计文件的 ...

  6. 浅谈Verilog HDL代码编写风格

    消失了好久,没有写文章,也没有做笔记,因为最近再赶一个比赛,时间很紧,昨天周六终于结束了,所以趁着周末这会儿有时间,写点东西,记录下来.首先我学习FPGA才一年多,我知道自己没有资格谈论一些比较深层次 ...

  7. HD,3G视频数据中行号的插入方法---Verilog代码实现

    HD,3G视频数据中行号的插入方法---Verilog代码实现 行号的生成: `timescale 1ns / 1ps //////////////////////////////////////// ...

  8. sublime3添加verilog自动补全代码段

    前言 sublime默认的verilog自动补全十分垃圾,不过提供了代码段这个功能,你可以自己写个重用率高的代码段减轻工作量.写个模板当tb也很爽啦. 流程 1.打开user文件夹,创建verilog ...

  9. 串口接收端verilog代码分析

    串口接收端verilog代码分析 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////// ...

随机推荐

  1. C++之路进阶——bzoj1934(善意的投票)

    F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  hyxzc Logout 捐赠本站 Notice:由于本OJ建立在 ...

  2. C#学校班级自动升级实现代码

    代码逻辑如下: //班级自动升级 //获取该学校还没有毕业的班级 List<ClassInfoes> classinfoeslist = classinfoesbll.GetList(Sc ...

  3. Windows下pry安装和配置

    Windows下pry安装和配置 pry是一个增强型的交互式命令行工具,比irb强大. 有自动完成功能,自动缩进,有颜色.有更强大的调试功能. pry 安装很简单. 在终端输入: gem instal ...

  4. mongodb备份与恢复

    一.备份:mongodump -d mailaccess -c Mail -q ‘{user:”zhaoxy1@szdep.com”}’ -o /data/dump备份mailaccess datab ...

  5. java 字符串类型String

    在本质上,字符串实际上一个char类型的数组,由java.lang.String类来表示,该类具有一系列的属性和方法,提供对字符串的一些操作.除此之外,java还提供了StringBuffer类来处理 ...

  6. Python学习笔记-常用模块

    1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...

  7. 至强CPU性能排行,从X3210起,由低至高排列。

    X3210X3220E5410E5506X5355X3320E5507X5365E5-2603E3-1220LE5-2403E5607X3330L5506X3230L5420E5-2407W3520E ...

  8. WPFの静态资源(StaticResource)和动态资源(DynamicResource)

    下面是前台代码: <Window.Resources>        <TextBlock x:Key="res1" Text="好好学习"/ ...

  9. java初学知识点

    public class EnumTest { public static void main(String[] args) { Size s=Size.SMALL; Size t=Size.LARG ...

  10. C#报修系统Ⅱ

    用户需求: 1.用户可以注册,可以登录. 2.需要一个报修界面,当点击“报修”按钮时,软件会把用户报修的信息保存起来,更新报修次数,同时会清空相应的文本框,软件还要要检查所有文本框是否为空,空的话给出 ...