目录

前言

一、简易电子时钟的功能要求

二、设计思路&整体框架

三、完整代码

四、仿真

总结


前言

来分享第一个案例了!简易电子时钟的Verilog设计,电子时钟应该算是走嵌入式和FPGA开发的敲门砖了叭(也可能是流水灯)。本次设计实现的平台是Altera的DE2开发板。


一、简易电子时钟的功能要求

一个简易的电子时钟应该包含以下功能:

  • 正常显示时分秒
  • 可调节时间

在此基础上也还可以继续扩展功能,本次由于刚入门,便只实现了基本功能。

二、设计思路&整体框架

要正常计时,我们需要一个1Hz的信号。在Verilog中采用分频器对基准时钟进行分频,使用这个1Hz信号进行计数,便可以产生时分秒。再将时分秒用数码管显示出来,第一个功能成功实现;在第一个基础上,设置一个拨码开关,用以区分正常模式和调时模式。当电子时钟处于调时模式时,最低位数码管闪烁,按下增1按键时数字加1;按下移位按键时闪烁位向高位移动。当模式调回正常模式时,从修改后的时间开始计时。

综上,需要一个分频器、一个时间管理模块、需要六个数码管显示译码器。整体框图如下:

对于分频器这一ip,之后会出文详述,此处使用的是占空比50%的偶分频。数码管显示译码模块属于较为简单的模块,读者在看其Verilog代码时很容易便理解。

三、完整代码

开门见山!先上整个完整能编译的Verilog代码!

module simple_electronic_clock(clk,key_add,key_displace,switch_mode,hour_decode,min_decode,sec_decode);
input clk;//基准时钟50MHz
input key_add;//增一按键
input key_displace;//移位按键
input switch_mode;//模式开关
output [13:0] hour_decode;//小时译码
output [13:0] min_decode;//分钟译码
output [13:0] sec_decode;//秒译码wire clk_1Hz,clk_2Hz;//分频后的1Hz、2Hz信号
wire [1:0] mode_cnt;//调时的闪烁位
wire [7:0] hour,min,sec;//时,分,秒divider(clk_2Hz,clk_1Hz,clk);//分频器
time_management(clk_1Hz,switch_mode,key_add,key_displace,hour,min,sec,mode_cnt);//时间管理模块
digital_tube_decode(clk_2Hz,mode_cnt,hour,min,sec,hour_decode,min_decode,sec_decode);//数码管显示译码模块
endmodulemodule divider(clk_2Hz,clk_1Hz,clk);//分频器
output reg clk_1Hz,clk_2Hz;
input clk;
reg [24:0] count,count2;//内部计数单元//count计满24999999时信号反向,产生1Hz信号
always@(posedge clk)   begin  if(count==25'd24999999)begincount<=25'b0;clk_1Hz<=~clk_1Hz;endelsecount<=count+1'b1;
end//count2计满12499999时信号反向,产生2Hz信号
always@(posedge clk)   begin if(count==25'd12499999)begincount2<=25'b0;clk_2Hz<=~clk_2Hz;endelsecount2<=count2+1'b1;
end
endmodule module time_management(clk_1Hz,switch_mode,key_add,key_displace,hour,min,sec,mode_cnt);//时间管理模块
input clk_1Hz,switch_mode,key_add,key_displace;
output reg [7:0] hour,min,sec;
output reg [1:0] mode_cnt;//调时的闪烁位标志//时间计时&调时
always @(posedge clk_1Hz) begincase (switch_mode)1'b0:sec[3:0] <= sec[3:0] + 1'b1;//正常模式计时1'b1:begin                       //调时模式if(key_add) begincase (mode_cnt)2'b00:sec[3:0] <= sec[3:0] + 1'b1;//秒时间加一2'b01:min[3:0] <= min[3:0] + 1'b1;//分时间加一2'b10:hour[3:0] <= hour[3:0] + 1'b1;//时时间加一default:;endcaseendenddefault:;endcase//以下为进位条件判断if(sec[3:0] == 4'd10) begin        sec[3:0] <= 4'b0;sec[7:4] <= sec[7:4] + 1'b1;endif(sec[7:4] == 4'd6) beginsec[7:4] <= 4'b0;min[3:0] <= min[3:0] + 1'b1;endif(min[3:0] == 4'd10) beginmin[3:0] <= 4'b0;min[7:4] <= min[7:4] + 1'b1;endif(min[7:4] == 4'd6) beginmin[7:4] <= 4'b0;hour[3:0] <= hour[3:0] + 1'b1;endif(hour[3:0] == 4'd10) beginhour[3:0] <= 4'b0;hour[7:4] <= hour[7:4] + 1'b1;endif(hour[3:0] == 4'd4  && hour[7:4] == 4'd2) beginhour[3:0] <= 4'b0;hour[7:4] <= 4'b0;end
end//移位按键触发移位
always @(posedge key_displace) beginif(switch_mode)    beginif(mode_cnt == 2'b10) mode_cnt <= 2'b0;else mode_cnt <= mode_cnt + 1'b1;end
endendmodulemodule digital_tube_decode(clk_2Hz,mode_cnt,hour,min,sec,hour_decode,min_decode,sec_decode);
input clk_2Hz;
input [1:0] mode_cnt;
input [7:0] hour,min,sec;
output reg [13:0] hour_decode,min_decode,sec_decode;reg flag;//闪烁产生
always @(posedge clk_2Hz) beginflag <= ~flag;
end//显示译码
always @(posedge clk_2Hz) begincase (mode_cnt)    //根据闪烁位标志,使得闪烁位数字闪烁2'b00:beginhour_decode[6:0] <= decode(hour[3:0]);hour_decode[13:7] <= decode(hour[7:4]);min_decode[6:0] <= decode(min[3:0]);min_decode[13:7] <= decode(min[3:0]);if(flag) beginsec_decode[6:0] <= decode(sec[3:0]);sec_decode[13:7] <= decode(sec[3:0]);endelse begin  //7'b1111111为数码管全灭,下面同理sec_decode[6:0] <= 7'b1111111;sec_decode[13:7] <= 7'b1111111;endend2'b01:beginhour_decode[6:0] <= decode(hour[3:0]);hour_decode[13:7] <= decode(hour[7:4]);sec_decode[6:0] <= decode(sec[3:0]);sec_decode[13:7] <= decode(sec[7:4]);if(flag) beginmin_decode[6:0] <= decode(min[3:0]);min_decode[13:7] <= decode(min[7:4]);endelse beginmin_decode[6:0] <= 7'b1111111;min_decode[13:7] <= 7'b1111111;endend2'b10:beginsec_decode[6:0] <= decode(sec[3:0]);sec_decode[13:7] <= decode(sec[7:4]);min_decode[6:0] <= decode(min[3:0]);min_decode[13:7] <= decode(min[7:4]);if(flag) beginhour_decode[6:0] <= decode(hour[3:0]);hour_decode[13:7] <= decode(hour[7:4]);endelse beginhour_decode[6:0] <= 7'b1111111;hour_decode[13:7] <= 7'b1111111;endenddefault:;endcase
end//译码函数,便于重复调用
function [6:0] decode;
input [3:0] num;begincase (num)4'd0:decode=7'b1000000;4'd1:decode=7'b1111001;4'd2:decode=7'b0100100;4'd3:decode=7'b0110000;4'd4:decode=7'b0011001;4'd5:decode=7'b0010010;4'd6:decode=7'b0000010;4'd7:decode=7'b1111000;4'd8:decode=7'b0000000;4'd9:decode=7'b0010000;default: decode=7'b1111111;endcase
end
endfunctionendmodule 

四、仿真

仿真就等我之后有空再弄叭(dog)。


总结

这篇文是我第一个Verilog案例,主要讲解设计思路,当然还有更好的电子时钟例码,我这个算是无脑编写QaQ

[SugerTangYL] 简易电子时钟Verilog设计相关推荐

  1. FPGA课程设计——数字电子时钟VERILOG(基于正点原子新起点开发板,支持8位或6位共阳极数码管显示时分秒毫秒,可校时,可设闹钟,闹钟开关,led指示)

    2019级电子科学与技术专业FPGA课程设计 报   告 2022  年 5 月 20 日 多功能数字电子钟的设计 摘要 电子设计自动化(EDA)是一种实现电子系统或电子产品自动化设计的技术,使用ED ...

  2. 微型计算机系统电子时钟程序设计,基于单片机的电子时钟设计 普通单片机电子时钟的设计的分析...

    摘要:随着电子科技的飞速发展,尤其是超大规模集成电路的出现,给我国的经济带来了实质性的改变.其中,对于单片机的使用已经在很多领域都有出现,比如说在工业自动化控制房间.在智能仪器仪表方面以及各种家用电器 ...

  3. 基于STM32的简易电子秒表仿真设计(仿真+程序+设计报告+讲解)

    基于STM32的简易电子秒表仿真设计(仿真+程序+设计报告+讲解) 视频演示 1.主要功能 2.仿真 3. 程序 4. 设计报告 5.资料清单&下载链接 仿真图proteus 8.9 程序编译 ...

  4. JS项目—电子时钟的设计与实现

    第一章 JavaScript基础项目 1.1 电子时钟的设计与实现 功能实现:设计一款简单的电子时钟,要求实现显示当前的时分秒,并且可以每秒更新一次实现动态效果. 1.1.1时分秒显示框的设计 3个& ...

  5. 单片机电子时钟的设计(期末课程设计)

    题目:单片机电子时钟的设计 设计一个时钟,可以正常显示时分秒,也可以通过按键改变分钟和小时,且有整点提醒功能 1.能够正常计时并且能够显示小时.分钟.秒,10分. (1)正常显示秒,2分 (2)正常显 ...

  6. 数字电子时钟的设计与实现

    摘 要 钟表的数字化给人们生产生活带来了极大的方便,大大的扩展了原先钟表的报时.诸如,定时报警.按时自动打铃.时间程序自动控制等,这些,都是以钟表数字化为基础的.功能数字钟是一种用数字电路实现时.分. ...

  7. 电子时钟的设计与实现

    电子时钟的设计与实现 功能要求:设计一款简单的电子时钟,要求实现显示当前的时分秒,并且可以每秒更新一次实现动态效果.最终效果图如图所示. 实现效果图: 一.界面设计核心技术概括: 1.整体设计: ①使 ...

  8. 51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能)

    51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能) AT89C52.LCD1602.DS1302.speaker. Proteus仿真 实例代码 #include<reg52.H ...

  9. c语言电子时钟课程设计报告,电子时钟嵌入式课程设计报告

    <电子时钟嵌入式课程设计报告>由会员分享,可在线阅读,更多相关<电子时钟嵌入式课程设计报告(19页珍藏版)>请在人人文库网上搜索. 1.合海大学计算机信息工程学院(常州)课程设 ...

最新文章

  1. UNIX/Linux系统管理技术手册(3)----bash 数组和算术运算
  2. 如何在Spring Boot中使用Hibernate Natural ID
  3. HDU 2852 KiKi's K-Number 主席树
  4. Boost.MultiIndex 双向映射示例
  5. redis集群的搭建
  6. js改变select下拉框默认选择的option
  7. ClickHouse之简单性能测试
  8. 2019Mobicom 论文列表
  9. 一道JS面试题目引发的思考
  10. Tomcat和myeclipse的相关操作以及myeclipse的激活方法
  11. 有用的Flex Builder快捷键
  12. Spring cloud eureka 入门使用及指导说明(单机篇)
  13. web页面制作-环游记(一)
  14. 计划任务执行 php代码,php实现Windows任务计划定时执行的代码以及扩展(图)
  15. 从10秒到2秒!ElasticSearch性能调优实践
  16. Leetcode: Maximal Square
  17. python 获取路径
  18. linux检查nfs服务,Linux-nfs服务
  19. 【硬石STM32f407开发板_DIY入门】模块化编程实例
  20. 程序员常用资源工具集合(建议收藏)

热门文章

  1. python怎么制作游戏存档功能,如何在Python中创建目录的zip存档?
  2. 中国 CA 市场 分析
  3. CentOS8安装Docker
  4. java110 RedPacket 红包系统安装与使用
  5. 最全面的微信小程序渲染图片的方式
  6. JDBC的URL详解
  7. 川师大计算机学院任教老师,全新启航,精彩蜕变——记四川师范大学计算机科学学院2019级新生开学典礼暨2019级新生学籍管理教育...
  8. 翻译Deep Learning and the Game of Go(3)第2章:围棋是一个机器学习难题(规则部分就不翻了)
  9. react-native-calendars的使用
  10. Calendars and DateFormats should not be static