《检测与转换技术课程设计报告书.docx》由会员分享,可在线阅读,更多相关《检测与转换技术课程设计报告书.docx(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、摘 要人类社会已进入到高度兴盛的信息社会。信息化社会的进展离不开电子信息产品开发技术、产品品质的提高和进步。电子信息产品随着科学技术的进步, 其电子器件和设计方法更换代的速度日月异。实现这种进步的主要缘由就是电子设计技术和电子制造技术的进展,其核心就是电子设计自动化(EDA, Electronics Design Automation)技术,EDA 技术的进展和推广应用又极大地推动了电子信息产业的进展。为保证电子系统设计的速度和质量,适应“第一时间推出产品”的设计要求,EDA 技术正渐渐成为不行缺少的一项先进技术和重要工具。目前,在国内电子技术教学和产业界的技术推广中已形成“EDA 热”,完全
2、可以说,把握 EDA 技术是电子信息类专业学生、工程技术人员所必备的根本力气和技能。关键词:数字钟 EDA VHDL 语言数字时钟的设计实现设计试验一、设计目的1、娴熟地运用数字系统的设计方法进展数字系统设计;2、能进展较简洁的数字系统设计;3、按要求设计一个数字钟。二、设计内容2.1 设计任务及目标要求设计一个数字钟完,完成具体如下任务:(1) 能显示年、月、日、时、分、秒功能;(2) 具有日期和星期显示功能;(3) 具备闹钟功能及定点报时;(4) 具备调时、定时功能。三、系统方案及设计原理3.1 方案设计数字计时器根本功能是计时,因此首先需要获得具有准确振荡时间的脉振信号,以此作为计时电路
3、的时序根底,试验中可以使用的振荡频率源为 48MHZ, 通过分频获得所需脉冲频率1Hz,1KHz,2KHz。为产生秒位,设计一个模60 计数器,对 1HZ 的脉冲进展秒计数,产生秒位;为产生分位,通过秒位的进位产生分计数脉冲,分位也由模 60 计数器构成;为产生时位,用一个模 24 计数器对分位的进位脉冲进展计数。整个数字计时器的计数局部共包括六位:时十位、时个位、分十位、分个位、秒十位和秒个位。显示功能是通过数选器、译码器、码转换器和 7 段显示管实现的。由于试验中只用一个译码显示单元,7 个 7 段码6 个用于显示时分秒,一个显示星期,所以通过 4 个 7 选一 MUX 和一个 3-8 译
4、码器协作,依据计数器的信号进展数码管的动态显示。1清零功能是通过把握计数器清零端的电平凹凸来实现的。只需使清零开关按下时各计数器的清零端均牢靠接入有效电平本试验中是低电平,而清零开关断开时各清零端均接入无效电平即可。校分校时功能由防抖动开关、规律门电路实现。其根本原理是通过规律门电路把握分计数器的计数脉冲,当校分校时开关断开时,计数脉冲由低位计数器供给;当按下校分校时开校分校时功能由防抖动开关、规律门电路实现。其根本原理是通过规律门电路把握分计数器的计数脉冲,当校分校时开关断开时,计数脉冲由低位计数器供给;当按下校分校时开通时,既可以手动触发动身式开关给进位脉冲,也可以有恒定的 1Hz 脉冲供
5、给恒定的进位信号,计数器在此脉冲驱动下可快速计数。为实现牢靠调时,承受防抖动开关由 D 触发器实现抑制开关接通或断开过程中产生的一串脉冲式振动。本试验中为节约按键,闹钟时间调整键复用正常调时的校时校分开关,为使设定闹铃与正常计时中调整时间按键互不影响,额外用一个闹钟使能键,按下该键后进入闹钟设定界面,此时校时校分开关用于调整闹钟时间,对正常计时没有影响,且此时 7 段显示码显示的是闹钟时间;恢复使能键后校分校时键用于对数字钟进展时间调整,对设定的闹钟时间没有影响。整点报时功能可以通过组合规律电路实现。当计数器的各位呈现特定的电寻常,可以选通特定的与门和或门,将指定的频率信号送入蜂鸣器中,实现在
6、规定的时刻以指定频率发音报时。闹钟设定功能。闹钟只设定时和分,根本模块与正常计时电路里的校时校分电路一样。本试验中为节约按键,闹钟时间调整键复用正常调时的校时校分开关, 为使设定闹铃与正常计时中调整时间按键互不影响,额外用一个闹钟使能键,按下该键后进入闹钟设定界面,此时校时校分开关用于调整闹钟时间,对正常计时没有影响,且此时 7 段显示码显示的是闹钟时间;恢复使能键后校分校时键用于对数字钟进展时间调整,对设定的闹钟时间没有影响。23.2 数字钟设计思路构造框图把握单元数输出信号LED 显示字使能信号报警闹铃信号扬声器时CLK 时钟信号钟复位信号四、数字电路根本模块4.1 分频器模块(1) 模块
7、说明:输入一个频率为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 ISPORT (CLK: IN STD_LOGIC ;-输入时钟信号q1KHz: BUFFER STD_LOGIC;q500Hz: BUFFER STD_LOGIC; q2Hz: BUFFER STD_LOGIC; q1Hz: OUT STD_LOGIC
8、);END fdiv ;ARCHITECTURE bhv OF fdiv IS BEGINP1KHZ:PROCESS(CLK) VARIABLE cout:INTEGER:=0; BEGINIF CLK”EVENT AND CLK=”1” THENcout:=cout+1;-每来个时钟上升沿时 cout 开头计数IF cout=25000 THEN q1KHz=”0”;-当 cout=25000 时,q1KHz 输出“0” ELSIF cout50000 THEN q1KHz=”1”; -当 25000cout=50000 时,q1KHzELSE cout:=0;-输出“1”,完成 1KHz
9、频率输出3END IF; END IF;END PROCESS;P500HZ:PROCESS(q1KHz)-q1KHz 作为输入信号,分出 q500Hz VARIABLE cout:INTEGER:=0;BEGINIF q1KHz”EVENT AND q1KHz=”1” THENcout:=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
10、IF q500Hz”EVENT AND q500Hz=”1” THENcout:=cout+1;IF cout=125 THEN q2Hz=”0”; ELSIF cout250 THEN q2Hz=”1”;ELSE cout:=0; END IF;END IF;END PROCESS; P1HZ:PROCESS(q2Hz) VARIABLE cout:INTEGER:=0; BEGINIF q2Hz”EVENT AND q2Hz=”1” THENcout:=cout+1;IF cout=1 THEN q1Hz=”0”;ELSIF cout=2 THEN cout:=0;q1Hz=”1”; EN
11、D IF;END IF;END PROCESS;END bhv;(3) 模块图:44.2 把握器模块(1) 模块说明:输入端口enset,k,set 键来把握 6 个状态,这六个状态分别是显示计时时间状态,调计时的时、分、秒状态,调闹铃的时、分的状态, reset 键是复位键,用来回到显示计时时间的状态。(2) 源程序:library ieee;use ieee.std_logic_1164.all; entity contl isport(clk,enset,k,set,reset:in std_logic; cth,ctm,cts,cbh,cbm,flashh,flashm,flashs,
12、sel_show:outstd_logic); end contl;architecture rtl of contl istype stats is (s0,s1,s2,s3,s4,s5);-定义 6 个状态signal current_state,next_state:stats:=s0;begin process(clk,reset) beginif reset=”1” then current_state=s0;elsif clk”event and clk=”1” then if reset=”0” thencurrent_statecth=”0”;ctm=”0”;cts=”0”;c
13、bh=”0”;cbm=”0”; flashh=”0”;flashm=”0”;flashs=”0”;sel_show=”0”;if (enset=”1” and k=”1”)then-假设 enset 和 k 为“1”, next_state=s1;-由 s0 态转到 s1 态else next_statectm=”0”;cts=”0”;cbh=”0”;cbm=”0”; flashh=”1”;flashm=”0”;flashs=”0”;sel_show=”0”;if set=”1” then cth=”1”;-假设 set 为“1”,cth 输出“1”else cth=”0”;-进入调小时状态。
14、end if;if (enset=”1” and k=”0”)then-假设 enest 为“1”,k 为“0”,next_state=s2;-由 s1 态转到 s2 态5else next_statecth=”0”;cts=”0”;cbh=”0”;cbm=”0”; flashh=”0”;flashm=”1”;flashs=”0”;sel_show=”0”;if set=”1” then ctm=”1”; else ctm=”0”;end if;if(enset=”1” and k=”1”)then next_state=s3;else next_statecth=”0”;ctm=”0”;cb
15、h=”0”;cbm=”0”; flashh=”0”;flashm=”0”;flashs=”1”;sel_show=”0”;if set=”1” then cts=”1”; else cts=”0”;end if;if (enset=”1” and k=”0”)then next_state=s4;else next_statecth=”0”;ctm=”0”;cts=”0”;cbm=”0”; flashh=”1”;flashm=”0”;flashs=”0”;sel_show=”1”;if set=”1” then cbh=”1”; else cbh=”0”;end if;if(enset=”1”
16、 and k=”1”)then next_state=s5;else next_statecth=”0”;ctm=”0”;cts=”0”;cbh=”0”; flashh=”0”;flashm=”1”;flashs=”0”;sel_show=”1”;if set=”1” then cbm=”1”; else cbm=”0”;end if;if(enset=”1” and k=”0”)then next_state=s0;else next_state=s5; end if;end case; end process; end rtl;(3) 仿真波形图:6(4) 模块图:4.3 二选一模块(1)
17、 源程序: ENTITY mux21a IS PORT(a,b,s:IN BIT;y:OUT BIT); END ENTITY mux21a;ARCHITECTURE one OF mux21a IS BEGINPROCESS(a,b,s) BEGINIF s=”0” THENy=a;ELSE-假设 s=0,y 输出 a,反之输出 b。y=b;END IF;END PROCESS;END ARCHITECTURE one;(2) 仿真波形图:7(3) 模块图:4.4 计时模块4.4.1 秒计时模块(1) 源程序:library ieee;use ieee.std_logic_1164.all;
18、use ieee.std_logic_unsigned.all; use ieee.std_logic_arith;entity cnts60 isport(sld0:buffer std_logic_vector(3 downto 0); -小时个位sld1:buffer std_logic_vector(7 downto 4); -小时十位co: out std_logic;rest:in std_logic; clk :in std_logic);end cnts60;architecture rtl of cnts60 is beginprocess(clk,rest) beginif
19、 rest=”1” then sld1=“0000“; sld0=“0000“; elsif (clk”event and clk=”1”) thenif (sld1=“0101“and sld0=“1001“)then -当 sld1=5,sld0=9 时sld1=“0000“; sld0=“0000“;co=”1”;-全清零,co 输出“1” elsif sld0=“1001“ thensld0=“0000“;sld1=sld1+1;co=”0”;- sld1 自加“1”else sld0=sld0+1;co=”0”;end if;8end if;end process; end rtl;
20、(2) 仿真波形图:(3) 模块图:4.4.2 分计时(1) 源程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; use ieee.std_logic_arith;entity cnt60 isport(sld0:buffer std_logic_vector(3 downto 0); sld1:buffer std_logic_vector(7 downto 4); co: out std_logic;clk :in std_logic); end cnt60;architecture r
21、tl of cnt60 is beginprocess(clk) beginif (clk”event and clk=”1”) thenif (sld1=“0101“and sld0=“1001“)then sld1=“0000“; sld0=“0000“;co=”1”;elsif sld0=“1001“ then sld0=“0000“;sld1=sld1+1;co=”0”; else sld0=sld0+1;co=”0”;end if; end if;9end process; end rtl;(2) 仿真波形图:(3) 模块图:4.4.3 小时计时(1) 源程序:library iee
22、e;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; use ieee.std_logic_arith;entity cnt24 isport(sld0:buffer std_logic_vector(3 downto 0); sld1:buffer std_logic_vector(7 downto 4); clk :in std_logic);end cnt24;architecture rtl of cnt24 issignal s:std_logic_vector(7 downto 0); beginprocess
23、(clk) begin s=sld1&sld0;if (clk”event and clk=”1”) then if s=“00100011“thensld1=“0000“; sld0=“0000“;elsif sld0=“1001“ then sld0=“0000“;sld1=sld1+1; else sld0=sld0+1;end if;10end if; end process;end rtl;(2) 仿真波形图:(3) 模块图:4.4.4 闹钟分计时(1)源程序: library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_u
24、nsigned.all; use ieee.std_logic_arith;entity cntm60b isport(sld0:buffer std_logic_vector(3 downto 0); sld1:buffer std_logic_vector(7 downto 4);en:in std_logic; clk :in std_logic);end cntm60b;architecture rtl of cntm60b is beginprocess(clk) beginif (clk”event and clk=”1”) then if en=”1” thenif (sld1=
25、“0101“and sld0=“1001“)then sld1=“0000“; sld0=“0000“;elsif sld0=“1001“ then sld0=“0000“;sld1=sld1+1; else sld0=sld0+1;end if; end if;11end if;end process; end rtl;(2) 仿真波形图:(3) 模块图:4.4.5 闹钟小时计时(1) 源程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; use ieee.std_logic_arith;e
26、ntity cnth24b isport(sld0:buffer std_logic_vector(3 downto 0); sld1:buffer std_logic_vector(7 downto 4);en:in std_logic; clk :in std_logic);end cnth24b;architecture rtl of cnth24b issignal s:std_logic_vector(7 downto 0); beginprocess(clk,en,sld1,sld0) begins=sld1&sld0;if (clk”event and clk=”1”) then
27、 if en=”1” thenif s=“00100011“then sld1=“0000“; sld0=“0000“;elsif sld0=“1001“ then sld0=“0000“;sld1=sld1+1;12else sld0=sld0+1; end if;end if; end if;end process; end rtl;(2) 仿真波形图:(3) 模块图:4.5 闹钟比较模块(1) 模块说明:比较正常计数时间与闹钟定时时间是否相等,假设相等,compout 输出“1”,反之输出“0”。(2) 源程序:library ieee;use ieee.std_logic_1164.a
28、ll; entity comp isport(th1,tm1:instd_logic_vector(7downto4);th0,tm0:instd_logic_vector(3downto0);bh1,bm1:instd_logic_vector(7downto4);bh0,bm0:instd_logic_vector(3downto0);compout:out std_logic); end comp;architecture rtl of comp is beginprocess(th1,tm1,bh1,bm1,th0,tm0,bh0,bm0) beginif( th1=bh1 and t
29、m1=bm1and th0=bh0 and tm0=bm0 ) then compout=”1”;-当正常计数时间与闹钟定时时间相等时compout 输出 1 else compout=”0”;end if;13end process; end rtl;(3) 仿真波形图:(4) 模块图:4.6 报时模块(1) 模块说明:该模块既实现了整点报时的功能,又实现了闹铃的功能,蜂鸣器通过所选频率的不同,而发出不同的声音。(2) 源程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; entity be
30、l isport(tm1,ts1:in std_logic_vector(7 downto 4); tm0,ts0:in std_logic_vector(3 downto 0); compout,q1KHz,q500Hz,openbel:in std_logic; bell:out std_logic);end bel;architecture rtl of bel issignal t:std_logic_vector(7 downto 0); begin14process(compout,q500Hz,q1KHz,openbel,tm1,tm0,ts1,ts0) beginif (ope
31、nbel =”0” ) then bell=”0”;end if;if (openbel =”1” ) thenif (compout=”1”) then- compout=1,闹铃响bellbellbellbellbellbellbell=”0”;end case;else bell=”0”; end if;end if; end process;end rtl;(3) 仿真波形图:(4) 模块图:154.7 把握显示模块(1) 模块说明:该模块实现了数码管既可以显示正常时间,又可以显示闹钟时间的功能;调时,定时闪耀功能也在此模块中真正实现。(2) 源程序:library ieee;use
32、ieee.std_logic_1164.all; entity show_con isport(th1,tm1,ts1:in std_logic_vector(7 downto 4); th0,tm0,ts0:in std_logic_vector(3 downto 0); bh1,bm1:in std_logic_vector(7 downto 4); bh0,bm0:in std_logic_vector(3 downto 0);sec1,min1,h1: out std_logic_vector(7 downto 4); sec0,min0,h0: out std_logic_vecto
33、r(3 downto 0); q2Hz,flashs,flashh,flashm,sel_show:in std_logic);end show_con;architecture rtl of show_con is beginprocess(th1,tm1,ts1,th0,tm0,ts0,bh1,bm1,bh0,bm0,q2Hz,flashs,flashh,fl ashm,sel_show)beginif sel_show=”0”thenif ( flashh=”1”and q2Hz=”1”)then h1=“1111“;h0=“1111“;-显示小时数码管以 2Hz 闪耀min1=tm1;
34、min0=tm0;sec1=ts1;sec0=ts0;elsif (flashm=”1”and q2Hz=”1”)then h1=th1;h0=th0; min1=“1111“;min0=“1111“;sec1=ts1;sec0=ts0;elsif (flashs=”1”and q2Hz=”1”)then h1=th1;h0=th0; min1=tm1;min0=tm0; sec1=“1111“;sec0=“1111“;elseh1=th1;h0=th0; min1=tm1;min0=tm0; sec1=ts1;sec0=ts0;end if;elsif sel_show=”1”then-假设
35、 sel_show 为“1”,数码管显示闹钟时间 if(flashh=”1” and q2Hz=”1”)thenh1=“1111“;h0=“1111“;16min1=bm1;min0=bm0; sec1=“0000“;sec0=“0000“;elsif ( flashm=”1” and q2Hz=”1”)then h1=bh1;h0=bh0; min1=“1111“;min0=“1111“; sec1=“0000“;sec0=“0000“;else h1=bh1;h0=bh0;min1=bm1;min0=bm0; sec1=“0000“;sec0=“0000“;end if ; end if;
36、end process; end rtl;(3) 模块图:4.8 动态扫描显示模块(1) 模块说明:由 6 组输入信号和 7 个数据输出信号和 8 个位选通信号来实现数码管的驱动和信号扫描,进而实现了时钟时,分,秒的动态显示。(2) 源程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; entity SCAN_LED isport(clk1:in std_logic;h0:in std_logic_vector(3 downto 0); h1:in std_logic_vector(7 dow
37、nto 4);17min0:instd_logic_vector(3downto0);min1:instd_logic_vector(7downto4);sec0:instd_logic_vector(3downto0);sec1:instd_logic_vector(7downto4);daout:out std_logic_vector(6 downto 0); se:out std_logic_vector(2 downto 0);end;architecture one of SCAN_LED issignal cnt6:std_logic_vector(2 downto 0); si
38、gnal a: std_logic_vector(3 downto 0) ; beginp1:process(clk1) beginif clk1”event and clk1 =”1” then cnt6=cnt6+1;if cnt6=5 then cnt6=“000“;end if; end if; seaaaaaanull; end case;endprocess p2; p3:process(a) begincase a is-把握数码管段选when“0000“=daoutdaoutdaoutdaoutdaoutdaoutdaoutdaoutdaoutdaoutNULL;end cas
39、e;end process p3; end;(3) 仿真波形图:(4) 模块图:4.9 顶层文件设计电路19五、试验结果显示5.1 各引脚锁定5.2 试验结果演示六、试验总结6.1 试验总结通过为期一个月的课程设计,我们组顺当完成了数字时钟的课程设计。在这次课程设计中,我们团队三个人分工合作,分别上网和查看相关书籍来查找资料, 并根本上了解把握关于数字钟方面的相关 EDA 的工作原理及主要用途,在最终确定系统总体方案,并对课程任务进展设计。在试验箱上进展仿真和硬件测试,我们遇到了各种问题。例如万年历可以实现有显示年月日的功能,各用两个数码管显示,年只需显示最终两位,此外还应有快速较年月日的功能
40、。要增加万年历功能的最大障碍是开关问题,做完根本电路、闹铃和秒表电路后,已经没有开关剩下,要实现万年历最关键在于开关的复用问题。而开关的复用则需对原来已经设计好的电路进展修改,这需要花费很多时间来进展电路的调整,故并未实现。万年历需要快速校20准年、月、日,还要切换数码管显示,故至少需要四个开关。此处可将根本电路和闹铃电路的校分校时校星期开关与万年历的校日、校月、校年实现复用,而数码管切换显示开关则需另找一个开关实现复用。此外,显示也需实现复用,但是由于前面的闹钟功能已经实现了显示的复用,故仅需将前面的 2 选 1 译码显示电路改为 4 选 1 译码显示,以实现计时、闹钟、万年历、秒表功能复用
41、显示。如此多的功能,要进展切换复用,开关复用仍是个主要的问题。但是最终在教师的指导下,解决了问题。附参考文献1 张殿明. 智能多功能数字钟的设计J. 工业把握技术,2023, Vol.34,No.4:92-94.2 瞿德福. 一种基于单片机的多功能数字钟J. 微计算机信息,2023,Vol.21,21No.9-2:136-137.3 松井邦彦.传感器应用技巧M. 北京:科学出版社. 2023,5.4 牛永奎,冷芳. 传感器及应用M.北京:清华大学出版社. 2023,7.5 胡汉才. 单片机原理及其接口技术M. 北京:清华大学出版社. 2023,2.6 朱清慧. Proteus 教程:电子线路设计、制版与仿真M.北京: 清华大学出版社. 2023,922