易妖游戏网
您的当前位置:首页EDA课设 实验报告数字时钟

EDA课设 实验报告数字时钟

来源:易妖游戏网
 EDA课设 设计要求

1 具有时,分秒,计数显示功能,以24小时循环计时。 2 具有清零,调节小时,分钟功能。 3 具有整点报时功能。

实验目的

1掌握多位计数器相连的设计方法。

2 掌握十进制,六进制。二十四进制计数器的设计方法。 3 巩固多位共阴极扫描显示数码管的驱动及编码。 4 掌握扬声器的驱动。

5 掌握EDA技术的层次化设计方法。

顶层文件 数字时钟各模块连接图

程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; ENTITY SZZ IS

PORT (CLK,RESET,SETMIN,SETHOUR,CLKDSP:IN STD_LOGIC; SPEAKER:OUT STD_LOGIC;

LAMP:OUT STD_LOGIC_VECTOR(2 DOWNTO 0); SEL:OUT STD_LOGIC_VECTOR(2 DOWNTO 0); A,B,C,D,E,F,G,DPOUT:OUT STD_LOGIC); END SZZ;

ARCHITECTURE ONE OF SZZ IS COMPONENT SECOND

PORT(CLK,RESET,SETMIN:IN STD_LOGIC;

DAOUT:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);

ENMIN:OUT STD_LOGIC); END COMPONENT; COMPONENT MINUTE

PORT(CLK,CLK1,RESET,SETHOUR:IN STD_LOGIC; ENHOUR:OUT STD_LOGIC;

DAOUT:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END COMPONENT; COMPONENT HOUR

PORT(CLK,RESET:IN STD_LOGIC;

DAOUT:OUT STD_LOGIC_VECTOR(5 DOWNTO 0)); END COMPONENT; COMPONENT ALERT

PORT(CLK:IN STD_LOGIC;

DAIN:IN STD_LOGIC_VECTOR(6 DOWNTO 0); LAMP:OUT STD_LOGIC_VECTOR(2 DOWNTO 0); SPEAK:OUT STD_LOGIC); END COMPONENT; COMPONENT SELTIME

PORT(CLK1,RESET:IN STD_LOGIC;

SEC,MIN:IN STD_LOGIC_VECTOR(6 DOWNTO 0); HOUR:IN STD_LOGIC_VECTOR(5 DOWNTO 0); DP:OUT STD_LOGIC;

DAOUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); SEL:OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END COMPONENT; COMPONENT DELED PORT(

NUM:IN STD_LOGIC_VECTOR(3 DOWNTO 0); LED:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END COMPONENT;

SIGNAL ENMIN_RE,ENHOUR_RE:STD_LOGIC;

SIGNAL SECOND_DAOUT,MINUTE_DAOUT:STD_LOGIC_VECTOR(6 DOWNTO 0); SIGNAL HOUR_DAOUT:STD_LOGIC_VECTOR(5 DOWNTO 0); SIGNAL SELTIME_DAOUT:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL LEDOUT:STD_LOGIC_VECTOR(6 DOWNTO 0); BEGIN

A<=LEDOUT(6);B<=LEDOUT(5);C<=LEDOUT(4);D<=LEDOUT(3); E<=LEDOUT(2);F<=LEDOUT(1);G<=LEDOUT(0); U1:SECOND PORT MAP (RESET=>RESET, CLK=>CLK,

SETMIN=>SETMIN, ENMIN=>ENMIN_RE,

DAOUT=>SECOND_DAOUT); U2:MINUTE PORT MAP (CLK=>ENMIN_RE,

CLK1=>CLK, RESET=>RESET, SETHOUR=>SETHOUR,

ENHOUR=>ENHOUR_RE, DAOUT=>MINUTE_DAOUT); U3:HOUR PORT MAP ( CLK=>ENHOUR_RE, RESET=>RESET,

DAOUT=>HOUR_DAOUT); U4:ALERT PORT MAP ( CLK=>CLK,

DAIN=>MINUTE_DAOUT, SPEAK=>SPEAKER, LAMP=>LAMP); U5:SELTIME PORT MAP (CLK1=>CLKDSP, RESET=>RESET,

SEC=>SECOND_DAOUT, MIN=>MINUTE_DAOUT, HOUR=>HOUR_DAOUT, DAOUT=>SELTIME_DAOUT, DP=>DPOUT, SEL=>SEL);

U6:DELED PORT MAP (NUM=>SELTIME_DAOUT, LED=>LEDOUT); END ONE;

仿真图

2 秒计数器 程序

library ieee;

use ieee.std_logic_11.all; use ieee.std_logic_unsigned.all; entity second is port(

clk,reset,setmin:in std_logic; enmin :out std_logic;

daout:out std_logic_vector(6 downto 0)); end entity second;

architecture fun of second is

signal count:std_logic_vector(6 downto 0); signal enmin_1,enmin_2:std_logic; begin

daout<=count;

enmin_2<=(setmin and clk); enmin<=(enmin_1 or enmin_2); process(clk,reset,setmin) begin

if(reset='0')then count<=\"0000000\";

elsif(clk'event and clk='1')then if(count(3 downto 0)=\"1001\")then if(count<16#60#)then if(count=\"1011001\")then

enmin_1<='1';count<=\"0000000\"; else

count<=count+7; end if; else

count<=\"0000000\"; end if;

elsif(count<16#60#)then count<=count+1;

enmin_1<='0'after 100 ns; else

count<=\"0000000\"; end if; end if;

end process; end fun;

仿真图

3.分计时器

程序

LIBRARY ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_unsigned.all; ENTITY minute IS PORT(

clk,clk1,reset,sethour:IN STD_LOGIC; enhour:OUT STD_LOGIC;

daout:out std_logic_vector(6 downto 0)); END ENTITY minute;

ARCHITECTURE fun OF minute Is

SIGNAL count:STD_LOGIC_VECTOR(6 downto 0); SIGNAL enhour_1,enhour_2:STD_LOGIC; BEGIN daout<=count;

enhour_2<=(sethour and clk1); enhour<=(enhour_1 or enhour_2); process(clk,reset,sethour) begin

if(reset='0')then

count<=\"0000000\";

elsif(clk'event and clk='1')then

if(count(3 downto 0)=\"1001\")then if(count<16#60#)then

if(count=\"1011001\")then enhour_1<='1'; count<=\"0000000\"; ELSE

count<=count+7; end if; else

count<=\"0000000\"; end if;

elsif(count<16#60#)then count<=count+1;

enhour_1<='0'after 100 ns; else

count<=\"0000000\"; end if; end if; end process; END fun;

仿真图

4 小时文本 程序

library ieee;

use ieee.std_logic_11.all; use ieee.std_logic_unsigned.all; entity hour is port(

clk,reset:in std_logic;

daout: out std_logic_vector(5 downto 0)); end hour;

architecture fun of hour is

signal count:std_logic_vector(5 downto 0); begin

daout<=count; process(clk,reset) begin

if(reset='0')then count<=\"000000\";

elsif(clk'event and clk='1')then

if(count(3 downto 0)=\"1001\")then if(count<16#23#)then

count<=count+7; else

count<=\"000000\"; end if;

elsif(count<16#23#)then count<=count+1; else

count<=\"000000\"; end if; end if;

end process; end fun;

仿真图

5 报警文本 程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ALERT IS PORT(

CLK:IN STD_LOGIC;

DAIN:IN STD_LOGIC_VECTOR(6 DOWNTO 0); SPEAK:OUT STD_LOGIC;

LAMP:OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END ALERT;

ARCHITECTURE FIVE OF ALERT IS

SIGNAL COUNT:STD_LOGIC_VECTOR(1 DOWNTO 0); SIGNAL COUNT1:STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN

SPEAKER:PROCESS(CLK) BEGIN

SPEAK<=COUNT1(1);

IF(CLK'EVENT AND CLK='1') THEN IF(DAIN=\"0000000\") THEN IF(COUNT1>=\"10\") THEN COUNT1<=\"00\"; ELSE

COUNT1<=COUNT1+1; END IF; END IF; END IF;

END PROCESS SPEAKER; LAMPER:PROCESS(CLK) BEGIN

IF(RISING_EDGE(CLK)) THEN IF(COUNT<=\"10\") THEN IF(COUNT<=\"00\") THEN LAMP<=\"001\";

ELSIF(COUNT<=\"01\") THEN LAMP<=\"010\";

ELSIF(COUNT<=\"10\") THEN LAMP<=\"100\"; END IF;

COUNT<=COUNT+1; ELSE

COUNT<=\"00\"; END IF; END IF;

END PROCESS LAMPER; END FIVE;

仿真图

6 时间数据扫描分时选择模块文本 程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY SELTIME IS PORT(

CLK1,RESET:IN STD_LOGIC;

SEC,MIN:IN STD_LOGIC_VECTOR(6 DOWNTO 0); HOUR:IN STD_LOGIC_VECTOR(5 DOWNTO 0); DAOUT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); DP:OUT STD_LOGIC;

SEL:OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END SELTIME;

ARCHITECTURE SIX OF SELTIME IS

SIGNAL COUNT:STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN

SEL<=COUNT;

PROCESS(CLK1,RESET) BEGIN

IF(RESET='0') THEN

COUNT<=\"000\";

ELSIF (CLK1'EVENT AND CLK1='1') THEN IF(COUNT>=\"101\") THEN COUNT<=\"000\"; ELSE

COUNT<=COUNT+1; END IF; END IF; CASE COUNT IS

WHEN \"000\"=>DAOUT<=SEC(3 DOWNTO 0); DP<='0'; WHEN \"001\"=>DAOUT(3)<='0';

DAOUT(2 DOWNTO 0)<=SEC(6 DOWNTO 4); DP<='0';

WHEN \"010\"=>DAOUT<=MIN(3 DOWNTO 0); DP<='1'; WHEN \"011\"=>DAOUT(3)<='0';

DAOUT(2 DOWNTO 0)<=MIN(6 DOWNTO 4); DP<='0';

WHEN \"100\"=>DAOUT<=HOUR(3 DOWNTO 0); DP<='1'; WHEN OTHERS=>DAOUT(3 DOWNTO 2)<=\"00\"; DAOUT(1 DOWNTO 0)<=HOUR(5 DOWNTO 4); DP<='0'; END CASE; END PROCESS;

END SIX;

仿真图

7 译码器文本 程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DELED IS

PORT (NUM:IN STD_LOGIC_VECTOR(3 DOWNTO 0); LED:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END DELED;

ARCHITECTURE SEVEN OF DELED IS BEGIN

LED<=\"1111110\"WHEN NUM=\"0000\"ELSE \"0110000\"WHEN NUM=\"0001\"ELSE \"1101101\"WHEN NUM=\"0010\"ELSE \"1111001\"WHEN NUM=\"0011\"ELSE \"0110011\"WHEN NUM=\"0100\"ELSE \"1011011\"WHEN NUM=\"0101\"ELSE \"1011111\"WHEN NUM=\"0110\"ELSE \"1110000\"WHEN NUM=\"0111\"ELSE

\"1111111\"WHEN NUM=\"1000\"ELSE \"1111011\"WHEN NUM=\"1001\"ELSE \"1110111\"WHEN NUM=\"1010\"ELSE \"0011111\"WHEN NUM=\"1011\"ELSE \"1001110\"WHEN NUM=\"1100\"ELSE \"0111101\"WHEN NUM=\"1101\"ELSE \"1001111\"WHEN NUM=\"1110\"ELSE \"1000111\"WHEN NUM=\"1111\"; END SEVEN;

仿真图

设计中遇到的问题与体会

在置数方面第一次写时在时钟沿内同步置数下载在试验箱上很难实现于是把置数改成异步置数。在报时模块一直没搞清需要达到怎样的报时效果所以花费时间最长。 在设计数字时钟时通过解决在编程调试以及仿真过程中出现的种种问题加深了我们对软件设计坏境的熟悉程度。令我印象最深的就是在编程中虽然有些程序的结构获得的效果以及软件仿真的结果是一致的但在实际硬件实现却会有很大的不同。通过设计我们更深的认识了EDA技术受益匪浅。

因篇幅问题不能全部显示,请点此查看更多更全内容