1、 东 北 石 油 大 学 课 程 设 计 课 程 EDA技术课程设计 题 目 闹钟系统的设计 院 系 电子科学学院 专业班级 电子信息工程 学生姓名 王琢 学生学号 080901140203 指导教师 2011
2、年 3 月11日 东北石油大学课程设计任务书 课程 EDA技术课程设计 题目 闹钟系统的设计 专业 电子信息工程 姓名 王琢 学号 080901140203 主要内容、基本要求、主要参考资料等 主要内容: 设计并制作一个带闹钟功能的24小时计时器。它包括以下几个组成部分: 1、显示屏,由4 个七段数码管组成,用于显示当前时间(时:分)或设置的闹钟时间; 2、数字键,实现‘0’—‘9’的输入,用于输入新的时间或新的闹钟时间; 3、TIME(时间)键,用于确定新的时间设置; 4、ALARM(闹钟)键,用于确定新的闹钟时间设置,或显
3、示已设置的闹钟时间; 5、扬声器,在当前时钟时间与闹钟时间相同时,发出蜂鸣声 基本要求: 1、计时功能:这是本计时器设计的基本功能,每隔一分钟计时一次,并在显示屏上显示当前时间。 2、闹钟功能:如果当前时间与设置的闹钟时间相同,则扬声器发出蜂鸣声。 3、设置新的计时器时间:用户用数字键输入新的时间,然后按"TIME"键确认。在输入过程中,输入数字在显示屏上从右到左依次显示。例如,用户要设置新的时间12:34,则按顺序输入“1”,“2”,“3”,“4”,与之对应,显示屏上依次显示的信息为:“1”,“12”,“123”,“1234"。如果用户在输入任意几个数字后较长时间内,例如5 s,没
4、有按任何键,则计时器恢复到正常的计时显示状态。 主要参考资料: [1] 潘松著.EDA技术实用教程(第二版). 北京:科学出版社,2005. [2] 康华光主编.电子技术基础 模拟部分. 北京:高教出版社,2006. [3] 阎石主编.数字电子技术基础. 北京:高教出版社,2003. 完成期限 2011.3.11 指导教师 专业负责人 2011年 3月7日 一、总体设计思想 1.基本原理 数字闹钟电路的基本结构由两个60进制计数器和一个24进制计数器组成,分别对秒、分
5、小时进行计时,当计时到23时59分59秒时,再来一个计数脉冲,则计数器清零,重新开始计时。秒计数器的计数时钟CLK为1Hz的标准信号。当数字闹钟处于计时状态时,秒计数器的进位输出信号作为分钟计数器的计数信号,分钟计数器的进位输出信号又作为小时计数器的计数信号时、分、秒的计时结果通过6个数码管来动态显示。因此,通过模式选择信号KEY1、KEY2控制数字钟的工作状态,即控制数字钟,使其分别工作于正常计时,调整分、时和设定闹钟分、时5个状态。当数字闹钟处于计时状态时,3个计数器允许计数,且秒、分、时计数器的计数时钟信号分别为CLK,秒的进位, 分的进位;当数字闹钟处于调整时间状态时,被调的分或时会
6、一秒一秒地增加;当数字钟处于闹钟定时状态时,可以设定小时和分;当计时到所设定的时刻时,驱动扬声器,持续1分钟。 2.设计框图 设定按键 时钟1Hz 按键UpDN 时钟10Hz 功能切换寄存器 闹钟设定寄存器 闹铃控制电路 模式切换数据选择 扫描技术字符译码 扫描时钟320Hz 数码显示 蜂鸣器 时钟计数寄存器
7、 二、设计步骤和调试过程 1、总体设计电路 根据设计要求及端口设置,需要五个状态来实现: S0:表示电路初态即正常时钟计数状态,完成前面设计功能 (1) 的工作。 S1:接收键盘输入状态.在状态S0时用户按下数字键后进入此状态.在此状态下,显示屏上显示的是用户键入的数字。 S2:设置新的闹钟时间.在状态S1时用户按下ALARM键后进入此状态。 S3:设置新的计时器时间.在状态S1时用户按下TIME键后进入此状态。 S4:显示闹钟时间.在状态S0时用户直接按下ALARM键后进入此状态。 在此状态下,显示屏上显示的是所设置的闹钟时间.注意:在此状
8、态下,用户按下ALARM键后,显示屏上保持显示闹钟时间,经过一段时间以后,再返回状态S0。 设计基本思想: (1) CLK为外部时钟信号,RESET为复位信号. (2) 当KEY为高电平(KEY= '1')时,表示用户按下数字键("0"~"9"). (3) 当ALARM_BUTTON为高电平时,表示用户按下"ALARM"键. (4) 当TIME_BUTTON为高电平时,表示用户按下"TIME"键. (5) 当LOAD_NEW_A为高电平时,控制(闹钟时间寄存器)加载新闹钟时间值. (6) 当LOAD_NEW_C为高电平时,控制(时钟计数器)
9、设置新的时间值. (7) 当SHOW_NEW_TIME为高电平时,控制(七段数码显示电路)显示新的时间值,即用户通过数字键输入的时间;否则,当SHOW_NEW_TIME为低电平时,根据 SHOW_A信号的值控制显示当前时间或闹钟时间. 2、模块设计和相应模块程序 (1)顶层文件: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY clock IS PORT ( CLK12MHZ : IN STD_LOGIC; CLK8HZ : IN STD_LOGI
10、C; SPKOUT : OUT STD_LOGIC; CLK : IN STD_LOGIC; KEY1 : IN STD_LOGIC; KEY2 : IN STD_LOGIC_VECTOR(1 DOWNTO 0); H1,H2,M1,M2,S1,S2: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END; ARCHITECTURE one OF clock IS COMPONENT
11、 shizhong PORT (clk : in std_logic; md1 : in std_logic; md2 : in std_logic_vector(1 downto 0); clken : out std_logic; h1,h2,m1,m2,s1,s2: out std_logic_vector(3 downto 0)); END COMPONENT; COMPONENT NoteTabs PORT ( clk : IN
12、STD_LOGIC; ToneIndex : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ); END COMPONENT; COMPONENT ToneTaba PORT ( Index : IN STD_LOGIC_VECTOR (3 DOWNTO 0) ; Tone : OUT STD_LOGIC_VECTOR (10 DOWNTO 0); en : in std_logic); END COMPONENT; COMPONENT
13、 Speakera PORT ( clk : IN STD_LOGIC; Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0); SpkS : OUT STD_LOGIC ); END COMPONENT; SIGNAL Tone :STD_LOGIC_VECTOR (10 DOWNTO 0); SIGNAL ToneIndex :STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL clken :STD_LO
14、GIC; SIGNAL en :STD_LOGIC; BEGIN u1 : Shizhong PORT MAP (clk=>CLK,md1=>KEY1,md2=>KEY2,clken=>en, h1=>h1,h2=>h2,m1=>m1,m2=>m2,s1=>s1,s2=>s2); u2 : NoteTabs PORT MAP (clk=>CLK8HZ, ToneIndex=>ToneIndex); u3 : ToneTaba PORT MAP (Index=>ToneIndex,Tone=>Tone,en=>en); u4 : Speakera
15、PORT MAP (clk=>CLK12MHZ,Tone=>Tone, SpkS=>SPKOUT ); END; (2)时钟控制模块: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity shizhong is port( clk: in std_logic; md1:in std_logic; md2:in std_logic_vector(1 downto 0); clken:out std_logic;
16、 h1,h2,m1,m2,s1,s2:out std_logic_vector(3 downto 0)); end shizhong; architecture one of shizhong is signal hou1:std_logic_vector(3 downto 0); signal hou2:std_logic_vector(3 downto 0); signal min1:std_logic_vector(3 downto 0); signal min2:std_logic_vector(3 downto 0); signal seth1:std_
17、logic_vector(3 downto 0); signal seth2:std_logic_vector(3 downto 0); signal setm1:std_logic_vector(3 downto 0); signal setm2:std_logic_vector(3 downto 0); signal sec1:std_logic_vector(3 downto 0); signal sec2:std_logic_vector(3 downto 0); begin -----------------------------------------------小
18、时十位 h110:process(clk,hou2,min1,min2,sec1,sec2,md1,md2) begin if clk'event and clk='1' then if (hou1="0010" and hou2="0011")and(min1="0101" and min2="1001") and (sec1="0101" and sec2="1001") then hou1<="0000"; elsif hou1="0010"and hou2="0011"and md1='0' and md2="01" then--当时间为23点且处于校时状
19、态时 hou1<="0000"; elsif (hou2="1001"and(min1="0101" and min2="1001") and (sec1="0101" and sec2="1001"))or (hou2="1001"and md1='0' and md2="01") then hou1<=hou1+1; end if; end if; end process h110; -----------------------------------------------小时个位 h220:process(clk,min1,min2,sec1,sec2,md1
20、md2,hou1) begin if clk'event and clk='1' then if (hou1="0010" and hou2="0011")and(min1="0101" and min2="1001") and (sec1="0101" and sec2="1001") then hou2<="0000"; elsif hou2="1001"and(min1="0101" and min2="1001") and (sec1="0101" and sec2="1001") then hou2<="0000"; elsif (hou2="1001
21、"and md1='0' and md2="01") or (hou1="0010"and hou2="0011") then hou2<="0000";--md<='1';-- elsif ((min1="0101" and min2="1001") and (sec1="0101" and sec2="1001")) or (md1='0' and md2="01") then hou2<=hou2+1;--speak<=clk;-- end if; end if; end process h220; -----------------------------------
22、分钟十位 m110:process(clk,min2,sec1,sec2,md1,md2) begin if clk'event and clk='1' then if (min1="0101" and min2="1001") and (sec1="0101" and sec2="1001") then min1<="0000"; elsif min1="0101"and min2="1001"and (md1='0' and md2="00")then min1<="0000"; elsif (min2="1001"and (sec1="010
23、1" and sec2="1001")) or (min2="1001"and md1='0' and md2="00")then min1<=min1+1; end if; end if;--end if; end process m110; ----------------------------------------------分钟个位 m220:process(clk,sec1,sec2,md1,md2) begin if clk'event and clk='1' then if min2="1001"and (sec1="0101" and sec2="
24、1001")then min2<="0000"; elsif min2="1001"and (md1='0' and md2="00")then min2<="0000"; else if (sec1="0101" and sec2="1001") or(md1='0' and md2="00")then min2<=min2+1; end if; end if;end if; end process m220; ---------------------------------------------秒十位 s110:process(clk) begin
25、if clk'event and clk='1' then if (sec1="0101" and sec2="1001")then sec1<="0000"; else if sec2="1001"then sec1<=sec1+1; end if; end if;end if; end process s110; --------------------------------------------秒个位 s220:process(clk) begin if clk'event and clk='1' then if sec2="1001" then sec
26、2<="0000"; else sec2<=sec2+1; end if; end if; end process s220; -------------------------------------------时间设置小时部分 sethour1:process(clk,seth2) begin if clk'event and clk='1' then if seth1="0010"and seth2="0011" then seth1<="0000"; elsif seth2="1001" then seth1<=seth1+1; end if;
27、end if; end process sethour1; sethour2:process(clk,md1,md2,seth1) begin if clk'event and clk='1' then if (seth1="0010"and seth2="0011")or seth2="1001"then seth2<="0000"; elsif md1='1' and md2="00" then seth2<=seth2+1; end if; end if; end process sethour2; --------------------------------
28、时间设置分钟部分 setmin1:process(clk,setm2) begin if clk'event and clk='1' then if setm1="0101"and setm2="1001"then setm1<="0000"; elsif setm2="1001"then setm1<=setm1+1; end if; end if; end process setmin1; setmin2:process(clk,md1,md2) begin if clk'event and clk='1'then if setm2="
29、1001"then setm2<="0000"; elsif md1='1' and md2="01"then setm2<=setm2+1; end if; end if; end process setmin2; --------------------------------------------闹铃 speaker:process(clk,hou1,hou2,min1,min2) begin if clk'event and clk='1'then if seth1=hou1 and seth2=hou2 and setm1=min1 and setm2=min
30、2 then clken<='1'; else clken<='0'; end if; end if; end process speaker; disp:process(md1,hou1,hou2,min1,min2,sec1,sec2,seth1,seth2,setm1,setm2) begin if md1='0' then---------------计时时间显示和设置模式 h1<=hou1;h2<=hou2; m1<=min1;m2<=min2; s1<=sec1;s2<=sec2; else -----------闹铃
31、时间现实和设置模式 h1<=seth1;h2<=seth2; m1<=setm1;m2<=setm2; s1<="1111";s2<="1111"; end if; end process disp; end one; (3)乐曲演奏模块: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY Speakera IS PORT ( clk : IN STD_LOGIC; Tone : IN STD_LOGIC
32、VECTOR (10 DOWNTO 0); SpkS : OUT STD_LOGIC ); END; ARCHITECTURE one OF Speakera IS SIGNAL PreCLK, FullSpkS : STD_LOGIC; BEGIN DivideCLK : PROCESS(clk) VARIABLE Count4 : STD_LOGIC_VECTOR (3 DOWNTO 0) ; BEGIN PreCLK <= '0'; -- 将CLK进行16分频,PreCLK为CLK的16
33、分频 IF Count4>11 THEN PreCLK <= '1'; Count4 := "0000"; ELSIF clk'EVENT AND clk = '1' THEN Count4 := Count4 + 1; END IF; END PROCESS; GenSpkS : PROCESS(PreCLK, Tone)-- 11位可预置计数器 VARIABLE Count11 : STD_LOGIC_VECTOR (10 DOWNTO 0); BEGIN IF P
34、reCLK'EVENT AND PreCLK = '1' THEN IF Count11 = 16#7FF# THEN Count11 := Tone ; FullSpkS <= '1'; ELSE Count11 := Count11 + 1; FullSpkS <= '0'; END IF; END IF; END PROCESS; DelaySpkS : PROCESS(FullSpkS)--将输出再2分频,展宽脉冲,使扬声器有足够功率发音 VARIABLE Count2 : STD_LOGIC
35、 BEGIN IF FullSpkS'EVENT AND FullSpkS = '1' THEN Count2 := NOT Count2; IF Count2 = '1' THEN SpkS <= '1'; ELSE SpkS <= '0'; END IF; END IF; END PROCESS; END; LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY Not
36、eTabs IS PORT (clk : IN STD_LOGIC; ToneIndex : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ); END; ARCHITECTURE one OF NoteTabs IS COMPONENT MUSIC --音符数据ROM PORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock : IN STD_LOGIC ; q : OUT STD_LOGIC_VECTOR (
37、3 DOWNTO 0)); END COMPONENT; SIGNAL Counter : STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN CNT8 : PROCESS(clk,Counter) BEGIN IF Counter=138 THEN Counter <= "00000000"; ELSIF (clk'EVENT AND clk = '1') THEN Counter <= Counter+1; END IF; END PROCESS; u1 : MUSIC PORT
38、MAP(address=>Counter , q=>ToneIndex, inclock=>clk); END; LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY ToneTaba IS PORT ( Index : IN STD_LOGIC_VECTOR (3 DOWNTO 0) ; Tone : OUT STD_LOGIC_VECTOR (10 DOWNTO 0); en : IN STD_LOGIC); END; ARCHITECTURE one
39、OF ToneTaba IS BEGIN PROCESS(Index,en) BEGIN IF en='0' THEN Tone<="11111111111";--使能信号 ELSE CASE Index IS -- 译码电路,查表方式,控制音调的预置数 WHEN "0000" => Tone<="11111111111" ; WHEN "0001" => Tone<="01100000101" ; WHEN "0010" => Tone<="01110010000" ; WHEN "0011" => To
40、ne<="10000001100" ; WHEN "0101" => Tone<="10010101101" ; WHEN "0110" => Tone<="10100001010" ; WHEN "0111" => Tone<="10101011100" ; WHEN "1000" => Tone<="10110000010" ; WHEN "1001" => Tone<="10111001000" ; WHEN "1010" => Tone<="11000000110" ; WHEN "1100" => Tone<="1
41、1001010110" ; WHEN "1101" => Tone<="11010000100" ; WHEN "1111" => Tone<="11011000000" ; WHEN OTHERS => NULL; END CASE; END IF; END PROCESS; END; LIBRARY ieee; USE ieee.std_logic_1164.all; LIBRARY altera_mf; USE altera_mf.altera_mf_components.all; ENTITY music IS PORT
42、 address : IN STD_LOGIC_VECTOR (7 DOWNTO 0); inclock : IN STD_LOGIC ; q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0)); END music; ARCHITECTURE SYN OF music IS SIGNAL sub_wire0 : STD_LOGIC_VECTOR (3 DOWNTO 0); COMPONENT altsyncram GENERIC (intended_device_family : STRING; width_a : NA
43、TURAL; widthad_a : NATURAL; numwords_a : NATURAL; operation_mode : STRING; outdata_reg_a : STRING; address_aclr_a : STRING; outdata_aclr_a : STRING; width_byteena_a : NATURAL; init_file : STRING; lpm_hint : STRING; lpm_type : STRING); PORT ( clock0 : IN STD
44、LOGIC ; address_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0); q_a : OUT STD_LOGIC_VECTOR (3 DOWNTO 0)); END COMPONENT; BEGIN q <= sub_wire0(3 DOWNTO 0); altsyncram_component : altsyncram GENERIC MAP ( intended_device_family => "Cyclone", width_a => 4, widthad_a => 8, numword
45、s_a => 256, operation_mode => "ROM", outdata_reg_a => "UNREGISTERED", address_aclr_a => "NONE", outdata_aclr_a => "NONE", width_byteena_a => 1, init_file => "data1.mif", lpm_hint => "ENABLE_RUNTIME_MOD=YES, INSTANCE_NAME=rom2", lpm_type => "altsyncram") PORT MAP ( clock0 =>
46、 inclock, address_a => address, q_a => sub_wire0); END SYN; 3、仿真及仿真结果分析 本实验是以KEY2、KEY1为控制整个闹钟的校时,校分,校闹钟时、分,分别将KEY2[1],KEY2[0],KEY1,送到实验上的三个键,由这三个键来控制整个校时,校分,校闹钟时,校闹钟分的过程,加上分别连接的键叫A,B,C键, 则当A=0,B=1,C=0时是对时钟进行校时,时个位和时十位会以二十四进制循环自动增加。仿真波形: 仿真图1 当A=0,B=0,C=0时是对时钟进行校分,分个位和分十
47、位会以六十进制循环增加,并且不对时进位。仿真波形: 仿真图2 当A=0,B=1,C=1时是对闹钟进行校时,闹钟时个位和时十位会以二十四进制循环自动增加。仿真波形: 仿真图3 当A=0,B=0,C=1时是对闹钟进行校分,闹钟分个位和分十位会以六十进制循环增加,并且不对时进位。仿真波形: 仿真图4 而当A=1,B=0,C=0或者A=1,B=1,C=0是正常的计时时间,秒从零开始计时,每秒加一,当到达五十九在来一个脉冲后,秒十位和秒个位清零,从零开始直到六十一直循环,并且向分个位清零;分位的原理同秒的一样;而时与秒,分的不同之处是,当时计数到二十三时清零并且不向任何位进位。仿
48、真波形: 仿真图5 另外当计数的时,分和闹钟所事先设置时、分相等时,歌曲会响起,作为闹钟并且维持一分钟,一分钟歌曲自动停止。RTL图: 4、实验调试结果 为验证所设计程序是否正确,将程序下载进行硬件测试。在QuartusⅡ开发环境中进行管脚锁定,连接好数码管驱动电路,然后将目标文件下载到器件中。最终可以看到时、分、秒正常显示。引脚分配如下(选择模式5) 图6 三、结论及心得体会 经过一周的 EDA 设计, 我发现了很多问题是从课本上学不到的, 所以刚开始拿到设计课题是时候有些不知所措, 不过经过和同组人的 共同探讨和学习,我逐渐把握住了思路,并开始了设计。 总
49、的来讲,本次课程设计对于我来说有很大的意义。通过本次课 程设计,我有一种温故知新感觉。不仅对原有知识进行了巩固,还增 加了不少新的知识,即使在设计中并没有用到所有新的知识,但我学 会了,就是我的财富,今后我一定会好好加以利用。同时,我在以后 的学习生活当中一定会牢牢记住这次课程设计给我的经验和教训, 在 学习工作中更加努力和细心,学有所用才是硬道理 参考资料 [1] 潘松著.EDA技术实用教程(第二版). 北京:科学出版社,2005. [2] 康华光主编.电子技术基础 模拟部分. 北京:高教出版社,2006. [3] 阎石主编.数字电子技术基础. 北京:高教出版社,20
50、03. [4] 焦素敏.《EDA应用技术》 清华大学出版社,2002 [5] 高吉祥. 电子技术基础实验与课程设计 北京:电子工业出版社,2002. 东北石油大学课程设计成绩评价表 课程名称 EDA技术课程设计 题目名称 闹钟系统设计 学生姓名 学号 07 指导教师姓名 职称 序号 评价项目 指 标 满分 评分 1 工作量、工作态度和出勤率 按期圆满的完成了规定的任务,难易程度和工作量符合教学要求,工作努力,遵守纪律,出勤率高,工作作风严谨,善于与他人合作。 20 2 课程设计质量 课程设






