EDA时钟设计

EDA时钟设计
EDA时钟设计

第一部分:设计说明

1设计任务

设计一款数字电子时钟,具体要求如下:

1:输入条件:50MHz时钟,2个输入按键;

2:功能实现:具有显示时、分、秒功能;采用LED数码管显示;具有闹钟与对时功能,对时精确到分,闹钟设置与对时采用按键作为输入信号。

3:采用altera公司的quartusII软件进行编程与仿真,设计语言可以选择VerilogHDL或VHDL。

2目的与意义

训练综合运用学过的数字电子技术、数字系统设计技术(HDL硬件设计)和计算机编程及电路相关基本知识,培养独立设计比较复杂数字系统设计能力。

通过综合设计,力争掌握使用EDA工具设计数字系统电路的基本方法,包括原理方案的确定、详细设计中的编程与仿真等一系列过程,为以后进行工程实践问题的研究打下设计基础。

时钟,自从它发明的那天起,就成为人类的朋友,但随着社会的进步,科技的的发展,人们对它的功能又提出了新的要求,怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?这就要求人们不断设计出新型时钟。

现代社会,守时已不仅关系到一个人的职业生涯,还成了衡量一个人道德的标准。时钟为人们提供了科学利用时间规律的依据,然而,普通的机械钟表与半机械钟表对于忙碌的生活显然早已不太适应,设计一款高精度数字时钟势在必行。本课题将通过对目前市场上的数字电子钟的研究,利用EDA技术设计一款高精度数字式电子钟,使人们可以得到精确时间显示,帮助人们合理安排时间,方便人们的生活

第二部分原理方案设计

1总体方案

要实现一个数字时钟小系统,整个系统由主要模块电路模块和外部输入输出以及显示模块组成。首先分别实现单个模块的功能,然后再通过级联组合的方式实现对整个系统的设计。

其中,主要模块有六个。它包括脉冲信号产生模块、时间计数模块(计数模块又分为分计数模块、秒计数模块、时计数模块)、译码显示模块、复位模块、闹铃模块、调节模块。各个模块先用EDA技术中的VHDL语言编程仿真,再生成各个小模块的模拟元件,再元件例化,根据设计连接电路实现数字电子钟小系统。2各部分方案

1:通过分频,产生1HZ的时钟信号

2:分别设计秒计时,分计时,时计时,秒计时用上面的时钟信号1HZ产生,分计时也是60一清零,分计时的时钟用的是秒计时的进位信号,时计时

用的是24一清零,CLK是分的进位。

3:闹铃模块其实和整点报时差不多,程序是整点报时,改变程序里的数据就可以实现闹铃模式

4:显示模块用的是7段共阳数码管,用来显示数字。

具体的思想如下图1所示

图1 总的程序电路图

第三部分详细设计过程

1分频器模块

1:模块说明:输入一个频率为50MHz的CLK,利用计数器分出1KHz的q1KHz,500Hz的q500Hz,2Hz的q2Hz和1Hz的q1Hz。

2:源程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

ENTITY fdiv IS

PORT (CLK: IN STD_LOGIC ; --输入时钟信号

q1KHz: BUFFER STD_LOGIC;

q500Hz: BUFFER STD_LOGIC;

q2Hz: BUFFER STD_LOGIC;

q1Hz: OUT STD_LOGIC);

END fdiv ;

ARCHITECTURE bhv OF fdiv IS

BEGIN

P1KHZ:PROCESS(CLK)

VARIABLE cout:INTEGER:=0;

BEGIN

IF CLK'EVENT AND CLK='1' THEN

cout:=cout+1; --每来个时钟上升沿时cout开始

计数

IF cout<=25000 THEN q1KHz<='0'; --当cout<=25000时,q1KHz输出“0”

ELSIF cout<50000 THEN q1KHz<='1'; --当25000

END IF;

END PROCESS;

P500HZ:PROCESS(q1KHz) --q1KHz作为输入信号,分出q500Hz

VARIABLE cout:INTEGER:=0;

BEGIN

IF q1KHz'EVENT AND q1KHz='1' THEN

cout:=cout+1;

IF cout=1 THEN q500Hz<='0'; --二分频

ELSIF cout=2 THEN cout:=0;q500Hz<='1';

END IF;

END IF;

END PROCESS;

P2HZ:PROCESS(q500Hz)

VARIABLE cout:INTEGER:=0;

BEGIN

IF q500Hz'EVENT AND q500Hz='1' THEN

cout:=cout+1;

IF cout<=125 THEN q2Hz<='0';

ELSIF cout<250 THEN q2Hz<='1';

ELSE cout:=0;

END IF;

END IF;

END PROCESS;

P1HZ:PROCESS(q2Hz)

VARIABLE cout:INTEGER:=0;

BEGIN

IF q2Hz'EVENT AND q2Hz='1' THEN

cout:=cout+1;

IF cout=1 THEN q1Hz<='0';

ELSIF cout=2 THEN cout:=0;q1Hz<='1';

END IF;

END IF;

END PROCESS;

END bhv;

2秒计时模块

1:模块说明:通过分频获得的时钟信号,便是1s,秒的低位到达9是向高位进1,高位到达6是向上进1,并清零。

2:源程序

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;

3分计时模块

1:模块说明:这里用的时钟信号的来自秒的进位,即进一位就是1min,分的低位到达9是向高位进1并清零,高位到达6时向上进1,到达5时

等待进位后清零。.

2:源程序

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 second;

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;

4时计时模块

1:模块说明:这里的时钟信号时来自上面的分的进位,上面进一位便表示1h,时的低位到达9是向高位进1并清零,高位到达2等待进位后清零,这里当高位到达2时,低位为3即将到4时开始进位。

2:源程序

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity hour is

port (clk,reset:in std_logic;

hour1,hour2:out std_logic_vector(3 downto 0)); end hour;

architecture rt1 of hour is

signal hour1_t,hour2_t:std_logic_vector(3 downto 0); begin

process(clk,reset)

begin

if reset='1'then

hour1_t<="0000";

hour2_t<="0000";

elsif clk'event and clk='1'then

if hour1_t="0011" and hour2_t="0010"then

hour1_t<="0000";

hour2_t<="0000";

else

if hour1_t="1001"then

hour1_t<="0000";

if hour2_t="0010"then

hour2_t<="0000";

else

hour2_t<=hour2_t+1;

end if;

else

hour1_t<=hour1_t+1;

end if;

end if;

end process;

hour1<=hour1_t;

hour2<=hour2_t;

end rt1;

5闹铃模块

1:模块说明:程序中的语句if m1="0101" and m0="1001" and s1="0101" then if s0="0001" or s0="0011" or s0="0101" or s0="0111" 即是实现闹铃功能的程序,改变数值即可改变闹铃时间。

2:源程序

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)

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;

6显示模块

1:模块说明:通过共阳级数码管显示对应的数值。

2:源程序

library ieee;

use ieee.std_logic_1164.all;

entity segment7 is

port(data:in std_logic_vector(3 downto 0);

dout:out std_logic_vector(6 downto 0)); end segment7;

architecture behav of segment7 is

begin

process(data)

begin

case data is

when "0000"=>dout<="1111110";

when "0001"=>dout<="0110000";

when "0010"=>dout<="1101101";

when "0011"=>dout<="1111001";

when "0100"=>dout<="0110011";

when "0101"=>dout<="1011011";

when "0110"=>dout<="1011111";

when "0111"=>dout<="1110010";

when "1000"=>dout<="1111111";

when "1001"=>dout<="1111011";

when others=>dout<="0000000";

end case;

end process;

end behav;

第四部分功能仿真1秒计时

时序图

图2

电路图

图3

2分计时

时序图

图4 电路图

图5

3时计时

时序图

图6 电路图

图7

4分频仿真

时序图

图8 电路图

图9

5闹铃仿真

时序图

图10 电路图

图11

6显示仿真

时序图

图12 电路图

图13

相关主题
相关文档
最新文档