没有合适的资源?快使用搜索试试~ 我知道了~
首页VHDL语言数字钟(含秒表)设计
VHDL语言数字钟(含秒表)设计
需积分: 10 135 浏览量
更新于2023-03-03
评论
收藏 183KB DOC 举报
利用一块芯片完成除时钟源、按键、扬声器和显示器(数码管)之外的所有数字电路功能。所有数字逻辑功能都在CPLD器件上用VHDL语言实现。这样设计具有体积小、设计周期短(设计过程中即可实现时序仿真)、调试方便、故障率低、修改升级容易等特点。 本设计采用自顶向下、混合输入方式(原理图输入—顶层文件连接和VHDL语言输入—各模块程序设计)实现数字钟的设计、下载和调试。
资源详情
资源评论
资源推荐

基于 CPLD 的 VHDL 语言数字钟设计
基于 CPLD 的 VHDL 语言数字钟(含秒表)设计
利用一块芯片完成除时钟源、按键、扬声器和显示器(数码管)之外的所有数字电路
功能。所有数字逻辑功能都在 CPLD 器件上用 VHDL 语言实现。这样设计具有体积小、设
计周期短(设计过程中即可实现时序仿真)、调试方便、故障率低、修改升级容易等特点。
本设计采用自顶向下、混合输入方式(原理图输入—顶层文件连接和 VHDL 语言输入
—各模块程序设计)实现数字钟的设计、下载和调试。
一、 功能说明
已完成功能
1. 完成秒/分/时的依次显示并正确计数;
2. 秒/分/时各段个位满 10 正确进位,秒/分能做到满 60 向前进位;
3. 定时闹钟:实现整点报时,又扬声器发出报时声音;
4. 时间设置,也就是手动调时功能:当认为时钟不准确时,可以分别对分/时钟进行
调整;
5. 利用多余两位数码管完成秒表显示:A、精度达 10ms;B、可以清零;C、完成暂停
可以随时记时、暂停后记录数据。
待改进功能:
1. 闹钟只是整点报时,不能手动设置报时时间,遗憾之一;
2. 秒表不能向秒进位,也就是最多只能记时 100ms;
3. 秒表暂停记录数据后不能在原有基础上继续计时,而是复位重新开始。
【注意】秒表为后来添加功能,所以有很多功能不成熟!
二、 设计方案
1. 数字钟顶层设计
外部输入要求:输入信号有 1kHz/1Hz 时钟信号、低电平有效的秒/微秒清零信
号 CLR、低电平有效的调分信号 SETmin、低电平有效的调时信号 SEThour;
外部输出要求:整点报时信号 SOUND(59 分 51/3/5/7 秒时未 500Hz 低频声,
59 分 59 秒时为 1kHz 高频声)、时十位显示信号 h1(a,b,c,d,e,f,g)、时个位显示
信号 h0(a ,b,c,d,e,f,g)、分十位显示信号 m1 及分个位 m0、秒十位 s1 及秒个位
s0、微秒十位 ms1 及微秒个位 ms0;数码管显示位选信号 SEL0/1/2 等三个信号。
2. 内部功能模块主要有:
Fenp 分频模块:主要是整点报时用的 1kH 与 500Hz 的脉冲信号,这里的输入信号
是 1KHz 信号,所以只要一个二分频即可;时间基准采用 1Hz 输入信号直接提供
(当然也可以分频取得,这里先用的是分频取得的信号,后考虑到精度问题而采用
硬件频率信号。
实现带有 100 进制进位和清零功能,暂定等功能的微秒模块 MINSECONDB 输入为
1Hz 脉冲和低电平的清零信号 CLR 与暂定信号 STOP,输出微秒个位、十位及进位
信号 CO(虽然没有实现进位功能,但还是编写了这个端口,只是在连线时悬空)。
实现 60 进制带有进位和清零功能的秒计数模块 SECOND,输入为 1Hz 脉冲和低电
平有效的清零信号 CLR,输出秒个位、时位及进位信号 CO。
实现 60 进制带有进位和置数功能的分计数模块 MINUTE,输入为 1Hz 脉冲和高电
1

基于 CPLD 的 VHDL 语言数字钟设计
平有效的使能信号 EN,输出分个位、时位及进位信号 CO。
实现 24 进制的时计数模块 HOUR,输入为 1Hz 脉冲和高电平有效的使能信号
EN,输出分个位、时位。
实现分时复用功能模块 SELTIME,输入为秒(含个/十位)、分、时、扫描时钟
CLK1K,输出为 D 和显示控制信号 SEL。
实现整点报时功能模块 ALERT,输入为分/秒信号,输出为高频声控 Q1K 和
Q500。
实现译码显示功能模块 DISPLAY,输入为 D,输出为 Q
三、 设计框图
四、 模块说明(含程序代码)
1. 分频模块
2
频 率
信 号
输入
分频
微秒模块 秒模块 分模块 时模块
置数/位选
显示模块
进
位
进
位
进
位
高 /
低 电
平

基于 CPLD 的 VHDL 语言数字钟设计
采用原理图输入方式实现 2 分频与 1000 分频,但这里并没有用到 1000 分频,因为
后来考虑到精度问题,将千分频用直接输入了。程序如图:利用三个 7490 进行硬
件分频!
2. 微秒模块
采用 VHDL 语言输入方式,以时钟 clk,清零信号 clr 以及暂停信号 STOP 为进程
敏感变量,程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity MINSECONDb is
port(clk,clrm,stop:in std_logic;---- 时
钟/清零信号
secm1,secm0:out
std_logic_vector(3 downto 0);---- 秒
高位/低位
co:out std_logic);-------输出/进位
信号
end MINSECONDb;
architecture SEC of MINSECONDb
is
signal clk1,DOUT2:std_logic;
begin
process(clk,clrm)
variable cnt1,cnt0:std_logic_vector(3
downto 0);---计数
VARIABLE COUNT2 :INTEGER
RANGE 0 TO 10 ;
begin
IF CLK'EVENT AND
CLK='1'THEN
IF COUNT2>=0 AND
COUNT2<10 THEN
COUNT2:=COUNT2+1;
ELSE COUNT2:=0;
DOUT2<= NOT DOUT2;
END IF;
END IF;
if clrm='1' then----当 clr 为 1 时,高
低位均为 0
cnt1:="0000";
cnt0:="0000";
elsif clk'event and clk='1' then
if stop='1' then
cnt0:=cnt0;
cnt1:=cnt1;
end if;
if cnt1="1001" and cnt0="1000"
then----当记数为 98(实际是经过
59 个记时脉冲)
co<='1';----进位
cnt0:="1001";----低位为 9
3
剩余13页未读,继续阅读










安全验证
文档复制为VIP权益,开通VIP直接复制

评论0