导航:首页 > 编程语言 > 数字钟计时器vhdl编程

数字钟计时器vhdl编程

发布时间:2024-12-06 11:55:25

㈠ VHDL 数字钟

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
elsif cnt0<"1001" then----小于9时
cnt0:=cnt0+1;----计数
--elsif cnt0="1001" then
--clk1<=not clk1;
else
cnt0:="0000";

if cnt1<"1001" then----高位小于9时
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
secm1<=cnt1;
secm0<=cnt0;

end process;
end SEC;

秒模块程序清单

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity SECOND is
port(clk,clr:in std_logic;----时钟/清零信号
sec1,sec0:out std_logic_vector(3 downto 0);----秒高位/低位
co:out std_logic);-------输出/进位信号
end SECOND;

architecture SEC of SECOND is
begin
process(clk,clr)
variable cnt1,cnt0:std_logic_vector(3 downto 0);---计数
begin
if clr='1' then----当ckr为1时,高低位均为0
cnt1:="0000";
cnt0:="0000";
elsif clk'event and clk='1' then
if cnt1="0101" and cnt0="1000" then----当记数为58(实际是经过59个记时脉冲)
co<='1';----进位
cnt0:="1001";----低位为9
elsif cnt0<"1001" then----小于9时
cnt0:=cnt0+1;----计数
else
cnt0:="0000";

if cnt1<"0101" then----高位小于5时
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
sec1<=cnt1;
sec0<=cnt0;

end process;
end SEC;

分模块程序清单

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity MINUTE is
port(clk,en:in std_logic;
min1,min0:out std_logic_vector(3 downto 0);
co:out std_logic);
end MINUTE;

architecture MIN of MINUTE is
begin

process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clk'event and clk='1' then
if en='1' then
if cnt1="0101" and cnt0="1000" then
co<='1';
cnt0:="1001";
elsif cnt0<"1001" then
cnt0:=cnt0+1;
else
cnt0:="0000";

if cnt1<"0101" then
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
end if;
min1<=cnt1;
min0<=cnt0;

end process;
end MIN;

时模块程序清单

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity HOUR is
port(clk,en:in std_logic;----输入时钟/高电平有效的使能信号
h1,h0:out std_logic_vector(3 downto 0));----时高位/低位
end HOUR;

architecture hour_arc of HOUR is
begin
process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0);----记数
begin
if clk'event and clk='1' then---上升沿触发
if en='1' then---同时“使能”为1
if cnt1="0010" and cnt0="0011" then
cnt1:="0000";----高位/低位同时为0时
cnt0:="0000";
elsif cnt0<"1001" then----低位小于9时,低位记数累加
cnt0:=cnt0+1;
else
cnt0:="0000";
cnt1:=cnt1+1;-----高位记数累加
end if;
end if;
end if;
h1<=cnt1;
h0<=cnt0;

end process;
end hour_arc;
动态扫描模块
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity SELTIME is
port(
clk:in std_logic;------扫描时钟
secm1,secm0,sec1,sec0,min1,min0,h1,h0:in std_logic_vector(3 downto 0);-----分别为秒个位/时位;分个位/
ut:out std_logic_vector(3 downto 0);----------------输出
sel:out std_logic_vector(2 downto 0));-----位选信号
end SELTIME;
architecture fun of SELTIME is
signal count:std_logic_vector(2 downto 0);----计数信号
begin
sel<=count;
process(clk)
begin
if(clk'event and clk='1') then
if(count>="111") then
count<="000";
else
count<=count+1;
end if;
end if;
case count is
when"111"=>ut<= secm0;----秒个位
when"110"=>ut<= secm1;----秒十位
when"101"=>ut<= sec0;----分个位
when"100"=>ut<= sec1;----分十位
when"011"=>ut<=min0; ----时个位
when"010"=>ut<=min1;----时十位
when"001"=>ut<=h0;
when others =>ut<=h1;
end case;
end process;
end fun;
报时模块

library ieee;
use ieee.std_logic_1164.all;
entity ALERT is
port(m1,m0,s1,s0:in std_logic_vector(3 downto 0);------输入秒、分高/低位信号
clk:in std_logic;------高频声控制
q500,qlk:out std_logic);----低频声控制
end ALERT;

architecture sss_arc of ALERT is
begin
process(clk)
begin

if clk'event and clk='1' then
if m1="0101" and m0="1001" and s1="0101" then----当秒高位为5,低位为9时且分高位为5
if s0="0001" or s0="0011" or s0="0101" or s0="0111" then---当分的低位为1或3或5或7时
q500<='1';----低频输出为1
else
q500<='0';----否则输出为0
end if;
end if;

if m1="0101" and m0="1001" and s1="0101" and s0="1001" then---当秒高位为5,低位为9时且分高位为5,----分低位为9时,也就是“59分59秒”的时候“报时”
qlk<='1';-----高频输出为1
else
qlk<='0';
end if;
end if;
end process;
end sss_arc;
显示模块

library ieee;
use ieee.std_logic_1164.all;
entity DISPLAY is
port(d:in std_logic_vector(3 downto 0);----连接seltime扫描部分d信号
q:out std_logic_vector(6 downto 0));----输出段选信号(电平)
end DISPLAY;
architecture disp_are of DISPLAY is
begin
process(d)
begin

case d is
when"0000" =>q<="0111111";--显示0
when"0001" =>q<="0000110";--显示1
when"0010" =>q<="1011011";--显示2
when"0011" =>q<="1001111";--显示3
when"0100" =>q<="1100110";--显示4
when"0101" =>q<="1101101";--显示5
when"0110" =>q<="1111101";--显示6
when"0111" =>q<="0100111";--显示7
when"1000" =>q<="1111111";--显示8
when others =>q<="1101111";--显示9
end case;
end process;
end disp_are;
顶层文件(原理图输入)

********************************************************************
数字钟设计模块与程序(不含秒表)
*********************************************************************
1.分频模块(原理图输入)

2. 秒模块程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity SECOND is
port(clk,clr:in std_logic;
sec1,sec0:out std_logic_vector(3 downto 0);
co:out std_logic);
end SECOND;

architecture SEC of SECOND is
begin
process(clk,clr)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clr='1' then
cnt1:="0000";
cnt0:="0000";
elsif clk'event and clk='1' then
if cnt1="0101" and cnt0="1000" then
co<='1';
cnt0:="1001";
elsif cnt0<"1001" then
cnt0:=cnt0+1;
else
cnt0:="0000";

if cnt1<"0101" then
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
sec1<=cnt1;
sec0<=cnt0;

end process;
end SEC;

3.分模块程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity MINUTE is
port(clk,en:in std_logic;
min1,min0:out std_logic_vector(3 downto 0);
co:out std_logic);
end MINUTE;

architecture MIN of MINUTE is
begin
process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clk'event and clk='1' then
if en='1' then
if cnt1="0101" and cnt0="1000" then
co<='1';
cnt0:="1001";
elsif cnt0<"1001" then
cnt0:=cnt0+1;
else
cnt0:="0000";

if cnt1<"0101" then
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
end if;
min1<=cnt1;
min0<=cnt0;

end process;
end MIN;

4.时模块程序

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity HOUR is
port(clk,en:in std_logic;
h1,h0:out std_logic_vector(3 downto 0));
end HOUR;

architecture hour_arc of HOUR is
begin
process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clk'event and clk='1' then
if en='1' then
if cnt1="0010" and cnt0="0011" then
cnt1:="0000";
cnt0:="0000";
elsif cnt0<"1001" then
cnt0:=cnt0+1;
end if;
end if;
end if;
h1<=cnt1;
h0<=cnt0;

end process;
end hour_arc;

5.扫描模块程序

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity SELTIME is
port(
clk:in std_logic;
sec1,sec0,min1,min0,h1,h0:in std_logic_vector(3 downto 0);
ut:out std_logic_vector(3 downto 0);
sel:out std_logic_vector(2 downto 0));
end SELTIME;
architecture fun of SELTIME is
signal count:std_logic_vector(2 downto 0);
begin
sel<=count;
process(clk)
begin
if(clk'event and clk='1') then
if(count>="101") then
count<="000";
else
count<=count+1;
end if;
end if;
case count is
when"000"=>ut<= sec0;
when"001"=>ut<= sec1;
when"010"=>ut<= min0;
when"011"=>ut<= min1;
when"100"=>ut<=h0;
when others =>ut<=h1;
end case;
end process;
end fun;

6.显示模块程序

library ieee;
use ieee.std_logic_1164.all;
entity DISPLAY is
port(d:in std_logic_vector(3 downto 0);
q:out std_logic_vector(6 downto 0));
end DISPLAY;
architecture disp_are of DISPLAY is
begin
process(d)
begin

case d is
when"0000" =>q<="0111111";
when"0001" =>q<="0000110";
when"0010" =>q<="1011011";
when"0011" =>q<="1001111";
when"0100" =>q<="1100110";
when"0101" =>q<="1101101";
when"0110" =>q<="1111101";
when"0111" =>q<="0100111";
when"1000" =>q<="1111111";
when others =>q<="1101111";
end case;
end process;
end disp_are;

7.定时闹钟模块程序

library ieee;
use ieee.std_logic_1164.all;
entity ALERT is
port(m1,m0,s1,s0:in std_logic_vector(3 downto 0);
clk:in std_logic;
q500,qlk:out std_logic);
end ALERT;

architecture sss_arc of ALERT is
begin
process(clk)
begin

if clk'event and clk='1' then
if m1="0101" and m0="1001" and s1="0101" then
if s0="0001" or s0="0011" or s0="0101" or s0="0111" then
q500<='1';
else
q500<='0';
end if;
end if;

if m1="0101" and m0="1001" and s1="0101" and s0="1001" then
qlk<='1';
else
qlk<='0';
end if;
end if;
end process;
end sss_arc;

㈡ VHDL数字时钟完整程序代码(要求要有元件例化,并且有按键消抖),谢谢啦啦啦啦

图11
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity xuan21 is
Port ( alarm,a,b: in std_logic;
y:out std_logic);
end xuan21 ;

architecture one of xuan21 is
begin
process(alarm,a,b)
begin
if alarm='0' then y<=a;else y<=b;
end if;
end process;
end one;
仿真波形如下图12:

图12
(2)三位二选一:
模块图如图13。用以进行正常计时时间与闹铃时间显示的选择,alarm输入为按键。当alarm按键未曾按下时二选一选择器会选择输出显示正常的计时结果,否则当alarm按键按下时选择器将选择输出显示闹铃时间显示。

图13
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity x213 is
Port ( alarm : in std_logic;
y:out std_logic_vector(3 downto 0);
a,b: in std_logic_vector(3 downto 0));

end x213;

architecture one of x213 is
begin
process(alarm,a,b)
begin
if alarm='0' then y<=a;else y<=b;
end if;
end process;
end one;
仿真结果如下图14:

图14
8、整点报时及闹时:
模块图如图15。在59分51秒、53秒、55秒、57秒给扬声器赋以低音512Hz信号,在59分59秒给扬声器赋以高音1024Hz信号,音响持续1秒钟,在1024Hz音响结束时刻为整点。当系统时间与闹铃时间相同时给扬声器赋以高音1024Hz信号。闹时时间为一分钟。

图15
程序如下:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity voice is
Port ( hou1,huo0,min1,min0,sec1,sec0,hh,hl,mh,ml: std_logic_vector(3 downto 0);
in_1000,in_500:in std_logic;
q : out std_logic);
end voice;

architecture one of voice is
begin
process(min1,min0,sec1,sec0)
begin
if min1="0101" and min0="1001" and sec1="0101" then
if sec0="0001" or sec0="0011" or sec0="0101" or sec0="0111"
then q<=in_500;
elsif sec1="0101" and sec0="1001" then q<=in_1000;
else q<='0';
end if;
else q<='0';
end if;
if min1=mh and min0=ml and hou1=hh and huo0=hl then
q<=in_1000;
end if;
end process;
end one;
仿真波形如下图16

图16
9、顶层原理图:

三、感想

通过这次设计,既复习了以前所学的知识,也进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在画顶层原理图时,遇到了不少问题,最大的问题就是根本没有把各个模块的VHD文件以及生成的器件都全部放在顶层文件的文件夹内,还有就是程序设计的时候考虑的不够全面,没有联系着各个模式以及实验板的情况来编写程序,以至于多考虑编写了译码电路而浪费了很多时间。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示
:在分频模块中,设定输入的时钟信号后,却只有二分频的结果,其余三个分频始终没反应。后来,在数十次的调试之后,才发现是因为规定的信号量范围太大且信号的初始值随机,从而不能得到所要的结果。还有的仿真图根本就不出波形,怎么调节都不管用,后来才知道原来是路径不正确,路径中不可以有汉字。真是细节决定成败啊!总的来说,这次设计的数字钟还是比较成功的,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。

四、参考资料:
1、潘松,王国栋,VHDL实用教程〔M〕.成都:电子科技大学出版社,2000.(1)
2、崔建明主编,电工电子EDA仿真技术北京:高等教育出版社,2004
3、李衍编着,EDA技术入门与提高王行西安:西安电子科技大学出版社,2005
4、侯继红,李向东主编,EDA实用技术教程北京:中国电力出版社,2004
5、沈明山编着,EDA技术及可编程器件应用实训北京:科学出版社,2004
6、侯伯亨等,VHDL硬件描述语言与数字逻辑电路设计西安: 西安电子科技大学出版社,1997
7、辛春艳编着,VHDL硬件描述语言北京:国防工业出版社,2002 就这些

㈢ 基于VHDL语言的自动打铃数字钟设计

数字电子钟的设计

一、 绪论

(一)引言
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间。尤其在医院,每次护士都会给病人作皮试,测试病人是否对药物过敏。注射后,一般等待5分钟,一旦超时,所作的皮试试验就会无效。手表当然是一个好的选择,但是,随着接受皮试的人数增加,到底是哪个人的皮试到时间却难以判断。所以,要制作一个定时系统。随时提醒这些容易忘记时间的人。
钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。
(二)论文的研究内容和结构安排
本系统采用石英晶体振荡器、分频器、计数器、显示器和校时电路组成。由LED数码管来显示译码器所输出的信号。采用了74LS系列中小规模集成芯片。使用了RS触发器的校时电路。总体方案设计由主体电路和扩展电路两大部分组成。其中主体电路完成数字钟的基本功能,扩展电路完成数字钟的扩展功能。论文安排如下:
1、绪论 阐述研究电子钟所具有的现实意义。
2、设计内容及设计方案 论述电子钟的具体设计方案及设计要求。
3、单元电路设计、原理及器件选择 说明电子钟的设计原理以及器件的选择,主要从石英晶体振荡器、分频器、计数器、显示器和校时电路五个方面进行说明。
4、绘制整机原理图 该系统的设计、安装、调试工作全部完成。

二、设计内容及设计方案

(一)设计内容要求
1、设计一个有“时”、“分”、“秒”(23小时59分59秒)显示且有校时功能的电子钟。
2、用中小规模集成电路组成电子钟,并在实验箱上进行组装、调试。
3、画出框图和逻辑电路图。
4 、功能扩展:
(1)闹钟系统
(2)整点报时。在59分51秒、53秒、55秒、57秒输出750Hz音频信号,在59分59秒时,输出1000Hz信号,音像持续1秒,在1000Hz音像结束时刻为整点。
(3)日历系统。
(二)设计方案及工作原理
数字电子钟的逻辑框图如图1所示。它由石英晶体振荡器、分频器、计数器、译码器显示器和校时电路组成。振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24翻1”规律计数。计数器的输出分别经译码器送显示器显示。计时出现误差时,可以用校时电路校时、校分。

图1 数字电子钟逻辑框图

三、单元电路设计、原理及器件选择

(一)石英晶体振荡器
1、重要概念的解释
(1) 反馈:将放大电路输出量的一部分或全部,通过一定的方式送回放大电路的输入端。
(2) 耦合:是指信号由第一级向第二级传递的过程。
2、石英晶体振荡器的具体工作原理
石英晶体振荡器的特点是振荡频率准确、电路结构简单、频率易调整。它被广泛应用于彩电、计算机、遥控器等各类振荡电路中。它还具有压电效应:在晶体某一方向加一电场,晶体就会产生机械变形;反之,若在晶片的两侧施加机械压力,则在晶片相应的方向上将产生电场,这种物理现象称为压电效应。在这里,我们在晶体某一方向加一电场,从而在与此垂直的方向产生机械振动,有了机械振动,就会在相应的垂直面上产生电场,从而使机械振动和电场互为因果,这种循环过程一直持续到晶体的机械强度限制时,才达到最后稳定,这种压电谐振的频率即为晶体振荡器的固有频率。
用反相器与石英晶体构成的振荡电路如图2所示。利用两个非门G1和G2 自我反馈,使它们工作在线性状态,然后利用石英晶体JU来控制振荡频率,同时用电容C1来作为两个非门之间的耦合,两个非门输入和输出之间并接的电阻R1和R2作为负反馈元件用,由于反馈电阻很小,可以近似认为非门的输出输入压降相等。电容C2是为了防止寄生振荡。例如:电路中的石英晶体振荡频率是4MHz时,则电路的输出频率为4MHz。

图2 石英晶体振荡电路

(二)分频器
1、8421码制,5421码制
用四位二进制码的十六种组合作为代码,取其中十种组合来表示0-9这十个数字符号。通常,把用四位二进制数码来表示一位十进制数称为二-十进制编码,也叫做BCD码,见表1。
表1
8421码 5421码
0 0000 0000
1 0001 0001
2 0010 0010
3 0011 0011
4 0100 0100
5 0101 1000
6 0110 1001
7 0111 1010
8 1000 1011
9 1001 1100

2、分频器的具体工作原理
由于石英晶体振荡器产生的频率很高,要得到秒脉冲,需要用分频电路。例如,振荡器输出4MHz信号,通过D触发器(74LS74)进行4分频变成1MHz,然后送到10分频计数器(74LS90,该计数器可以用8421码制,也可以用5421码制),经过6次10分频而获得1Hz方波信号作为秒脉冲信号。(见图3)

图3 分频电路
3、图中标志的含义
CP——输入的脉冲信号
C0——进位信号
Q——输出的脉冲信号
(三)计数器
秒脉冲信号经过6级计数器,分别得到“秒”个位、十位,“分”个位、十位以及“时”个位、十位的计时。“秒”、“分”计数器为60进制,小时为24进制。
1、60进制计数器
(1) 计数器按触发方式分类
计数器是一种累计时钟脉冲数的逻辑部件。计数器不仅用于时钟脉冲计数,还用于定时、分频、产生节拍脉冲以及数字运算等。计数器是应用最广泛的逻辑部件之一。按触发方式,把计数器分成同步计数器和异步计数器两种。对于同步计数器,输入时钟脉冲时触发器的翻转是同时进行的,而异步计数器中的触发器的翻转则不是同时。
(2)60进制计数器的工作原理
“秒”计数器电路与“分”计数器电路都是60进制,它由一级10进制计数器和一级6进制计数器连接构成,如图4所示,采用两片中规模集成电路74LS90串接起来构成的“秒”、“分”计数器。

图4 60进制计数电路
IC1是十进制计数器,QD1作为十进制的进位信号,74LS90计数器是十进制异步计数器,用反馈归零方法实现十进制计数,IC2和与非门组成六进制计数。74LS90是在CP信号的下降沿翻转计数,Q A1和 Q C2相与0101的下降沿,作为“分”(“时”)计数器的输入信号,通过与非门和非门对下一级计数器送出一个高电平1(在此之前输出的一直是低电平0)。Q B2 和Q C2计数到0110,产生的高电平1分别送到计数器的清零R0(1), R0(2),74LS90内部的R0(1)和R0(2)与非后清零而使计数器归零,此时传给下一级计数器的输入信号又变为低电平0,从而给下一级计数器提供了一个下降沿,使下一级计数器翻转计数,在这里IC2完成了六进制计数。由此可见IC1和 IC2串联实现了六十进制计数。
其中:74LS90——可二/五分频十进制计数器
74LS04——非门
74LS00——二输入与非门
2、24进制计数器
小时计数电路是由IC5和IC6组成的24进制计数电路,如图5所示。
当“时”个位IC5计数输入端CP5来到第10个触发信号时,IC5计数器自动清零,进位端QD5向IC6“时”十位计数器输出进位信号,当第24个“时”(来自“分”计数器输出的进位信号)脉冲到达时,IC5计数器的状态为“0100”,IC6计数器的状态为“0010”,此时“时”个位计数器的QC5和“时”十位计数器的QB6输出为“1”。把它们分别送到IC5和IC6计数器的清零端R0(1)和R0(2),通过7490内部的R0(1)和R0(2)与非后清零,从而完成24进制计数。

图5 24进制计数电路
(四) 译码与显示电路
1、显示器原理(数码管)
数码管是数码显示器的俗称。常用的数码显示器有半导体数码管,荧光数码管,辉光数码管和液晶显示器等。
本设计所选用的是半导体数码管,是用发光二极管(简称LED)组成的字形来显示数字,七个条形发光二极管排列成七段组合字形,便构成了半导体数码管。半导体数码管有共阳极和共阴极两种类型。共阳极数码管的七个发光二极管的阳极接在一起,而七个阴极则是独立的。共阴极数码管与共阳极数码管相反,七个发光二极管的阴极接在一起,而阳极是独立的。
当共阳极数码管的某一阴极接低电平时,相应的二极管发光,可根据字形使某几段二极管发光,所以共阳极数码管需要输出低电平有效的译码器去驱动。共阴极数码管则需输出高电平有效的译码器去驱动。
2、译码器原理(74LS47)
译码为编码的逆过程。它将编码时赋予代码的含义“翻译”过来。实现译码的逻辑电路成为译码器。译码器输出与输入代码有唯一的对应关系。74LS47是输出低电平有效的七段字形译码器,它在这里与数码管配合使用,表2列出了74LS47的真值表,表示出了它与数码管之间的关系。
表2
输 入 输 出 显示数字符号
LT(——) RBI(——-) A3 A2 A1 A0 BI(—)/RBO(———)
a(—) b(—) c(—) d(—) e(—) f(—) g(—)

1 1 0 0 0 0 1 0 0 0 0 0 0 1 0
1 X 0 0 0 1 1 1 0 0 1 1 1 1 1
1 X 0 0 1 0 1 0 0 1 0 0 1 0 2
1 X 0 0 1 1 1 0 0 0 0 1 1 0 3
1 X 0 1 0 0 1 1 0 0 1 1 0 0 4
1 X 0 1 0 1 1 0 1 0 0 1 0 0 5
1 X 0 1 1 0 1 1 1 0 0 0 0 0 6
1 X 0 1 1 1 1 0 0 0 1 1 1 1 7
1 X 1 0 0 0 1 0 0 0 0 0 0 0 8
1 X 1 0 0 1 1 0 0 0 1 1 0 0 9
X X X X X X 0 1 1 1 1 1 1 1 熄灭
1 0 0 0 0 0 0 1 1 1 1 1 1 1 熄灭
0 X X X X X 1 0 0 0 0 0 0 0 8
(1)LT(——):试灯输入,是为了检查数码管各段是否能正常发光而设置的。当LT(——)=0时,无论输入A3 ,A2 ,A1 ,A0为何种状态,译码器输出均为低电平,若驱动的数码管正常,是显示8。
(2)BI(—):灭灯输入,是为控制多位数码显示的灭灯所设置的。BI(—)=0时。不论LT(——)和输入A3 ,A2 ,A1,A0为何种状态,译码器输出均为高电平,使共阳极数码管熄灭。
(3)RBI(——-):灭零输入,它是为使不希望显示的0熄灭而设定的。当对每一位A3= A2 =A1 =A0=0时,本应显示0,但是在RBI(——-)=0作用下,使译码器输出全为高电平。其结果和加入灭灯信号的结果一样,将0熄灭。
(4)RBO(———):灭零输出,它和灭灯输入BI(—)共用一端,两者配合使用,可以实现多位数码显示的灭零控制。
3、译码器与显示器的配套使用
译码是把给定的代码进行翻译,本设计即是将时、分、秒计数器输出的四位二进制数代码翻译为相应的十进制数,并通过显示器显示,通常显示器与译码器是配套使用的。我们选用的七段译码驱动器(74LS47)和数码管(LED)是共阳极接法(需要输出低电平有效的译码器驱动)。译码显示电路如图6所示。

图6 译码显示电路
(五)校时电路
1、RS触发器(见图7)

图7 基本RS触发器
R(—) S(—)
Q Q(—)
说 明
0 1
1 0
1 1
0 0 0
1
0或1
1 1
0
1或0
1 置0
置1
保持原来状态
不正常状态,0信号消失后,触发器状态不定

2、无震颤开关电路
无震颤开关电路的原理:(见图8)当开关K的刀扳向1点时,S(—)=0,R(—)=1,触发器置1。S(—)端由于开关K的震颤而断续接地几次时,也没有什么影响,触发器置1后将保持1状态不变。因为K震颤只是使S(—)端离开地,而不至于使R(—)端接地,触发器可靠置1。
当开关K从S(—)端扳向R(—)端时,有同样的效果,触发器可靠置0。从Q端或Q(—)端反映开关的动作,输出电平是稳定的。
3、校时电路的实现原理
当电子钟接通电源或者计时发现误差时,均需要校正时间。校时电路分别实现对时、分的校准,由于4个机械开关具有震颤现象,因此用RS触发器作为去抖动电路。采用RS基本触发器及单刀双掷开关,闸刀常闭于2点,每搬动一次产生一个计数脉冲,实现校时功能,电路如图8所示。

图8 校时电路
(六)调 试

毕满清等.电子技术实验与课程设计.北京:机械工业出
版社,1995.131~132
这本书上很全

㈣ vhdl数字钟的代码

a.秒计数器设计(xsecond)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
entity xsecond is
port (clk:in std_logic;
clkset:in std_logic;
setmin:in std_logic;
reset:in std_logic;
secout:out std_logic_vector(6 downto 0);
enmin:out std_logic );
end xsecond;
architecture xsecond_arch of xsecond is
signal sec:std_logic_vector(6 downto 0);
signal emin:std_logic;
signal secl: std_logic;
begin
process (reset,sec,emin,setmin,clkset)
begin
if reset='0' then
enmin<='0';
secout<="0000000";
secl<='1';
else
secl<='0';
secout<=sec;
if clkset='1'and clkset'event then
if setmin ='0'then
enmin <='1';
else
enmin<=emin;
end if;
end if;
end if;
end process;
process(clk,secl)
alias lcount: std_logic_vector(3 downto 0)is sec (3 downto 0);
alias hcount:std_logic_vector(2 downto 0)is sec (6 downto 4);
begin
if secl='1' then
sec<="0000000";
else
if (clk='1' and clk'event) then
if lcount <=9 then
lcount<="0000";
if hcount/=5 then
hcount <=hcount+1;
emin<='0';
else
hcount<="000";
emin<='1';
end if;
else
lcount<=lcount+1;
emin<='0';
end if;
end if;
end if;
end process;
end xsecond_arch;
b.分计数器设计(xminute)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
entity xminute is
port (clkmin:in std_logic;
clk:in std_logic;
sethour:in std_logic;
reset:in std_logic;
minout:out std_logic_vector(6 downto 0);
enhour:out std_logic );
end xminute;
architecture xminute_arch of xminute is
signal min:std_logic_vector(6 downto 0);
signal ehour:std_logic;
signal minl: std_logic;
begin
process (reset,clk,min,sethour,ehour)
begin
if reset='0' then
enhour<='0';
minout<="0000000";
minl<='0';
else
minl<='1';
minout<=min;
if clk='1'and clk'event then
if sethour ='0'then
enhour <='1';
else
enhour<=ehour;
end if;
end if;
end if;
end process;
process(clkmin,minl)
alias lcountm: std_logic_vector(3 downto 0)is min (3 downto 0);
alias hcountm:std_logic_vector(2 downto 0)is min (6 downto 4);
begin
if minl='0' then
min<="0000000";
else
if (clkmin='1' and clkmin'event) then
if lcountm <=9 then
lcountm<="0000";
if hcountm/=5 then
hcountm <=hcountm+1;
ehour<='0';
else
hcountm<="000";
ehour<='1';
end if;
else
lcountm<=lcountm+1;
ehour<='0';
end if;
end if;
end if;
end process;
end xminute_arch;
c.时计数器设计(xhour)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
entity xhour is
port (clkhour:in std_logic;
reset:in std_logic;
hourout:out std_logic_vector(5 downto 0));
end xhour;
architecture xhour_arch of xhour is
signal hour:std_logic_vector(5 downto 0);
begin
process (reset,clkhour,hour)
alias lcount: std_logic_vector(3 downto 0)is hour(3 downto 0);
alias hcount:std_logic_vector(1 downto 0)is hour(5 downto 4);
begin
if reset='0' then
hourout<="000000";
hour<="000000";
else
if (clkhour='1' and clkhour'event) then
if lcount <=9 then
lcount<="0000";
hcount<=hcount+1;
else
if hour="100011" then
hour<="000000";
else
lcount<=lcount+1;
end if;
end if;
end if;
hourout<=hour;
end if;
end process;
end xhour_arch;
d.动态扫描电路设计(xsettime)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
entity xsettime is
port (hour:in std_logic_vector(5 downto 0);
min:in std_logic_vector(6 downto 0);
sec:in std_logic_vector(6 downto 0);
reset : in std_logic;
clk:in std_logic;
sel:out std_logic_vector(2 downto 0);
d_out:out std_logic_vector(3 downto 0));
end xsettime;
architecture xsettime_arch of xsettime is
signal sel1:std_logic_vector(2 downto 0);
begin
process (reset,sec,min,hour,clk,sel1)
begin
if reset='0' then
sel <="000";
d_out<="0000";
sel1<="000";
else
if(clk='1'and clk'event) then
if sel1<5 then
sel1<=sel1+1;
else
sel1<="000";
end if;
end if;
sel<=sel1;
case sel1 is
when "000"=>
d_out( 3 )<='0';
d_out( 2 )<='0';
d_out( 2 )<=hour( 5 );
d_out( 0 )<=hour( 4);
when "001"=>
d_out <= hour(3 downto 0);
when "010"=>
d_out( 3 )<='0';
d_out( 2 )<=min( 6 );
d_out( 1 )<=min( 5);
d_out( 0 )<=min( 4);
when "011"=>
d_out <= min(3 downto 0);
when "100"=>
d_out( 3 )<='0';
d_out( 2 )<=sec( 6 );
d_out( 1 )<=sec( 5);
d_out( 0 )<=sec( 4);
when "101"=>
d_out <= sec(3 downto 0);
when others=>
null;
end case;
end if;
end process;
end xsettime_arch;
e.报时电路设计(xalert)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
entity xalert is
port (clk:in std_logic;
d_in:in std_logic_vector(6 downto 0);
speak : out std_logic;
d_out:out std_logic_vector(2 downto 0) );
end xalert;
architecture xalert_arch of xalert is
type state is (s1,s2,s3,s4);
signal next_state,current_state:state;
begin
process (clk,current_state,d_in)
begin
if d_in/="0000000" then
speak <='0';
next_state <=s1;
current_state<=s1;
d_out<="000";
else
if clk='1'and clk'event then
speak <='1';
end if;
case current_state is
when s1 =>
d_out<="000";
next_state<=s2;
when s2 =>
d_out<="001";
next_state<=s3;
when s3 =>
d_out<="010";
next_state<=s4;
when s4 =>
d_out<="100";
next_state<=s1;
when others =>
d_out<="000";
null;
end case;
end if;
end process;
end xalert_arch;

阅读全文

与数字钟计时器vhdl编程相关的资料

热点内容
精品php源码 浏览:960
自己编写云服务器抢红包 浏览:203
java解压缩文件加密 浏览:887
dlink打印服务器默认地址 浏览:353
php休眠函数 浏览:372
金蝶如何打开服务器 浏览:766
e4a手游辅助源码 浏览:777
什么app可以实时直播 浏览:106
苹果13的app闪退什么原因 浏览:775
尾盘选股源码公式 浏览:450
php日期运算 浏览:931
天龙八部长歌服务器什么时候开的 浏览:199
鬼泣4模型在那个文件夹 浏览:229
单片机的串行口 浏览:58
phpjson转化为数组 浏览:268
pdf导入excel 浏览:428
苹果xsmax信任app在哪里设置 浏览:53
自动外链php源码 浏览:245
我的世界新手奖励箱命令 浏览:146
linux更新vim 浏览:998