E D A 课程设计报告 -----自动电子钟设计
实验分工
本次实验,我负责在图书馆翻阅书籍查找,王东则在网
上查找。资料收集好后,我们一起讨论设计方案,得出可行
的设计方案之后是进行上机程序的调试。我负责程序的输
入,然后我们一起调试程序。仿真出每一个模块的功能波形。
准确无误后,再进行顶层设计,
一.设计要求
1.用 24 小时制进行时间显示;
2.能够显示小时、分钟;
3.每秒钟要有秒闪烁指示;
4.上电后从“00:00”开始显示。
二.设计目的
1. 掌握多位计数器相连的设计方法。
2. 掌握十六进制,二十四进制,六十进制计数器的设计方法。
3. 掌握 CPLD 技术的层次化设计方法。
4. 了解软件的元件管理含义以及模块元件之间的连接概念。
5. 掌握电子电路一般的设计方法,并了解电子产品的研制开发过
程,基本掌握电子电路安装和调试的方法。
6. 培养独立分析问题,解决问题的能力。
三.设计原理
电子钟是一个将“时”“分”显示于人的视觉器官的计时装置。它
的计时周期为 24 小时;显示满刻度为 23 时 59 分 59 秒,秒由一个灯
显示,将标准秒信号送入“秒计数器”,“秒计数器”采用 60 进制
计数器,每累加 60 秒发送一个“分脉冲”信号,该信号将被送到“时
计数器”。“时计数器”采用 24 进制计数器,可实现对一天 24 小时
的累计。译码显示电路将“时”“分”计数器的输出状态四段显示译
码器译码。通过六位LED七段显示器显示出来。秒就由灯的闪烁来
表示。
1.电子钟计数采用层次化设计,将设计任务分成若干个模块。规定
每一模块的功能和各模块之间的接口。
(1)second(秒) 60进制计数
(2)minute(分) 60进制计数
(3)hour(时) 24进制计数
(4)fp 百分频器
(5)6 选 1 扫描显示
(6) 7 段数码显示器
同时整个计数器有清零
2.端口引脚名称
输入 clk,reset clkscan
输出 light,sel,
7seg
四、设计过程
1、设计实验原理图(顶层设计)
通过上面的分频器,两个 60 进制的计数器,一个 24 进制的计数
器,6 选 1 扫描器,7 段数码显示器,设计如图所示的顶层。
设计思想,利用脉冲时钟产生一个 1Hz 的信号来实现一秒钟的控
制,要产生 1Hz 的信号就要用到分频器,实验中用三个百分频器把
1MHz 的信号变成 1Hz。然后信号进入控制秒的计数器,当第 60 个脉
冲时钟到来时,产生一个进位信号,送到控制分的计数器,同理,当
第 60 个脉冲时钟到来时,产生一个进位信号,送到控制小时的计数
器。当小时计数器计数到 24 时,完成一个周期,跳转到零。输出是
由 7 段数码显示器和 6 选 1 扫描器来完成的。扫描器时钟取至前面分
频未结束时的一个 100Hz 的信号。这样就能够在 7 段数码显示管上,
以 100Hz 的频率扫描显示出时钟的数字变化。
2、各模块的说明:
(1) 百分频器模块
百分频模块图
程序如下
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity fp is
port (rst,clk : in STD_LOGIC;
what: out STD_LOGIC);
end fp;
architecture a of fp is
signal count100 : integer range 0 to 99;
signal tt:std_logic;
begin
process (rst,clk)
begin
if rst='1' then count100<=0;
elsif rising_edge(clk) then
count100<= count100 + 1 ;tt<=tt;
if count100=99 then count100<=0;tt<=not tt;
end if ;
end if;
what<=tt;
end process;
end a;
仿真波形
仿真波形分析:由仿真波形图可知,当 clk 为上升沿,what 为下降
沿时,count100 输出由 99 变为 0,并且 count100 都是由 0 到 99 循
环,所以,这是一个 100 分频模块
(2)60 进制计数器 控制秒模块
秒模块图
程序如下
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity second is
port(clk,reset:in std_logic;
sec1,sec2:out std_logic_vector(3 downto 0);
carry:out std_logic);
end second;
architecture rt1 of second is
signal sec1_t,sec2_t:std_logic_vector(3 downto 0);
begin
process(clk,reset)
begin
if reset='1'then
sec1_t<="0000";
sec2_t<="0000";
elsif clk'event and clk='1'then
if sec1_t="1001"then
sec1_t<="0000";
if sec2_t="0101"then
sec2_t<="0000";
else
sec2_t<=sec2_t+1;
end if;
else
sec1_t<=sec1_t+1;
end if;
if sec1_t="1001" and sec2_t="0101"then
carry<='1';
else
carry<='0';
end if;
end if;
end process;
sec1<=sec1_t;
sec2<=sec2_t;
end rt1;
仿真波形
仿真波形分析:由仿真波形图可知,当 clk 和 carry 为上升沿时,sec1
输出由 9 变为 0,并且 sec1 都是由 0 到 9 循环,sec2 输出由 5 变为
0,并且 sec2 都是由 0 到 5 循环,所以,这是一个 60 进制的秒控制
模块
(3)60 进制计数器 控制分钟模块
分模块图
程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity minute is
port (clk,reset:in std_logic;
min1,min2:out std_logic_vector(3 downto 0);
carry:out std_logic);
end minute;
architecture rt1 of minute is
signal min1_t,min2_t:std_logic_vector(3 downto 0);
begin
process(clk,reset)
begin
if reset='1'then
min1_t<="0000";
min2_t<="0000";
elsif clk'event and clk='1'then
if min1_t="1001"then
min1_t<="0000";
if min2_t="0101"then
min2_t<="0000";
else
min2_t<=min2_t+1;
end if;
else
min1_t<=min1_t+1;
end if;
if min1_t="1001" and min2_t="0101"then
carry<='1';
else
carry<='0';
end if;
end if;
end process;
min1<=min1_t;
min2<=min2_t;
end rt1;
仿真波形
仿真波形分析:由仿真波形图可知,当 clk 和 carry 为上升沿时,min1
输出由 9 变为 0,并且 min1 都是由 0 到 9 循环,min2 输出由 5 变为
0,并且 min2 都是由 0 到 5 循环,所以,这是一个 60 进制的分控制
模块
(4)24 进制计数器 控制小时模块
时模块图