基于VHDL的数字时钟设计.doc
文本预览下载声明
目 录
1 概述 1
1.1数字时钟的工作原理 1
1.2设计任务 1
2 系统总体方案设计 2
3 VHDL模块电路设计 3
3.1模块实现 3
3.1.1分频模块pinlv 3
3.1.2按键去抖动模块qudou 5
3.1.3按键控制模块self1 6
3.1.4秒、分六十进制模块cantsixty 7
3.1.5时计数模块hourtwenty 9
3.1.6秒、分、时组合后的模块 9
3.1.7数码管显示模块 10
3.2数字时钟的顶层设计原理图 13
3.3系统仿真与调试 14
结束语 16
参考文献 17
致谢 18
附录 源程序代码 19
1 概述
1.1数字时钟的工作原理
数字钟电路的基本结构由两个60进制计数器和一个24进制计数器组成,分别对秒、分、小时进行计时,当计时到23时59分59秒时,再来一个计数脉冲,则计数器清零,重新开始计时。秒计数器的计数时钟CLK为1Hz的标准信号,可以由晶振产生的50MHz信号通过分频得到。当数字钟处于计时状态时,秒计数器的进位输出信号作为分钟计数器的计数信号,分钟计数器的进位输出信号又作为小时计数器的计数信号,每一秒钟发出一个中断给CPU,CPU采用NIOS,它响应中断,并读出小时、分、秒等信息。CPU对读出的数据译码,使之动态显示在数码管上。
1.2 设计任务
2 系统总体方案设计
图2.1数字时钟设计框图
3 VHDL模块电路设计
3.1 模块实现
3.1.1分频模块
图3.1分频模块
3.1.2按键去抖动模块
本设计用到FPGA开发板上的四个按键,由于按键有反应时间、抖动的问题,可能当按键被按一次时而系统感应到几次,造成误差。所以应该进行按键消抖的处理,让每按一次键系统只感应到一次按键。可以采用软件延时,触发反相器等方式进行消除抖动,本设计中采用软件延时的方式。
由VHDL语言生成的模块图和程序说明如下:
图3.2按键去抖动模块
;--设置计数初值
end if;
if k4=1 then cant4:=0;
end if; --设置计数初值
if canthen o1=0;
else o1=1;--延时0.5s
end if;
if canthen o2=0;
else o2=1; --延时0.5s
end if;
if canthen o3=0;
else o3=1; --延时0.5s
end if;
if canthen o4=0;
else o4=1; --延时0.5s
end if;
cant1:=cant1+1; --加一计数
cant2:=cant2+1; --加一计数
cant3:=cant3+1; --加一计数
cant4:=cant4+1; --加一计数
end if;
end process;
end beh;
3.1.3按键控制模块self1
本设计中使用了两个按键进行对时钟的暂停和调秒操作,当ok2按下时时钟暂停,再按ok3则进行秒个位的加一计数,每按一次进行加一处理。当调节好时间后,在按ok2键重新开始计数。
由VHDL语言生成的模块图和程序说明如下:
图3.3按键控制模块
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity self1 is
port(
c:in std_logic;
ok2:in std_logic;
ok3:in std_logic;
ck:out std_logic);
end ;--设置端口
architecture bea of self1 is
signal m:std_logic;
signal t:std_logic;
begin
p1:process(ok2,ok3,c);ok2和ok3触发进程
begin
if ok2event and ok2=0 then m=not m;--由ok2 的动作产生m的电平信号
end if;
if m=1 then ck=not(ok3);--把按键ok3的脉冲信号给输出
else ck=c;--否则把正常计数时钟给输出
end if;
end process p1;--结束进程
end bea;
3.1.4秒、分六十进制模块cantsixty
本设中秒、分的六十进制是由个位的十进制和十位的六进制进行组合实现的。当个位记到9时自动向高位进一,同时个位自动清零。当十位记到5并且个
显示全部