第一篇:EDA课程设计——多功能数字钟
哈尔滨工业大学(威海)电子学课程设计报告
带有整点报时的数字钟设计与制作
姓名: 蒋栋栋 班级: 0802503 学号: 080250331 指导教师:
井岩
目录
一、课程设计的性质、目的和任务„„„„„„„„„„„„3
二、课程设计基本要求„„„„„„„„„„„„„„„„„3
三、设计课题要求„„„„„„„„„„„„„„„„„„„3
四、课程设计所需要仪器„„„„„„„„„„„„„„„„4
五、设计步骤„„„„„„„„„„„„„„„„„„„„„4
1、整体设计框图„„„„„„„„„„„„„„„„„„„4
2、各个模块的设计与仿真„„„„„„„„„„„„„„„4
2.1分频模块„„„„„„„„„„„„„„„„„„„„„„„4
2.2计数器模块„„„„„„„„„„„„„„„„„„„„„„6
2.3控制模块„„„„„„„„„„„„„„„„„„„„„„10
2.4数码管分配„„„„„„„„„„„„„„„„„„„„„13
2.5显示模块„„„„„„„„„„„„„„„„„„„„„„14
2.6报时模块„„„„„„„„„„„„„„„„„„„„„„16
六、调试中遇到的问题及解决的方法„„„„„„„„„„„18
七、心得体会„„„„„„„„„„„„„„„„„„„„„18
一、课程设计的性质、目的和任务
创新精神和实践能力二者之中,实践能力是基础和根本。这是由于创新基于实践、源于实践,实践出真知,实践检验真理。实践活动是创新的源泉,也是人才成长的必由之路。
通过课程设计的锻炼,要求学生掌握电路的一般设计方法,具备初步的独立设计能力,提高综合运用所学的理论知识独立分析和解决问题的能力,培养学生的创新精神。
二、课程设计基本要求
掌握现代大规模集成数字逻辑电路的应用设计方法,进一步掌握电子仪器的正确使用方法,以及掌握利用计算机进行电子设计自动化(EDA)的基本方法。
三、设计课题要求
(1)构造一个24小时制的数字钟。要求能显示时、分、秒。(2)要求时、分、秒能各自独立的进行调整。
(3)能利用喇叭作整点报时。从59分50秒时开始报时,每隔一秒报时一秒,到达00分00秒时,整点报时。整点报时声的频率应与其它的报时声频有明显区别。
#设计提示(仅供参考):(1)对频率输入的考虑
数字钟内所需的时钟频率有:基准时钟应为周期一秒的标准信号。报时频率可选用1KHz和2KHz左右(两种频率相差八度音,即频率相差一倍)。另外,为防止按键反跳、抖动,微动开关输入应采用寄存器输入形式,其时钟应为几十赫兹。
(2)计时部分计数器设计的考虑 分、秒计数器均为模60计数器。
小时计数为模24计数器,同理可建一个24进制计数器的模块。(3)校时设计的考虑
数字钟校准有3个控制键:时校准、分校准和秒校准。
微动开关不工作,计数器正常工作。按下微动开关后,计数器以8Hz频率连续计数(若只按一下,则计数器增加一位),可调用元件库中的逻辑门建一个控制按键的模块,即建立开关去抖动电路(见书70页)。
(4)报时设计的考虑
可以将高频时钟分频得到约2KHz和1KHz的音频,作为数字钟的报时频率。当电子钟显示XX:59:50时,数字钟开始报时“DO“,持续一秒,而且每隔一秒报一下,直至显示XX:00:00时报“DI”,持续一秒后停止。最后输出至喇叭。应调用元件库中的逻辑门建一个控制报时的模块。
(5)建一个七段译码的模块
因在系统可编程器件实验箱上的数码管没有经过译码,故要用AHDL语言写一个七段译码的模块,且应考虑数码管为共阳极。数码管上的点(D2、D4、D6)应置Vcc。
四、课程设计所需要仪器
1、计算机一台
2、quartusⅡ软件
3、FPGA开发板
五、设计步骤
1、模块介绍
(1)分频模块:产生1Hz、1KHz、2KHz频率(2)计数器模块:生成60进制、24进制计数器(3)控制模块:按键控制、按键消抖
(4)显示模块:7段数码管显示器,分别显示小时、分钟、秒(5)报时模块:进行整点报时
2、各个模块的设计与仿真
2.1分频模块
CLK晶振频率50MHZ,分成2KHZ,1KHZ,1HZ的信号。基准1HZ信号作为时钟计时的秒计数时钟信号;分频的1KHZ,2KHZ信号用于报时电路的不同声讯。
程序代码:
library ieee;use ieee.std_logic_1164.all;entity fre is port(clk ,sel: in std_logic;clk1hz,clk1khz,clk2khz:out std_logic);end fre;architecture beh of fre is signal data1khz,data2khz,data1hz : std_logic := '0';begin clk1hz <= data1hz;clk1khz <= data1khz;clk2khz <= data2khz;clk1khz_pro : process(clk)--产生1khz信号 variable cnt : integer range 0 to 24999;begin if clk'event and clk='1' then if cnt = 24999 then cnt := 0;data1khz <= not data1khz;else cnt := cnt + 1;end if;end if;end process clk1khz_pro;clk2khz_pro : process(clk)--variable cnt : integer range 0 to 12499;begin if clk'event and clk='1' then if cnt = 12499 then cnt := 0;data2khz <= not data2khz;else cnt := cnt + 1;end if;end if;end process clk2khz_pro;clk1hz_pro : process(data1khz)--variable cnt : integer range 0 to 499;begin if data1khz'event and data1khz='1' then if sel='0' then cnt:=0;else if cnt = 499 then cnt := 0;data1hz <= not data1hz;else cnt := cnt + 1;end if;end if;end if;end process clk1hz_pro;end beh;
输入模块电路图:
产生2khz信号 产生1hz 信号 5 freclkclk1hzclk2khzinst selclk1khz2.2计数器模块
由秒计数器,分计数器,时计数器组成了最基本的数字钟计时电路,两个六十进制计数器与二十四进制计数器组合构成。
程序代码:
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use IEEE.STD_LOGIC_ARITH.ALL;
entity shuzizhong is port(clk_change : in std_logic;s_en,m_en,h_en:in std_logic;sel:in std_logic;secout,minout,hourout :out std_logic;sl,sh,ml,mh,hl,hh:out std_logic_vector(3 downto 0);a:out std_logic_vector(15downto 0));end shuzizhong;architecture behav of shuzizhong is
signal low_rega,high_rega,low_regb,high_regb,low_regc,high_regc :std_logic_vector(3 downto 0):=“0000”;signal sout,mout,hout :std_logic :='0';begin--秒的60进制进制 counter_sec_l : process(clk_change,s_en)begin
sl<=low_rega;sh<=high_rega;ml<=low_regb;mh<=high_regb;hl<=low_regc;hh<=high_regc;6 if clk_change'event and clk_change='1' then if s_en='1' then if low_rega=“1001” then low_rega <= “0000”;else low_rega <= low_rega+'1';end if;end if;end if;end process counter_sec_l;counter_sec_h : process(clk_change,s_en,low_rega)begin if clk_change'event and clk_change='1' then if s_en='1' then if low_rega=“1001” then if high_rega =“0101”then high_rega <= “0000”;else high_rega <= high_rega+'1';end if;end if;end if;end if;end process counter_sec_h;sout <= '1' when low_rega=“1001” and high_rega=“0101” else '0';
----分钟的60进制设置 counter_min_l : process(clk_change,m_en)begin if clk_change'event and clk_change='1' then if m_en='1' then if sout='1'or sel='0' then if low_regb=“1001” then low_regb <= “0000”;else low_regb <= low_regb+'1';end if;end if;end if;end if;end process counter_min_l;counter_min_h : process(clk_change,m_en,low_regb)begin if clk_change'event and clk_change='1' then 7 if sout='1'or sel='0' then if m_en='1' then if low_regb=“1001” then
if high_regb =“0101”then
high_regb <= “0000”;else high_regb <= high_regb+'1';end if;end if;end if;end if;end if;end process counter_min_h;mout <= '1' when low_regb=“1001” and high_regb=“0101”and sout='1' else '0';--小时的24进制设置 counter_hour_l : process(clk_change,h_en)begin if clk_change'event and clk_change='1' then if h_en='1' then if mout='1'or sel='0' then if low_regc=“1001”or hout='1' then low_regc <= “0000”;else low_regc <= low_regc+'1';end if;end if;end if;end if;end process counter_hour_l;counter_hour_h : process(clk_change,h_en,hout)begin if clk_change'event and clk_change='1' then if mout='1'or sel='0' then if h_en='1' then if hout='1' then high_regc<=“0000”;else if low_regc=“1001” then high_regc <= high_regc+'1';end if;end if;end if;8 end if;end if;end process counter_hour_h;hout <= '1' when low_regc=“0011” and high_regc=“0010” else '0';secout<=sout;minout<=mout;hourout<=hout;a<=high_regb&low_regb&high_rega&low_rega;end behav;
输入模块电路图:
shuzizhongclk_changes_enm_enh_enselsecoutminouthouroutsl[3..0]sh[3..0]ml[3..0]mh[3..0]hl[3..0]hh[3..0]a[15..0]inst
2.3控制模块
分五个状态0状态正常计时,按下按键进入下一状态开始调时模式1,按下按键进入调秒模式2,按下按键进入调分模式3,按下按键进入调小时模式4.按下按键恢复正常计时模式。
程序代码:
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity key_press is port(set ,mode: in std_logic;clk1khz,clk1hz: in std_logic;secout,minout: in std_logic;clk_change,clk2hz_en:out std_logic;sel,s_ce,m_ce,h_ce:out std_logic;s_en,m_en,h_en:out std_logic);end key_press;architecture beh of key_press is 9 signal key1,key2:std_logic;signal sce_reg, mce_reg ,hce_reg:std_logic;signal ssl,ssen,mmen,hhen:std_logic;signal con : integer range 0 to 4 :=0;--按键按下(延时)begin
key_press2 : process(set,clk1khz)variable cnt :integer range 0 to 999;begin if set='0' then if clk1khz'event and clk1khz='1'then if cnt=50 and set='0' then cnt :=cnt+1;key2 <= '1';else cnt:=cnt+1;key2 <= '0';end if;end if;else cnt:=0;key2<='0';end if;end process key_press2;key_press1 : process(mode,clk1khz)variable cnt :integer range 0 to 999;begin if mode='0' then if clk1khz'event and clk1khz='1'then if cnt=50 and mode='0' then cnt :=cnt+1;key1 <= '1';else cnt:=cnt+1;key1 <= '0';end if;end if;else cnt:=0;key1<='0';end if;end process key_press1;count : process(key1,key2)begin if key1'event and key1='1' then if con=4 then con<=0;else con<=con+1;end if;end if;10 end process count;con_pro : process(con)begin case con is when 0 => ssl<='1';sce_reg <= '0';ssen <='1';mce_reg <= '0';mmen <='1';hce_reg <= '0';hhen <='1';clk2hz_en <='0';when 1 => ssl<='0';sce_reg <= '0';ssen <='1';mce_reg <= '0';mmen <='1';hce_reg <= '0';hhen <='1';clk2hz_en <='1';when 2 => ssl<='0';sce_reg <= '1';ssen <='1';mce_reg <= '0';mmen <='0';hce_reg <= '0';hhen <='0';clk2hz_en <='1';when 3 => ssl<='0';sce_reg <= '0';ssen <='0';mce_reg <= '1';mmen <='1';hce_reg <= '0';hhen <='0';clk2hz_en <='1';when 4 => ssl<='0';sce_reg <= '0';ssen <='0';mce_reg <= '0';mmen <='0';hce_reg <= '1';hhen <='1';clk2hz_en <='1';when others => ssl<='0';sce_reg <= '0';ssen <='1';mce_reg <= '0';mmen <='1';hce_reg <= '0';hhen <='1';clk2hz_en <='0';end case;end process con_pro;sel_pro : process(ssl)begin case ssl is when '0'=> s_ce<=sce_reg;m_ce<=mce_reg;h_ce<=hce_reg;clk_change<=key2;when '1'=> s_ce<=ssen;11 m_ce<=mmen;h_ce<=hhen;clk_change<=clk1hz;when others=> s_ce<=ssen;m_ce<=secout;h_ce<=minout;clk_change<=clk1hz;end case;end process sel_pro;sel<=ssl;s_en<=ssen;m_en<=mmen;h_en<=hhen;end beh;
输入模块电路图: key_presssetclk_changemodeclk2hz_enclk1khzselclk1hzs_cesecoutm_ceminouth_ces_enm_enh_eninst
2.4数码管分配
程序代码:
library ieee;use ieee.std_logic_1164.all;entity display is port(datain : in std_logic_vector(3 downto 0);dataout : out std_logic_vector(7 downto 0));end display;architecture duan of display is begin process(datain)begin case datain is 12 when “0000” => dataout <=“11000000”;--dp,g,f,e,d,c,b,a when “0001” => dataout <=“11111001”;when “0010” => dataout <=“10100100”;when “0011” => dataout <=“10110000”;when “0100” => dataout <=“10011001”;when “0101” => dataout <=“10010010”;when “0110” => dataout <=“10000010”;when “0111” => dataout <=“11111000”;when “1000” => dataout <=“10000000”;when “1001” => dataout <=“10010000”;when “1010” => dataout <=“10111111”;when “1011” => dataout <=“10000011”;when “1100” => dataout <=“10100111”;when “1101” => dataout <=“10100001”;when “1110” => dataout <=“10000110”;when “1111” => dataout <=“10001110”;when others => null;end case;end process;end;
输入模块电路图:
displaydatain[3..0]dataout[7..0]inst
2.5显示模块
使用七段数码管显示小时、分钟与秒
程序代码:
library ieee;use ieee.std_logic_1164.all;entity scan is port(clk1khz : in std_logic;sl,sh,ml,mh,hl,hh : in std_logic_vector(3 downto 0);clk2hz_en : in std_logic;s_ce,m_ce,h_ce : in std_logic;en_out : out std_logic_vector(7 downto 0);13 dataout : out std_logic_vector(3 downto 0));end scan;architecture beh of scan is signal cnt : integer range 0 to 7;signal en : std_logic_vector(7 downto 0);signal clk2hz : std_logic;signal h_ce_reg,m_ce_reg,s_ce_reg : std_logic;begin h_ce_reg <= not h_ce;m_ce_reg <= not m_ce;s_ce_reg <= not s_ce;cnt_pro : process(clk1khz)begin if clk1khz'event and clk1khz='1' then if cnt = 7 then cnt <= 0;else cnt <= cnt + 1;end if;end if;end process cnt_pro;clk2hz_pro :process(clk1khz)variable c : integer range 0 to 499 := 0;begin if clk1khz'event and clk1khz='1' then if clk2hz_en ='1' then if c =499 then c := 0;clk2hz <= not clk2hz;else c := c + 1;end if;else clk2hz <= '0';end if;end if;end process clk2hz_pro;scan_pro : process(cnt,sl,sh,ml,mh,hl,hh)begin case cnt is when 0 => dataout <= sl;en <= “11111110”;when 1 => dataout <= sh;en <= “11111101”;when 2 => dataout <= ml;en <= “11110111”;when 3 => dataout <= mh;en <= “11101111”;when 4 => dataout <= hl;en <= “10111111”;14 when 5 => dataout <= hh;en <= “01111111”;when 6 => dataout <= “1010”;en <= “11111011”;when 7 => dataout <= “1010”;en <= “11011111”;when others => null;end case;end process scan_pro;
en_out <= en or((clk2hz & clk2hz)or(h_ce_reg & h_ce_reg))& clk2hz &((clk2hz & clk2hz)or(m_ce_reg & m_ce_reg))& clk2hz &((clk2hz & clk2hz)or(s_ce_reg & s_ce_reg));end beh;
输入模块电路图:
scanclk1khzen_out[7..0]sl[3..0]dataout[3..0]sh[3..0]ml[3..0]mh[3..0]hl[3..0]hh[3..0]clk2hz_ens_cem_ceh_ceinst
2.6报时模块
利用蜂鸣器进行整点报时
程序代码:
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use IEEE.STD_LOGIC_ARITH.ALL;--整点报时 entity baoshi is port(clk1khz,clk2khz : in std_logic;a:in std_logic_vector(15 downto 0);sel:in std_logic;bell:out std_logic);end baoshi;architecture zhong of baoshi is signal c1,ring:std_logic;begin ring_bell :process(clk1khz,clk2khz)15 begin case a is when “***0” => c1<=clk1khz;when “***0” => c1<=clk1khz;when “***0” => c1<=clk1khz;when “***0” => c1<=clk1khz;when “***0” => c1<=clk1khz;when “***0” => c1<=clk2khz;when “***0” => c1<=clk2khz;when others => c1<='0';end case;end process ring_bell;
bs: process(c1)begin if sel='1' then if c1='1' then ring<='0';else ring<='1';end if;end if;end process bs;bell<=ring;
end zhong;
输入模块电路图:
baoshiclk1khzbellclk2khza[15..0]selinst
整体模块电路图
displayshuzizhongs_enm_enh_enselclk_changes_enm_enh_enselsecoutminouthouroutsl[3..0]sh[3..0]ml[3..0]mh[3..0]hl[3..0]hh[3..0]setmodefreclkINPUTVCCINPUTVCCdata[3..0]datain[3..0]secoutminoutinst1scanclk1khzclk1khzsl[3..0]sh[3..0]ml[3..0]mh[3..0]hl[3..0]a[15..0]dataout[7..0]OUTPUTdataout[7..0]en_out[7..0]dataout[3..0]OUTPUTen_out[7..0]data[3..0]key_presssetclk1khzmodeclk1khzclk1hzsecoutminoutclk_changeclk2hz_ensels_cem_ceh_ces_enm_enh_eninst6s_enm_enh_enselinst7a[15..0]INPUTVCChh[3..0]clk2hz_ens_cem_ceh_ceinst4baoshiclk1khzclk2khza[15..0]selclk1khzbellclk2khza[15..0]sel++selclkclk1hzselclk1khzclk2khzinst2clk1khzclk2khzsecoutminoutOUTPUTbellinst
六、调试中遇到的问题及解决的方法:
1、编程时,经常导致语法错误,如:“;”没有写上,变量类型没有预先标明,前后变量名字由于缺少一个或多一个字母而导致出错。解决办法:对照错误,认真检查程序,看哪个地方的标点,变量没有写上或标明。
2、进行编译或波形仿真时,经常得到的不是预想中的结果。
解决办法:将需要编译或进行仿真的实体文件置顶,经检错无误后,进行波形仿真,在仿真之前需要合理设置仿真结束时间和信号周期。
3、在控制时间的显示的时候,由于变量太多多发现不能完全的控制住变量,导致显示的时候出现了乱码,数码管显示不正常 解决办法:减少变量,仔细推敲,合理命名。
七、心得体会
一个多星期的课程设计让我受益匪浅,也让我真正明白理论与实践相结合的重要性。通过具体实践才能让自己清楚哪些知识已经掌握,哪些知识仍需巩固加强。与此同时,我也对EDA以及VHDL语言有了进一步了解,对于其结构、语法、功能等认识不少。当然,我目前所做的还仅仅只是一些基本操作,要想真正将其融会贯通还需要今后更多的学习与实践。虽然只是一个小设计,我却也从中学到了不少设计流程和一些相关问题。设计是一个十分严谨的过程,容不得随意和马虎。要想快速而高效地完成一项设计,必须先有一个清晰明了的设计思路,设想好一个整体框架,然后在此基础上,逐渐将各个部分功能进行完善。在设计的过程中,也曾遇到不少困难,但正所谓坚持就是胜利,要想取得成功,必须要有努力付出,这样所取得的结果才更有意义。
第二篇:EDA实现多功能数字钟
EDA实现多功能数字钟
实
验 报 告
专业班级:
学生姓名:
学生学号:
目录
一、内容摘要
二、实验要求
三、各底层模块设计
四、总体方案
五、心得体会
一、实验内容
利用 QuartusII 软件,结合所学的数字电路的知识设计一个 24 时多功能数 字钟,具有正常分、秒计时,动态显示的功能。分析整个电路的工作原理,分别说明各子模块的设计原理和调试、仿真、编 程的过程。
二、实验任务:
用 FPGA 器件和 EDA 技术实现多功能数字钟的设计
已知条件:
1、MAX+Plus 软件
2、FPGA 实验开发装置
基本功能:
1、以数字形式显示时、分、秒的时间;
2、小时计数器为 24 进制;
3、分、秒计数器为 60 进制。
三、底层模块设计(电路原理图及仿真)
1、小时计数器为24进制 电路原理图
仿真图
封装图
2、分、秒计时器都为60进制 电路原理图
仿真图
封装图
四、总体方案
按照上述实验要求,本次电子数字时钟实验,通过两个模 60 计数器及一个模 24 计数器级联既可以实现计时模块。多功能数字钟的主体部分 电路原理图
仿真图
封装图
五、心得体会
刚刚开始觉得做这个电子实验报告挺难的,因为对软件的不熟悉和对这个实验操作的也不熟悉,对着老师给的资料也做了很长时间,就是仿真的时候有些该注意的没有注意,导致仿真失败,但是后来还是自己慢慢拿的请教同学、老师哪里出了问题,后来才做出来了,把60进制的做出来了,后来的24进制按照老师给的电路原理图也成功了仿真出来,我用了很长时间才编写出来,现在看看,也没有那么难了。同时请教老师,和同学、通过实验掌握一些逻辑组合器件的基本功能和用法。总之,我很感谢这次实验可以给我这样的机会,这个实验给了我很对的收获,我相信这会对我以后的学习很有帮助。
第三篇:eda 实现多功能数字钟
一、标题:EDA实现多功能数字钟
二、任务书:设计要求是用FPGA器件和EDA技术实现多功能数字钟的设计,⑴ 控制功能包括①以数字形式显示时、分、秒的时间;②小时计数器为24进制;③分、秒计数器为60进制;④有两个使能端起到校时、校分的作用,同时按无效;⑤每小时的59分51、53、55、57、59分别以四长声一短声进行模拟电台仿真;⑥让信号灯在晚上19点至早上5点亮;⑵ 在Max+plusⅡ软件系统平台上建立多功能数字钟电路的顶层电路文件并完成编译和仿真,并对器件进行下载检查。
三、关键词:数字钟 原理电路 编译 仿真 下载
四、数字钟电路系统的组成框图:
五、各功能模块设计、仿真波形及其分析说明:
1、小时计时模块:
仿真波形:
分析说明:
当小时的高四位为0、1时,小时的低四位为九时,在下一个时钟的上跳延来了之后,高四位加一;当小时的高四位为2,同时低四位为3时,小时的高低四位都清零。实现从00到23的循环计数。
2、分钟计时模块:
仿真波形:
分析说明:
当分钟的高四位为0、1、2、3、4时,小时的低四位为九时,在下一个时钟的上跳延来了之后,高四位加一;当分钟的高四位为5时,同时低四位为9时,分钟的高低四位都清零,实现从00到59的循环计数。
3、秒计时模块(与分计时模块相同);
4、校时、校分模块:
仿真波形:
分析说明:
SWM、SWH两开关先设置1,秒时钟,分时钟,小时时钟分别设置为不同频率的时钟,当开关SWM置0即按下时,秒时钟CPS对分钟进行校对,即如图所示CPM在SWM为0时频率与CPS相同;同理,当SWH为0时用秒时钟对小时进行校对,即CPH在SWH为0时频率与CPS相同。当SWM、SWH都不为0时,分钟、小时正常计时。
5、整点报时模块:
仿真波形:
分析说明:
为实现时钟在59分51秒53秒55秒57秒时,以低音报时,当为59分59秒时以高音报时;所以将M[7..0]从高位到低位设置为0101 1001转换成十进制即为59分,秒的十位都为5所以S7到S4设置为0101,秒的个位1、3、5、7、9,即0001、0011、0101、0111、1001,从S3到S0只有当S3设置为1的时候秒个位为9,通过分频以1000HZ输出以实现高音报时;1、3、5、7时S0都为0,为能同时确定1、3、5、7则将S0设置为0,S1、S2则为任意。如波形所示,S3取一段设置为1时,输出FU变为1000HZ的高频报时,其余状态一致为500HZ低频报时,从而实现预期情况。
6、时段控制模块:
仿真波形:
分析说明:
从19点到凌晨5点(含5点),灯亮,即完成时段控制。
六、顶层逻辑电路图、仿真波形及分析结论:
建立一个顶层文件如图:
仿真波形如下:
分析结论:
经仿真波形分析①走时正常;②能〝校时〞〝校分〞;③整点报时;④时段控制到位。功能完全符合设计要求,可以下载。
七、定义芯片管脚号(列表示意)及下载过程:
1、由于提供的实验箱的七段显示器是扫描形式工作,需要进行译码以及选择扫描,需添加模块:
该模块有三部分组成,包括一个8进制计数器,一个3-8数据选择器及七段显示译码器:
将该模块连入最后的顶层文件中,即可进行下载工作。
2、按键扫描模块:由于试验箱提供的按键系统为4*4扫描矩阵,需将横向或纵向按键设置0或1,该模块只需要在顶层文件中接4个output出来接地,如图:
3、分配输入、输出信号在器件上的引脚号:
4、引脚分配表:
5、对器件进行下载:
选MAX+plus II/Programmer,弹出编程对话框,如图:
检查编程文件名和器件,正确,接上硬件后,点击器件编程。即完成下载。
八、课程设计中遇到问题及解决方法
Q1:下载后,秒钟不进位
A:检查原理电路发现输入输出接错位,经更正正常; Q2:到59分51秒等不闹钟
A:检查蜂鸣器是否接错管脚,下载器上套线是否接好,最后发现是套线的问题,解决后,正常鸣叫。
九、课程设计项目最终结论
通过各模块级联最后成功下载,实现了两个使能对分秒校时,整点仿电台报时以及时段控制的多功能数字钟。
十、心得体会:
实验过程中最然遇到了很多困难,从画图到理解电路图,还有接触没有接触过的下载,把纸上的东西用到了硬件中,质的改变。看到成功的数字钟,很有成就感。好像听到的蜂鸣声是从未听到过的美妙乐曲。课设给我们指引了又一工作方向,培养对这些的兴趣,对以后工作应该很有帮助,所以坚定了我课后还要多看书多学习这方面知识的信念。
十一、参阅教材及文献:
《电子线路实验设计仿真讲义》
按钮,直接对
第四篇:EDA数字钟课程设计
课 程 设 计 报 告
设计题目:用VHDL语言实现数字钟的设计
班 级:电子1002班 学 号:20102625 姓 名:于晓 指导教师:李世平、李宁 设计时间:2012年12月
摘要
数字钟是一种用数字电路技术实现时、分、秒计时的钟表。本设计主要是实现数字钟的功能,程序用VHDL语言编写,整体采用TOP-TO-DOWN设计思路,具有基本的显示年月日时分秒和星期的功能,此外还有整点报时功能。该数字钟的实现程序分为顶层模块、年月模块、日模块、时分秒定时模块、数码管显示模块、分频模块、星期模块,此外还有一个库。该程序主要是用了元件例化的方法,此外还有进程等重要语句。
没有脉冲时,显示时分秒,set按钮产生第一个脉冲时,显示年月日,第2个脉冲到来时可预置年份,第3个脉冲到来时可预置月份,依次第4、5、6、7、8个脉冲到来时分别可预置日期、时、分、秒、星期,第 9个脉冲到来时设置星期后预置结束,正常工作,显示的是时分秒和星期。调整设置通过Up来控制,UP为高电平,upclk有脉冲到达时,预置位加1,否则减1。当整点到达时,报时器会鸣响,然后手动按键停止报时。
关键词:数字钟,VHDL,元件例化,数码管
1、课程设计目的
掌握利用可编程逻辑器件和EDA设计工具进行电子系统设计的方法
2、课程设计内容及要求
设计实现一个具有带预置数的数字钟,具有显示年月日时分秒的功能。用6个数码管显示时分秒,set按钮产生第一个脉冲时,显示切换年月日,第2个脉冲到来时可预置年份,第3个脉冲到来时可预置月份,依次第4、5、6、7个脉冲到来时分别可预置日期、时、分、秒,第 8个脉冲到来后预置结束,正常工作,显示的是时分秒。Up为高电平时,upclk有脉冲到达时,预置位加1.否则减1,还可以在此基础上增加其它功能。
3、VHDL程序设计
3.1整体设计思路
本设计采用top-down 模式设计,分模块进行,各功能都使用元件例化方式设计,主要有LED显示模块、时分秒定时模块、日期模块、年月模块、分频模块、星期模块,此外还创建了一个程序包,用来实现年月日、时分秒的加减调整。主要运用了过程语句、元件例化语句、信号赋值语句、和顺序语句
图3-1-1 整体结构图
图3-1-2 顶层模块引脚图
3.2各模块设计思路
3.2.1 普通计数器(时、分、秒、月、年计数器)设计
时钟模块通过调用程序包的时分秒加减过程语句实现两个六十进制,一个二十四进制,秒的进位信号作为分的计数时钟信号,分的进位信号作为时的时钟信号。时的进位信号通过管脚映射到日期模块的计数时钟信号。
定时功能在时分秒模块中,是由分计数器在到达59时产生一个脉冲,让speaker产生高电位鸣响。
年月模块主要实现月份的十二进制计数器,和100进制的年份计数器。月份的计数信号由日期模块的进位信号传递过来,年份的时钟信号由月份的进位信号产生。
图3-2-1 时分秒引脚图 图3-2-2 年月引脚图 3.2.2 可变进制计数器(天计数器)模块设计
不同月中的天的数量是不同的,例如“大月”就有31“天”,“小月”有30“天”,平年“二月”有28“天”,而闰年“二月”有29“天”。所以天计数器应该具备进制可变的性能。日期模块主要分为三个部分,预置日期加,预置日期减和产生进位信号,使月份增加。平闰年的判断是通过年月模块传输过来年份信号(两个4位的BCD码),如果高位的信号为“xxx0”且低位的信号为“xx00”(如20,84等),或高位为“xxx1”且低位为“xx10”(如32等)则判断为闰年。这种方法的包含了一百年中的所有闰年的情况。然后判断大月小月可以判断月份来确定30进制还是31进制。进位信号也是分为大月、小月、平年闰年来确定是否产生。
图3-2-3 日模块引脚图
3.2.3 LED显示模块
主要通过接受setpin的控制信号来选择显示的内容,把不同的信号赋给输出的端口,从而实现时分秒,年月日的切换。3.2.4 星期模块
通过七进制计数器实现,同时带有预置的功能,不能同年月调整联动,但是能单独调整。
图3-2-4 星期模块引脚图
4、仿真与分析
4.1 日模块
4.1.1 年份为2000年,月份为2月,有29天,初值设为2000年2月28日,仿真中日为:28、29、1、2、„
4.1.2 年份为1999年,月份为2月,有28天,初值设为1999年2月28日,仿真中日为:28、1、2、„
4.1.3 年份为2000年,月份为3月,有31天,初值设为2000年3月30日,仿真中日为:30、31、1、2、„
4.1.4 年份为2000年,月份为4月,有30天,初值设为2000年4月30日,仿真中日为:30、1、2、„
4.2 年月模块
初值设为1999年12月,lock为1时,显示年月,lock为3时,预置月,lock为2时,预置年
4.3 时分秒定时模块
lock为0时,显示时分秒,lock为5时,预置时,lock为6时,预置分,lock为7时,预置秒。当分到达59时,整点报时器响,speaker高电位,随着手动清零,恢复原位。
4.4 星期模块
初值设为星期1,仿真中显示为:1、2、3、4、5、6、7、1、„
4.5 分频模块
4.6 顶层设计模块
5、课程设计总结
本次课程设计历时两天半,经过自己不断的努力完成了数字钟的设计,程序代码的编写调试及仿真。以前只是看书或者编一些很小的程序用来仿真,觉得没怎么难,但当进行此次课程设计真正处理一个较大程序时,问题便都显现出来。虽然在这个过程中遇到了很多的问题,但是最终都得到了很好的解决。
我此次设计的程序是在课本原有数字钟程序的基础上进行添加更改得来的,最初在运行原有程序时很顺利,但是随着加的东西越来越多,程序中出现的问题也就越来越多。很多同学都觉得在已有程序上再添加东西看似简单,实则很容易混乱,理不清头绪,而且这个原有程序是用进程所写,比较麻烦。虽然这样容易出现问题,不过我觉得这是一个锻炼的好机会。、在处理分频模块时,最开始按照老师的要求设置了频率,但是当运行时,发现根本出不来,后来与同学讨论后,发现频率过大,后来改为八分频,使得分频
模块能够使用。在一开始加星期模块时,没怎么考虑,可是当加进去后才发现,星期模块不能与其他模块很好的相连,不能很好的做到与“日模块”相合,后来虽有改动,但最终没能改成功。在加定时器功能时,一开始单独为定时器列了一个模块,所写的程序也很复杂,错误百出,最后程序改好后,仿真却出不来。后来经过同学的提点,就把程序改简单了,单纯的来个脉冲就出现高电平,但后来仿真发现高电平一直在高位,没法给脉冲,最后没办法便手动脉冲。与顶层模块连接后,又发现分满59的脉冲没给,因为我的时分秒全都放在了一起,只能将定时模块挪到时分秒模块中,这样反而使得整个工程简单了一些。
在各个模块都能仿真成功后,顶层模块的程序与仿真却出现了很多问题。首先是顶层模块程序有很多警告,例如“second_waver”没有用到之类的,后来在改动的过程中,便把内变量换为了外变量,但是有些原来的警告没有了,但是新的警告又出现了,原本能够连好的U3与U4 模块均不能正常连接,后来与同学自习查找,才终于将错误找出,由于粗心大意误动了一些元件例化时的变量,使得时间拜拜浪费。最后在仿真的时候,仿真结果出不来,经过与同学商量在每个程序中都给年月日等变量均付了初值,才让仿真出来。
此次课程设计虽然只有短短的两天半的时间,但是经过前期的查找资料,后来的实验室实际操作,再到现在的报告总结,我收获了很多。其实完成一个设计,编程只是很小的一部分,最主要的在于查找资料以及调试程序,此次设计我在查找资料方面做的不是很充分,以至于设计的面很小,而且在遇到问题后不能很快的找出,以后一定要做好准备工作。此次课程设计中遇到的问题看似不大,但都是很好的问题,对我以后的设计有很大的帮助,一定会牢牢记住。
最后,此次课程设计的完成很大程度上取决于老师和同学对我的指导与帮助,这更能说明,一个较大设计的完成及实现,不是仅限于自身,我们要学会与别人交流沟通,才能做到更好。
6、参考文献
[1]李景华,杜玉远.可编程逻辑器件与EDA技术.沈阳:东北大学出版社,2000 [2] 姜如东,VHDL语言程序设计及应用,北京邮电大学出版社
[3] 康华光.电子技术基础(数字部分)[M].北 京:高等教育出版社,2001.
[4] [5]
第五篇:多功能数字钟课程设计
多功能数字钟
朱安烟
(安阳师范学院 物电学院, 河南 安阳 455002)
摘要:时钟相比具有更高的准确性和直观性
因此得到了更加广泛的使用。数字钟从原理上讲是一种典型的数字电路,其中
本设计采用六位LED
24小时计时方式根据数码管动态显示原理来进行显示。用晶振产生振荡脉加以分频得到所需的钟表秒脉冲,利用纯数字电路,实现数字电子时钟功能,时间重置功能。此次数字钟的理图设计,PCB图的制作主要是基于altium designer软件,利用proteus7.7软件进行仿真,最终本设计实现24小时的时钟计时、时间重置功能。
关键词:LED数码管
时序电路
逻辑电路
时钟
校时引言
仅向。方案论证:
2.1方案一
由于是数字钟的设计,可以用单片机AT89C51来实现计数功能,相对于纯数字电路来讲它具有功耗低、体积小、使用方便等优点。但在大二下半学期初期,对单片机方面的内容知识还不够完善,加上用单片机为核心来做数字钟还需做编程,对自身来说又是一难点。不过此法可以待以后,学习知识完善后再考虑。
2.2 方案二
继而考虑到用原先学过的纯数字电路来做,以74Ls160来做为计数的芯片,用六片分别实现 数字钟的小时、分、秒、的计数,并用晶振加以分频产生数字钟所需的秒脉冲。
从以上两种方案,很容易看出,采用方案二,用此法做即可以复习回顾早期学习的数电模电知识,又避免了单片机知识不足的问题,故用此法。结果与讨论
3.1.1数字钟主要计数芯片为74ls160其引脚图如下:
这种同步可预置十进计数器是由四个D型触发器和若干个门电路构成,内部有超前进位,具有计数、置数、禁止、直接(异步)清零等功能。对所有触发器同时加上时钟,使得当计数使能输入和内部门发出指令时输出变化彼此协调一致而实现同步工作。这种工作方式消除了非同步(脉冲时钟)计数器中常有的输出计数尖峰。缓冲时钟输入将在时钟输入上升沿触发四个触发器。这种计数器是可全编程的,即输出可预置到任何电平。当预置是同步时,在置数输入上将建立一低电平,禁止计数,并在下一个时钟之后不管使能输入是何电平,输出都与建立数据一致。清除是异步的(直接清零),不管时钟输入、置数输入、使能输入为何电平,清除输入端的低电平把所有四个触发器的输出直接置为低电平。超前进位电路无须另加门,即可级联出n位同步应用的计数器。它是借助于两个计数使能输入和一个动态进位输出来实现的。两个计数使能输入(ENP和ENT)计数时必须是高电平,且输入ENT必须正反馈,以便使能动态进位输出。因而被使能的动态进位输出将产生一个高电平输出脉冲,其宽度近似等于QA输出高电平。此高电平溢出进位脉冲可用来使能其后的各个串联级。使能ENP和ENT输入的跳变不受时钟输入的影响。电路有全独立的时钟电路。改变工作模式的控制输入(使能ENP、ENT或清零)纵使发生变化,直到时钟发生为止,都没有什么影响。计数器的功能(不管使能、不使能、置数或计数)完全由稳态建立时间和保持时间所要求的条件来决定。
管脚说明: CLR:清零复位端
当输入为低电平时有效
CLK:时钟信号接收端
A~D:读入
QA~QD:输出
ENT、ENP置一时芯片正常工作
LOAD:置数端
RCO:信号输出端
GND:接地
Vcc:接高
工作方式:
3.1.2 7段LED数码管
3.1.3 32.768KHZ晶振
32.768KHZ是一个标准的频率,晶振频率的应用主要有以下几个方面的参数:尺寸、负载电容、频率偏差、应用范围。按尺寸外形来分主要分为插件和贴片的;插件的主要有2*
6、3*
8、49s 等,贴片的就有很多种了,跟据各公司的设计可的型号有很多,例如:日本KDS晶振就有49SMD、DST310S、SM—14J、DST520、DST410S等。
3.1.4 CD4060分频器
CD4060由一振荡器和14级二进制串行计数器位组成,振荡器的结构可以是RC或晶振电路,CR为高电平时,计数器清零且振荡器使用无效。所有的计数器位均为主从触发器。在CP1(和CP0)的下降沿计数器以二进制进行计数。在时钟脉冲线上使用斯密特触发器对时钟上升和下降时间无限制 引脚功能:
/CP1:时钟输入端
/CP0:时钟输出端
/CP0:反相时钟输出端
Q4~Q10,Q12~Q14:计数器输出端
/Q14:第14级计数器反相输出端
VDD:电源正
VSS:电源负
CR:清零端 3.1.5 74ls48
功能介绍:
74LS48除了有实现7段显示译码器基本功能的输入(DCBA)和输出(Ya~Yg)端外,7448还引入了灯测试输入端(LT)和动态灭零输入端(RBI),以及既有输入功能又有输出功能的消隐输入/动态灭零输出(BI/RBO)端。
由7448真值表可获知7448所具有的逻辑功能:
(1)7段译码功能(LT=1,RBI=1)
在灯测试输入端(LT)和动态灭零输入端(RBI)都接无效电平时,输入DCBA经7448译码,输出高电平有效的7段字符显示器的驱动信号,显示相应字符。除DCBA = 0000外,RBI也可以接低电平,见表1中1~16行。
(2)消隐功能(BI=0)
此时BI/RBO端作为输入端,该端输入低电平信号时,表1倒数第3行,无论LT 和RBI输入什么电平信号,不管输入DCBA为什么状态,输出全为“0”,7段显示器熄灭。该功能主要用于多显示器的动态显示。
(3)灯测试功能(LT = 0)
此时BI/RBO端作为输出端,端输入低电平信号时,表1最后一行,与 及DCBA输入无关,输出全为“1”,显示器7个字段都点亮。该功能用于7段显示器测试,判别是否有损坏的字段。
(4)动态灭零功能(LT=1,RBI=1)
此时BI/RBO端也作为输出端,LT 端输入高电平信号,RBI 端输入低电平信号,若此时DCBA = 0000,表1倒数第2行,输出全为“0”,显示器熄灭,不显示这个零。DCBA≠0,则对显示无影响。该功能主要用于多个7段显示器同时显示时熄灭高位的零。
3.2 原理设计
整体电路设计方案:
3.2.1 振荡电路设计
振荡电路由振荡器产生的脉冲,振荡器是数字钟的核心。振荡器的稳定度及频率的精度决定了数字钟的精确程度,次处有555定时器和晶振两种产生秒脉冲的方法:555振荡器做振荡源一般用于精确度要求不高的场合,由门电路组成的多谐振荡器的振荡周期不仅与时间常数RC有关,而且还取决于门电路的阈值电压VTH,由于VTH容易受到温度、电源电压及干扰的影响,因此频率稳定性较差,只能用于对频率稳定性要求不高的场合。考虑到振荡频率的精确度与稳定性固采用晶振做为振荡源来实现振荡电路,得时钟脉冲更稳定,时间走的更准37.268KHz晶振 通过cd4060分频器进行十四分频得到0.5s的脉冲信号,再进行一个SN74LS74进行二分频得到所需的秒脉冲信号:
3.2.2 校时电路设计
根据电路设计所知需要在分处和小时处需要校时,分别在分和时个位向十位进位处各加一开关,另一端接地并且在与地之间接100pf电容为防止按键抖动。
电路设计如下:
当开关处于自然位置时分十位clk端所接为高电平,当开关按下时则引入一低电平实其clk端有一个下降沿脉冲接入,使其产生了校时功能。
3.2.3显示电路设计
显示电路是用74ls48驱动七段共阴数码管来作为时钟显示器。
电路设计如下:
3.2.4 计时电路设计
数字钟的秒和分位都是从0到60循环计数的,所以可以用用异步清零法设计60进制计数器作为秒和分的计数器。用异步置数法设计小时所用的24进制计数器。秒、分位设计电路如下:
3.3 程序调试过程
在板子焊接好以后通上5V电源发现六Led灯只有三个能完整亮出来,其余的都不亮或是亮的不全,而且秒位不走,校时按键不管用。问题很多。
开始调试:
1、首先调试的是秒位为何不走,先测晶振石否起振,测量后发现晶振正常起振,然后从74ls160的clk端用示波器测试一下没有脉冲信号输入,则找74ls74的输出口也无脉冲,以次往前推,最后测量出从74ls74输入端有正确的脉冲输入,输出端却无脉冲输出。观察后没有连接错误,故用万用表测vcc.end端都有正确的电平接入,再测量两点间是否有漏焊现象,最后测出一处漏焊点使D端与Q端没有接通。重新焊接后秒位正常计时。
2、秒位正常计时,但向秒的十位进位时总是显示从8到19,查阅资料可知,在第一个160芯片到第二个160芯片中缺一个非门,充当延时作用,使个位计数到9再来一个脉冲下计数时再向前进位。加上非门进位正常了。
3、秒位向分位进位正常,但校时按键不能用,且分位向十分位不能进位,通过观察焊接对比原理图与pcb图后发现,开关接地的一端弄反了,应是开关与接电容端相侧对着的端接地。这个错误导致开关不能用,亦使分的十位端的74ls160芯片clk段一直接了地,故不能使其正常进位。修改过后则可以正常进位,且两开关都能用了。
4、显示小时位的第一个数码管一直不亮,通过测量发现led数码管没有烧坏,能正常工作,通过对比PCB图观察没有焊接错误,用万用表测量则发现驱动次led的74ls48管没有正常接地,连接跳线处有一虚焊,重新焊接后恢复正常。
5、但分向小时不能进位,由示波器观察发现74ls160芯片clk端无脉冲输入,但十分位有脉冲输出,且导线也导通了,就观察原理图发现原理图一处错误,分向时进位时是分满60向前进一个脉冲,故分的TC端不用再接到时的CLK端了。找到错误后用镊子将板上的铜线划段,则正常进位了。
6、小时进位正常但显示的不是24进制,显示的是44进制,则推测可能是跳线连接错误,将显示小时的十位 74ls160芯片接B端连接成接C端了,故使其显示44进制,通过观察、对比pcb图,最后发现果然如此。修改过后小时为正常24进制了。
7、最后一个数码管有三段老是不亮,观察连接没有错误,测量焊接也正常,最后用万用表测量发现芯片没有问题,那三段不亮的数码管烧了。
8、调试好后在后来的观察中发现从秒向分进位时有时一下进两位,自己找不出来原因。问过老师后,老师说是由于防抖电容所致。尝试着将电容先划断试了一下就没有那种情况了。但此时校时开关由于抖动缘故,按一下有时跳3、4个位,校时不稳定了。结论
此数字钟相对于机械钟来说有低功耗,高精度,数字化显示和不易损坏等特点。符合人们日常家居及办公对钟表的要求,可以作为家居、办公等用表。
参考文献
[1] 佘新平数学电子技术基础 华中科技大学出版社 2009年
[2] 许树玲 丁电宽 王晋 电子技术及实验 内蒙古大学出版社2005年
[3] 佘新平数字电路设计·仿真·测试 华中大学出版社 2010年
附图: 电路原理图: