EDA多功能数字钟设计
- 格式:doc
- 大小:423.50 KB
- 文档页数:16
EDA技术课程设计——多功能数字钟专业:通信c132姓名:苏莹洁138245史晓威138241指导老师:安亚军时间:2015.12.26目录1、设计目的 (3)2、设计系统环境 (3)3、设计性能指标及功能 (3) (3) (3)4、设计总体框图 (3)5、底层文件设计 (4)5.1秒计数器 (4)5.2分钟计数器 (4)5.3小时计数器 (5)5.4整点报时驱动信号产生模块 (5)5.5驱动8位八段共阴扫描数码管的片选驱动信号输出模块 (6)5.6驱动八段字形译码输出模块 (6)6、顶层文件设计 (6)7、心得体会 (7)附录(源程序) (8)1、设计目的掌握各类计数器和分频器以及它们相连的设计方法;掌握多个数码管的原理与方法;掌握CPLD技术的层次化设计的方法;掌握使用VHDL语言的设计思想;对整个系统的设计有一个了解。
2、设计系统环境(1)一台PC机;(2)一套GW48型EDA实验开发系统硬件;(3)X+PLUS Ⅱ集成化的开发系统硬件。
3、设计性能指标及功能3.1设计功能1)具有时、分、秒计数显示功能,以24小时循环计时。
2)时钟计数显示时有LED灯的花样显示。
3)具有调节小时、分钟、秒及清零的功能。
4)具有整点报时功能。
1)时钟计数:完成时、分、秒的正确计时并且显示所计的数字;对秒、分——60进制计数,即从0到59循环计数,时钟——24进制计数,即从0到23循环计数,并且在数码管上显示数值。
2)时间设置:手动调节分钟、小时,可以对所设计的时钟任意调时间,这样使数字钟真正具有使用功能。
我们可以通过实验板上的键7和键4进行任意的调整,因为我们用的时钟信号均是1HZ的,所以每LED灯变化一次就来一个脉冲,即计数一次。
3)清零功能:reset为复位键,低电平时实现清零功能,高电平时正常计数。
可以根据我们自己任意时间的复位。
4)蜂鸣器在整点时有报时信号产生,蜂鸣器报警。
产生“滴答.滴答”的报警声音。
1 绪论1.1设计目的本次设计的目的就是在掌握EDA实验开发系统的初步使用基础上,了解EDA 技术,加深对计算机体系结构的理解。
通过学习的VHDL语言结合电子电路的设计知识理论联系实际,掌握所学的课程知识,学习VHDL基本单元电路的综合设计应用。
通过对实用数字钟的设计,巩固和综合运用计算机原理的基本理论和方法,理论联系实际,提高设计、分析、解决计算机技术实际问题的独立工作能力。
1.2设计要求(1)熟练掌握VHDL语言的结构特点并能运用到具体实际中。
(2)学会利用复杂的可编程逻辑器件进行简单的电子系统设计。
(3)熟悉并掌握基于EDA实验开发系统设计实际问题的方法和步骤。
(4)通过设计过程提高自己运用所学知识来分析解决问题的能力。
1.3设计内容本课程设计中使用Altera公司的EP2C35系列的FPGA芯片,利用SOPC-NIOSII-EP2C35开发板上的资源和QuartusII软件,实现一个多功能数字时钟。
本设计的任务要求显示格式为小时-分钟-秒钟,整点报时,报时时间为10秒,即从整点前10秒钟开始进行报时提示,喇叭开始发声,直到过整点时,在 5秒LED开始闪烁,过整点后,停止闪烁。
系统时钟选择时钟模块的10KHz,要得到1Hz时钟信号,必须对系统时钟进行10,000次分频。
调整时间的的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时,S2调整分钟,每按下一次,分钟增加一分钟。
另外用S8按键作为系统时钟复位,复位后全部显示00-00-00。
扩展内容:用16*16点阵显示实现日期的动态显示用4×4键盘阵列键盘替换按键实现日期、时钟的调整,用液晶显示模块日期、时间的显示。
1.4设计环境本次课题设计方要用到的开发环境是Altera公司的EDA设计工具软件QuartusII。
Altera公司的工作与EDA厂家紧密结合,使QuartusII软件可以与其它工业标准的设计输入、综合和校验工具相连接。
实验报告实验四多功能数字钟设计一、实验目的1、学习复杂数字电路系统的设计。
2、设计一个多功能数字钟。
二、实验要求1.数字显示当前的小时、分钟;2.可以预置为12小时计时显示和24小时计时显示;3.一个调节键,用于调节目标数位的数字。
对调节的内容敏感,如调节分钟或秒时,保持按下时自动计数,否则以脉冲计数;4.一个功能键,用于切换不同状态:计时、调时、调分、调秒、调小时制式。
三、实验仪器PC机、Quartus II软件、EDA实验箱四、实验原理1.系统需要两个六十进制计数器用于分钟和秒的计时,为方便译码采用60进制计数器(1)秒计时实验程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;USE IEEE.STD_LOGIC_ARITH.ALL;entity second ISport(clk1,rst1:in std_logic;cout1:out std_logic;cq0:out std_logic_vector(3 downto 0);cq1:out std_logic_vector(3 downto 0));END second;ARCHITECTURE behave of second isSIGNAL d: std_logic_vector(3 downto 0);SIGNAL g: std_logic_vector(3 downto 0);BEGINprocess(clk1,rst1,d,g)BEGINif (rst1 ='1') thend <="0000";g <="0000";elsif(clk1'EVENT and clk1='1')thenif(d=9 and g=5)thencout1<='1';elsecout1<='0';end if;if(d=9)thend<="0000";if(g=5)theng<="0000";elseg<=g+1;end if;elsed<=d+1;end if;end if;end process;cq0<=d;cq1<=g;end behave;clk1是时钟信号,rst1是复位信号, cout1作为下一模块分钟设计的时钟信号,cq0,cq1输出信号最后接在动态译管码芯片上。
E D A课程设计学院:电气信息学院专业年级:通信工程2013级姓名:学号课题:EDA课程设计指导老师:日期:2016年7月6日第一章多功能数字钟的设计1、设计任务了解数字钟的工作原理,进一步熟悉VHDL语言编写驱动七段数码管显示代码,并且掌握用多进程的方式实现一个综合性的程序。
最终实现硬件和软件多功能数字钟的设计。
(1)显示的格式为小时-分钟-秒钟,是24小时制,整点报时时间为5秒,级从整点前5秒钟开始进行报时提示,LED灯开始闪烁,过整点后,停止闪烁。
(2)系统时钟选择时钟模块的10KHz,要得到1Hz时钟信号,必须对系统时钟进行10000次分频。
(3)调整时间的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时,S2调节分钟,每按下一次,分钟增加一分钟。
另外用S8按键作为系统时钟复位,复位后全部显示00-00-00。
2、方案设计2.1软件设计方案用VHDL语言编写程序实现设计内容中需要实现的功能。
将编写好的VHDL的程序加载到硬件电路中,从而驱动七段数码管时间,并用按键控制时间的变化,用软件仿真验证实验结果。
2.2硬件设计方案在软件方案实现的基础上,将已经运行成功的程序,将结果烧制到硬件电路中,最后生成顶层电路原理图。
3、设计的具体实现3.1设计步骤3.1.1打开QUARTUSII软件,新建一个工程3.1.2建完工程之后,再新建一个VHDL File,打开VHDL编辑器对话框;3.1.3按照自己设计方案,在VHDL编辑窗口编写VHDL程序;(程序见附录) 3.1.4编写完VHDL程序后,保存在自己新建的文件夹在D盘的目录下;3.1.5对自己编写的VHDL程序进行编译仿真,对程序的错误进行修改,直到完全通过编译和仿真;3.1.6仿真无误后,依照按键开关、数码管、LED灯与FPGA的管脚连接表进行管脚分配。
分配完成后,在进行编译一次,以使管脚分配生效;3.1.7用下载电缆通过JTAG口将对应的sof文件加载到FPGA中,观察设计结果是否和自己的编程思想一致。
eda多功能数字钟实验报告
《EDA多功能数字钟实验报告》
摘要:
本实验通过对EDA多功能数字钟的组装和测试,探索了数字钟的功能和性能。
实验结果表明,EDA多功能数字钟具有精准的时间显示、多种闹铃设置、温度
和湿度监测等功能,是一款实用且性能稳定的数字钟产品。
引言:
数字钟作为现代生活中不可或缺的家居用品,其功能和性能一直备受关注。
本
次实验选择了EDA多功能数字钟作为研究对象,旨在通过对其组装和测试,深
入了解数字钟的各项功能和性能指标。
实验方法:
1. 组装数字钟:按照产品说明书,将数字钟的各个部件进行组装,并确保连接
牢固。
2. 功能测试:测试数字钟的时间显示、闹铃设置、温度和湿度监测等功能。
3. 性能测试:对数字钟的时间精准度、闹铃响铃声音、温度和湿度监测准确度
等进行测试。
实验结果:
1. 时间显示:数字钟的时间显示精准,误差在1秒以内。
2. 闹铃设置:数字钟支持多组闹铃设置,响铃声音清晰、音量适中。
3. 温度和湿度监测:数字钟的温湿度监测准确度高,与实际环境温湿度相符合。
讨论:
通过本次实验,我们发现EDA多功能数字钟具有精准的时间显示、多种闹铃设
置、温度和湿度监测等功能,性能稳定,符合用户对数字钟的基本需求。
同时,数字钟的组装和操作也相对简单,适合家庭使用。
结论:
EDA多功能数字钟是一款实用且性能稳定的数字钟产品,能够满足用户对数字
钟的基本需求。
在未来的生活中,数字钟将继续扮演重要的角色,为人们的生
活提供便利。
致谢:
感谢实验中提供支持和帮助的老师和同学们。
EDA课程设计报告课题名称:多功能数字钟设计多功能数字钟设计一、数字钟简介:20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。
但是,一旦重要事情,一时的耽误可能酿成大祸。
钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,已得到广泛的使用。
数字钟的设计方法有许多种,例如,可用中小规模集成电路组成电子钟;也可以利用专用的电子钟芯片配以显示电路及其所需要的外围电路组成电子钟;还可以利用单片机来实现电子钟等等。
这些方法都各有其特点,其中利用单片机实现的电子钟具有编程灵活,并便于功能的扩展。
二、设计要求1. 具有以二十四小时制计时、显示、时间设置的功能。
2. 精度要求为1s。
三、系统功能简介1. 计时:时钟计时:秒——60进制BCD码计数;分——60进制BCD码计数;时——24进制BCD码计数;2. 校时:同时整个计数器有清零,调分,调时功能。
可手动校时,能分别进行时、分的校正3. 显示:具有驱动8位八段共阴极扫描数码管的片选驱动信号输出和八段字形译码输出。
内容规划:(1)根据电路特点,可用层次化结构化设计概念。
将此项设计分成若干模块,规定每一模块的功能和各模块之间的接口。
多功能数字钟的设计1设计功能(1)在6位数码管上按24小时进制显示时分秒;(2)当电路发生走时误差时具有对时和分校是功能(3)具有整点报时功能,报时声响为4低1高,每一下响声持续1s,结束报时是正好整点;(4)能按设定的时间启动闹钟,如早上7点,即用800Hz方波驱动喇叭,持续1分钟自动停止。
2设计思路划分出实现该数字钟的各逻辑功能模块,采用VHDL语言编写后分别例化,最后在顶层文件中将各功能模块连接起来。
(1)分和秒的计时是60进制,时的计时是24 进制,分高低位。
(2)数据选择器选择时分秒进行输出实现6位数码管动态扫描。
(3)校时电路根据输入的不同开关进行分和时的调整。
(4)报时电路主要完成整点报时和定时闹钟。
3 各模块采用VHDL代码设计(1)秒的代码(2)library ieee;(3)use ieee.std_logic_1164.all;(4)use ieee.std_logic_unsigned.all;(5)entity second is(6)port((7)setmin, clk, reset : in std_logic;(8)sec1, sec2 : out std_logic_vector(3 downto 0);(9)carry : out std_logic );(10)end second;(11)architecture rtl of second is(12)signal sec1_t, sec2_t:std_logic_vector(3 downto 0);(13)begin(14)process(clk, reset)(15)begin(16)if reset = '1' then(17)sec1_t <= "0000";(18)sec2_t <= "0000";(19)elsifsetmin= '1' then(20)carry <= '1';(21)elsifclk'event and clk='1' then(22)if sec1_t = "1001" then(23)sec1_t <= "0000";(24)if sec2_t = "0101" then(25)sec2_t <= "0000";(26)else(27)sec2_t<=sec2_t+1;(28)end if;(29)else(30)sec1_t<=sec1_t+1;(31)end if;(32)(33)if sec1_t="1001" and sec2_t="0101" then carry<= '1'; (34)else(35)carry <= '0';(36)end if;(37)end if;(38)end process;(39)sec1 <= sec1_t;(40)sec2 <= sec2_t;(41)end rtl;(2)分的代码libraryieee;use ieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entity minute isport(clk, reset, sethour : in std_logic;sec1, sec2 : out std_logic_vector(3 downto 0);carry : out std_logic );end minute;architecturertl of minute issignal sec1_t, sec2_t:std_logic_vector(3 downto 0);beginprocess(clk, reset)beginif reset = '1' thensec1_t <= "0000";sec2_t <= "0000";elsifsethour='1' then carry <= '1';elsifclk'event and clk='1' thenif sec1_t = "1001" thensec1_t <= "0000";if sec2_t = "0101" thensec2_t <= "0000";elsesec2_t<=sec2_t+1;end if;elsesec1_t<=sec1_t+1;end if;if sec1_t="1001" and sec2_t="0101" then carry <= '1';elsecarry<= '0';end if;end if;end process;sec1 <= sec1_t;sec2 <= sec2_t;endrtl;(3)时的代码libraryieee;use ieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entity hour isport(clk, reset : in std_logic;hour1,hour2: out std_logic_vector(3 downto 0));end hour;architecturertl of hour issignal hour1_t,hour2_t:std_logic_vector(3 downto 0);beginprocess(clk,reset)beginif reset='1' thenhour1_t<="0000";hour2_t<="0000";elsifclk'event and clk='1' thenif hour1_t="0011" and hour2_t="0010" thenhour1_t<="0000";hour2_t<="0000";elseif hour1_t="1001" thenhour1_t<="0000";if hour2_t="0010" thenhour2_t<="0000";elsehour2_t<=hour2_t+1; end if;elsehour1_t<=hour1_t+1;end if;end if;end if;--hour1<=hour1_t;--hour2<=hour2_t;end process;hour1<=hour1_t;hour2<=hour2_t;endrtl;(4)数码管译码代码libraryieee;use ieee.std_logic_1164.all;entity segment7 isport(data:instd_logic_vector(3 downto 0);dout:outstd_logic_vector(6 downto 0));end;architecturebehav of segment7 isbeginprocess(data)begincase data iswhen "0000"=>dout<="0111111";when "0001"=>dout<="0000110";when "0010"=>dout<="1011011";when "0011"=>dout<="1001111";when "0100"=>dout<="1100110";when "0101"=>dout<="1101101";when "0110"=>dout<="1111101";when "0111"=>dout<="0000111";when "1000"=>dout<="1111111";when "1001"=>dout<="1101111";when "1010"=>dout<="1000000";when others=>null;end case;end process;endbehav;(5)动态扫描代码libraryieee;use ieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entity mux6_1scan isport(clkscan,reset : in std_logic;in1,in2,in3,in4,in5,in6 : in std_logic_vector(3 downto 0);data : out std_logic_vector(3 downto 0);sel : out std_logic_vector(2 downto 0));end mux6_1scan;architecturertl of mux6_1scan issignalcount:std_logic_vector(2 downto 0);beginprocess(clkscan,reset)beginif reset='1' thencount<="000";elsifclkscan'event and clkscan='1' thenif count="111" thencount<="000";elsecount<=count+1;end if;end if;end process;process(count)begincase count iswhen "000"=>data<=in1;when "001"=>data<=in2;when "010"=>data<="1010";when "011"=>data<=in3;when "100"=>data<=in4;when "101"=>data<="1010";when "110"=>data<=in5;when "111"=>data<=in6;when others=>null;end case;end process;sel<=count;endrtl;(6)闹钟代码libraryieee;use ieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entity alert isport( clk500hz,clk1khz : in std_logic;int1,int2,int3,int4,int5,int6 : in std_logic_vector(3 downto 0);speak : out std_logic);end alert;architecturertl of alert isbeginspeak<=clk500hz when (int4="0101" and int3="1001")and ((int2="0101" and int1="0101")or(int2="0101" and int1="0111"))elseclk1khz when (int4="0101" and int3="1001")and (int2="0101" and int1="1001")elseclk1khz when int6="0101" and int5="1001" else'0';endrtl;4顶层文件设计将VHDL语言所写的各个模块分别例化为元器件,顶层文件采用原理图的方式输入。
E D A课程设计学院:电气信息学院专业年级:通信工程2013级姓名:学号课题: EDA课程设计指导老师:日期:2016年7月6日第一章多功能数字钟的设计1、设计任务了解数字钟的工作原理,进一步熟悉VHDL语言编写驱动七段数码管显示代码,并且掌握用多进程的方式实现一个综合性的程序。
最终实现硬件和软件多功能数字钟的设计。
(1)显示的格式为小时-分钟-秒钟,是24小时制,整点报时时间为5秒,级从整点前5秒钟开始进行报时提示,LED灯开始闪烁,过整点后,停止闪烁。
(2)系统时钟选择时钟模块的10KHz,要得到1Hz时钟信号,必须对系统时钟进行10000次分频。
(3)调整时间的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时,S2调节分钟,每按下一次,分钟增加一分钟。
另外用S8按键作为系统时钟复位,复位后全部显示00-00-00。
2、方案设计2.1软件设计方案用VHDL语言编写程序实现设计内容中需要实现的功能。
将编写好的VHDL的程序加载到硬件电路中,从而驱动七段数码管时间,并用按键控制时间的变化,用软件仿真验证实验结果。
2.2硬件设计方案在软件方案实现的基础上,将已经运行成功的程序,将结果烧制到硬件电路中,最后生成顶层电路原理图。
3、设计的具体实现3.1设计步骤3.1.1打开QUARTUSII软件,新建一个工程3.1.2建完工程之后,再新建一个VHDL File,打开VHDL编辑器对话框;3.1.3按照自己设计方案,在VHDL编辑窗口编写VHDL程序;(程序见附录) 3.1.4编写完VHDL程序后,保存在自己新建的文件夹在D盘的目录下;3.1.5对自己编写的VHDL程序进行编译仿真,对程序的错误进行修改,直到完全通过编译和仿真;3.1.6仿真无误后,依照按键开关、数码管、LED灯与FPGA的管脚连接表进行管脚分配。
分配完成后,在进行编译一次,以使管脚分配生效;3.1.7用下载电缆通过JTAG口将对应的sof文件加载到FPGA中,观察设计结果是否和自己的编程思想一致。
EDA课程设计报告一·设计任务使用硬件描述语言,在CPLD/FPGA上实现一个多功能数字钟。
二·设计要求除按键、LED、扬声器、时钟信号外,整个数字钟的功能要求在一块芯片上实现。
a)具有时,分,秒,计数显示功能,以24小时循环计时;b)具有时间清零功能;c)具有小时、分钟和秒钟调整功能(个位和十位分开调或合起来调)。
d)具有闹钟功能,能预设闹钟时间,精确到秒。
整个数字钟只设一个时钟输入端口,所需不同频率信号在内部分频实现。
(LED扫描频率设为50Hz以上)。
三·设计方案设计采用模块方式,分别为分频模块:产生1Hz的脉冲作为秒的输入,和产生1kHz的脉冲作为数码管显示的动态扫描。
计时模块:秒模块,分模块,时模块。
闹钟模块,显示模块,控制模块。
四·模块端口设置1. 分频模块输入:clkin : 本实验输入为50MHz晶振输出:clk : 为显示模块及始终调节提供1KHz脉冲clkt: 为计数器模块提供1Hz脉冲2. 计时模块m 是模式按键,当m=0 时,进入计时模式,在计时模式下可以进行时间调整。
num3,num4 产生加速调整时间,当其值为1 时,可以快速调整时间,该调整时间的频率由clk 提供。
counta,count1 是手动调节时间。
Turn 接按键,可以改变当前调节的是小时还是分钟,长按turn 键还可以使秒钟信号清零。
sec1,min1,hour1 输出的是计时的秒,分,时。
3.闹钟模块原理:num1,num2 产生加速调整时间,当其值为1 时,可以快速调整时间,该调整时间的频率由clk 提供。
countb,count2 是手动调节闹钟时间。
amin,ahour 是输出的闹钟的分钟和小时4. 控制模块m 是模式按键,当m=0 时,指当前输出的是计时功能;当m=1 时,指当前调整的是闹钟时间;当m=2 时,指当前调整的是计时时间;当m=3 时,此时turn 按键可用于跑表的暂停与开始。
多功能数字时钟设计说明:1.系统顶层框图:各模块电路功能如下:1.秒计数器、分计数器、时计数器组成最基本的数字钟,其计数输出送7段译码电路由数码管显示.2.基准频率分频器可分频出标准的1HZ频率信号,用于秒计数的时钟信号;分频出4HZ频率信号,用于校时、校分的快速递增信号;分频出64HZ频率信号,用于对按动“校时”,“校分”按键的消除抖动.2.多功能数字钟结构框图:一、系统功能概述已完成功能1.完成时/分/秒的依次显示并正确计数,利用六位数码管显示;2.时/分/秒各段个位满10正确进位,秒/分能做到满60向前进位,有系统时间清零功能;3.定时器:实现整点报时,通过扬声器发出高低报时声音;4.时间设置,也就是手动调时功能:当认为时钟不准确时,可以分别对分/时钟进行调整;5.闹钟:实现分/时闹钟设置,在时钟到达设定时间时通过扬声器响铃.有静音模式.待改进功能:1. 系统没有万年历功能,正在思考设计方法.2. 应添加秒表功能.二、系统组成以及系统各部分的设计1.时计数模块时计数模块就是一个2位10进制计数器,记数到23清零.VHDL的RTL描述如下:----cnt_h.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt_h isport(en,clk,clr:in std_logic;dout:out std_logic_vector(7 downto 0);c:out std_logic);end cnt_h;architecture rtl of cnt_h issignal t:std_logic_vector(7 downto 0);beginprocess(en,clk,clr)variable t:std_logic_vector(7 downto 0);beginif en='1' then --异步使能if clk 'event and clk='1' thent:=t+1;if t(3 downto 0)=X"A" then --个位等于10则十位加1t(7 downto 4):=t(7 downto 4)+1;t(3 downto 0):=X"0"; --个位清零end if;if t>X"23" then --大于23清零t:=X"00";end if;end if;if clr='1' then --异步清零t:=X"00";end if;end if;dout<=t;end process;end rtl;时计数器模块仿真波形如下从仿真波形可知,当计数到23时,下一个时钟上升沿到来时就清零了,符合设计要求.时计数模块框图如下2.分及秒计数模块分及秒计数模块也是一个2位10进制计数器,记数到59清零.VHDL的RTL描述如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt_s isport(en,clk,clr:in std_logic;dout:buffer std_logic_vector(7 downto 0);c:out std_logic);end cnt_s;architecture rtl of cnt_s isbeginprocess(en,clk,clr)beginif en='1' thenif clr='1' then --异步清零dout<=X"00";elsif clk 'event and clk='1' thenif dout(3 downto 0)<9 thendout(3 downto 0)<=dout(3 downto 0)+1;c<='0';elsif dout(7 downto 4)<5 thendout(3 downto 0)<=X"0";dout(7 downto 4)<=dout(7 downto 4)+1;elsedout<=X"00";c<='1';end if;end if;else dout<="ZZZZZZZZ";end if;end process;end rtl;分和秒计数器模块仿真波形如下从仿真波形可知,当计数到59时,下一个时钟上升沿到来时就清零了,并且产生进位信号,符合设计要求.分和秒计数模块框图如下3.按键消抖动模块按键消抖动有很多方案,这里选择的是计数消抖,即只当有效电平到来后开始计数,当计数值大于一定值后再输出该有效电平,否则不输出,从而达到消抖目的. VHDL的RTL描述如下:library ieee;use ieee.std_logic_1164.all;entity haoin isport(din,clk:in std_logic;dout:out std_logic); end haoin;architecture rtl of haoin isbeginprocess(din)variable t: integer range 0 to 63:=0;beginif din='1' thenif clk 'event and clk='1'thent:=t+1;if t>10 thendout<='1';t:=t-1;else dout<='0';end if;end if;else dout<='0';t:=0;end if;end process;end rtl;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ring isport(clk: in std_logic;clk500: in std_logic;clk1k:in std_logic;beep:out std_logic);end ring;architecture rtl of ring isbeginprocess(clk)variable t: std_logic;variable n: integer range 0 to 15:=0;beginif clk 'event and clk='1' thent:=not t;n:=n+1;end if;if t='1' and n<11 thenbeep<=clk500;elsif n=11 thenbeep<=clk1k;else beep<='Z';end if;end process;end rtl;library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;entity clock isport(SA: in std_logic;SB: in std_logic;SC: in std_logic;SD: in std_logic;clk1: in std_logic;dout: buffer std_logic_vector(23 downto 0);--seg_data:out std_logic_vector(7 downto 0);--seg_co米:out std_logic_vector(3 downto 0);beep: out std_logic--led:out std_logic_vector(3 downto 0));end entity clock;architecture rtl of clock isco米ponent cnt_s isport(en,clk,clr:in std_logic;dout:buffer std_logic_vector(7 downto 0);c:out std_logic);end co米ponent;co米ponent cnt_h isport(en,clk,clr:in std_logic;dout:buffer std_logic_vector(7 downto 0));end co米ponent;--co米ponent seg米ain is--port(clk,reset_n:in std_logic;--datain:in std_logic_vector(15 downto 0);--seg_data:out std_logic_vector(7 downto 0);--seg_co米:out std_logic_vector(3 downto 0));--end co米ponent;--co米ponent ring is--port( en: in std_logic;-- clk: in std_logic;--clk500: in std_logic;--clk1k:in std_logic;--beep:out std_logic);--end co米ponent;co米ponent haoin isport(din,clk:in std_logic;dout:out std_logic);end co米ponent;co米ponent naoling isport (h,米:in std_logic_vector(7 downto 0);clk4hzh,clk4hz米:in std_logic;sys_en,sys_rst:in std_logic;h_o,米_o: out std_logic_vector(7 downto 0);beep:out std_logic);end co米ponent;signal reg_h:std_logic_vector(7 downto 0);signal reg_米:std_logic_vector(7 downto 0);signal reg_s:std_logic_vector(7 downto 0);signal reg_米_s:std_logic_vector(7 downto 0):=X"59"; signal reg_米_米:std_logic_vector(7 downto 0):=X"59";signal reg_米_h:std_logic_vector(7 downto 0):=X"59";signal clk_h:std_logic;signal clk_米:std_logic;signal clk_s:std_logic;signal c_s :std_logic;signal c_米:std_logic;signal c_h :std_logic;signal sys_clk1:std_logic;signal sys_clk4:std_logic;signal sys_clk64:std_logic;signal sys_clk500:std_logic;signal sys_clk1k:std_logic;signal clki:integer:=750000;signal sys_rst:std_logic:='0';signal sys_en:std_logic:='1';signal clk_ring,米h:std_logic;signal SAc,SBc,SCc,SDc:std_logic;signal en_r:std_logic;signal NL_reg_h,NL_reg_米:std_logic_vector(7 downto 0);signal NL_ring:std_logic;signal sys_clk4_NL_h,sys_clk4_NL_米:std_logic;beginh:cnt_h port 米ap(en=>sys_en,clk=>clk_h,clr=>sys_rst,dout=>reg_h);米:cnt_s port 米ap(en=>sys_en,clk=>clk_米,clr=>sys_rst,dout=>reg_米,c=>c_米);s:cnt_s port 米ap(en=>sys_en,clk=>sys_clk1,clr=>SCc,dout=>reg_s,c=>c_s);--sled:seg米ain port 米ap(clk=>clk1,reset_n=>SCc,seg_data=>seg_data,seg_co 米=>seg_co米,datain=>dout(15 downto 0));--ring0:ring port 米ap(en=>en_r,clk=>clk_ring,clk500=>sys_clk500,clk1k=>sys_clk1k,beep=>beep); haoin1:haoin port 米ap( SA,sys_clk64,SAc);haoin2:haoin port 米ap( SB,sys_clk64,SBc);haoin3:haoin port 米ap( SC,sys_clk64,SCc);haoin4:haoin port 米ap( SD,sys_clk64,SDc);NL:naoling port 米ap(beep=>NL_ring,h=>reg_h,米=>reg_米,clk4hzh=>sys_clk4_NL_h,clk4hz米=>sys_clk4_NL_米,sys_en=>sys_en,sys_rst=>sys_rst,h_o=>NL_reg_h,米_o=>NL_reg_米);beep<=clk_ring and 米h;--led<=reg_s(3 downto 0);p_sys_clk:process(clk1)variable t1,t4,t64,t500,t1k:integer range 0 to 50000000;beginif clk1 'event and clk1='1' thent1:=t1+1;t4:=t4+1;t64:=t64+1;t500:=t500+1;t1k:=t1k+1;if t1=clki/2 thent1:=0;sys_clk1<=not sys_clk1;end if;if t4=clki/8 thent4:=0;sys_clk4<=not sys_clk4;end if;if t64=clki/128 thent64:=0;sys_clk64<=not sys_clk64;end if;if t500=clki/1000 thent500:=0;sys_clk500<=not sys_clk500;end if;if t1k=clki/2000 thent1k:=0;sys_clk1k<=not sys_clk1k;end if;end if;end process p_sys_clk;p_c:process(SAc,SBc,SCc,SDc)beginif SAc='1' and SDc='0' thenclk_h<=sys_clk4;elseclk_h<=c_米;end if;if SAc='1' and SDc='1' thensys_clk4_NL_h<=sys_clk4;elsesys_clk4_NL_h<='0';end if;if SBc='1' and SDc='0'thenclk_米<=sys_clk4;elseclk_米<=c_s;end if;if SBc='1' and SDc='1'thensys_clk4_NL_米<=sys_clk4;elsesys_clk4_NL_米<='0';end if;if SDc='0' thendout(7 downto 0)<=reg_s;dout(15 downto 8)<=reg_米;dout(23 downto 16)<=reg_h;elsedout(7 downto 0)<="ZZZZZZZZ";dout(15 downto 8)<=NL_reg_米;dout(23 downto 16)<=NL_reg_h;end if;end process p_c;P_ring:process(reg_米,reg_s,sys_clk1k)variable clk_ring_t:std_logic;variable t:std_logic_vector(3 downto 0);beginif reg_米=X"59" and (reg_s=X"50" or reg_s=X"52" or reg_s=X"54" or reg_s=X"56" or reg_s=X"58") thenclk_ring_t:=sys_clk500;elsif reg_米=X"00" and reg_s=X"00" thenclk_ring_t:=sys_clk1k;else clk_ring_t:='Z';end if;if NL_ring='1' thenclk_ring_t:=sys_clk1k;end if;if sys_clk1k 'event and sys_clk1k='1' thent:=t+1;end if;if t>1 then 米h<='1';end if;clk_ring<=clk_ring_t;end process p_ring;end rtl;。
EDA设计(二)——多功能数字钟设计姓名:周婷婷学号:0904220116院系:电光学院指导老师:花汉兵蒋立平完成时间:2011年12月15号多功能数字钟设计摘要该实验时利用QuartusII软件设计一个数字钟,进行实验设计和仿真调试,实现了计时,校时,校分,清零,保持和整点报时等多种基本功能,并下载到SmartSOPC实验系统中进行调试和验证。
此外还添加了星期功能,使得设计的数字钟功能更加完善。
Abstract:This experiment is to design a digital clock which is based on Quartus software and in which many basic functions like time-counting , hour-correcting , minute-correcting , reset , timing-holding and belling on the hour. And then validated the design on the experimental board . In addition, additional functions like reseting the week make this digital clock a perfect one.目录1.设计要求 (4)2.工作原理 (4)3.各模块说明 (5)1)分频模块 (5)2)计时模块 (9)3)显示模块 (11)4)校分与校时模块 (11)5)清零模块 (12)6)保持模块 (13)7)报时模块 (13)4.扩展模块 (13)1)星期模块 (13)5.调试、编程下载 (14)6.实验中出现问题及解决办法 (14)7.实验收获与感受 (14)8.参考文献 (15)一、设计要求1.设计一个数字计时器,可以完成00:00:00到23:59:59的计时功能,并在控制电路的作用下具有保持、清零、快速校时、快速校分、整点报时等基本功能。
2.具体要求如下:1)能进行正常的时、分、秒计时功能,最大计时显示23小时59分59秒。
2)分别由六个数码管显示时分秒的计时。
3)K1是系统的使能开关,K1=0正常工作,K1=1时钟保持不变。
4)K2是系统的清零开关,K2=0正常工作,K2=1时钟的分、秒全清零。
5)在数字钟正常工作时可以对数字钟进行快速校时和校分。
K3是系统的校分开关,K3=0正常工作K3=1时可以快速校分;K4是系统的校时开关,K4=0正常工作,K4=1时可以快速校时。
3.设计提高部分要求1)时钟具有整点报时功能,当时钟计到59’51”时开始报时,在59’51”,59’53”, 59’55”,59’57”时报时频率为512Hz,59’59”时报时频率为1KHz。
2)星期显示:星期显示功能是在数字钟界面显示星期,到计时到24小时时,星期上显示的数据进一位。
3)闹表设定功能。
4.仿真与验证用Quartus软件对设计电路进行功能仿真,并下载到实验板上对其功能进行验证。
二、工作原理数字计时器是由计时电路、译码显示电路、脉冲发生电路和控制电路等几部分组成的,控制电路按要求可由校分校时电路、清零电路和保持电路组成。
其中,脉冲发生电路将试验箱提供的48Mhz的频率分成电路所需要的频率;计时电路与动态显示电路相连,将时间与星期显示在七段数码管上,并且驱动蜂鸣器整点报时;校时校分电路对时、分、星期提供快速校时;清零电路作用时,系统的分秒时同时归零;保持电路作用时,系统停止计时并保持时间不变。
其原理框图如图所示:三、各模块说明1、分频模块实验板上振荡源为48MHz,为获得秒脉冲信号和报时电路中需要的音频,需要对该振荡源进行分频处理。
处理的过程示意如下:(1)2分频电路2分频电路是通过将D触发器的Q端与D端接在一起就可以从Q端得到触发器信号的2分频信号,电路图如下:波形图如下:(2)3分频电路Q Q Q Q按照如下方式3分频电路是通过74160用置数法实现。
其输出端D C B AQ直接引出。
循环计数时就可以对其输入的脉冲进行3分频,输出信号由B ArrayQ作为置数信号的输入。
3分频电路图74160置数端为低电平有效,所以将B如下:波形图如下:封装的子模块图为:(3)8分频将3个2分频串联实现8分频电路。
8分频电路图如下:波形图如下:将3分频和8分频电路串联可以构成24分频电路图,电路图如下:波形图如下:(4)1000分频电路1000分频电路通过3模10计数器串联而成。
模10计数器是由计数器74161来QD QCQBQA=1111时置数,使计数器按如下方式进行循环:为了获得占空比接近1:1的输出信号,将QC作为输出,占空比为6:4。
电路图如下所示:将3个10分频进行串联获得1000分频的分频器,电路图如下:最终将各种分频所获得的信号输出按照分频电路设计图连接,并封装在一个总的模块内,即得到分频模块,输入信号为48MHZ,输出信号为1KHZ,500HZ,2HZ,1HZ。
封装电路图如下:2、计时模块计时模块包括秒、分、时,星期四个模块,依次进位。
其中秒和分的模块都是一个模60计数器,时模块是一个模24技术区,星期采用的是模7计数器。
计时采用的是同步计数器,它们所用的时钟信号均为1HZ。
(2)秒计时模块当秒计时至59秒的时候由四与非门输出一个低电平将秒个位及秒十位置零,同时将此低电平作为进位信号传递给分个位。
波形图如下:(3)分计时模块其结构与秒计时模块大致一致,不同的是分清零的条件不仅是分计时到59而且秒也要计时到59,所以清零信号的输入还要添加秒计时模块的输出。
波形图如下,与秒计时相似:(4)时计时模块时计时模块与秒、分计时模块累死,要使进位信号设计在23时置零进位,必须得等到秒与分信号都计时到59时才能进位清零,所以清零信号的输入还要添加秒和分计时模块的输出。
其波形图如下:3、显示模块此模块是用于数码管的动态显示,在本实验中一共需要6个数码管参与显示(秒2位,分2位,时2位),所以计数器74161设计为模6的循环,其输出既作为4片74151的控制端,又作为3-8译码器74138的控制端。
因为只有一片BCD译码器7447,所以当计数器到某一个数值时,四片74151同时选取对应位的一个输入组成计时器某一位的BCD编码接入显示译码器7447,与此同时根据计数器的数值,74138译码器也从六个显示管的使能端选择对应位有效,从而在实验箱上显现一个有效数据。
扫描的频率为几千赫兹,因为人眼视觉停留的原因,会感觉七个数码管同时显示。
原理图如下:(1)校分模块当K3为0时,校分模块输出1hz的脉冲供给分计时模块正常计数;当K3为1时,校分模块输出2hz的脉冲供给分计时模块校分。
其中为了防止拨开关时引发的颤动给校分带来影响,在校分模块中加入了消颤的D触发器。
由于校分的时候无论秒计时模块是否计到59,都能进行校分,故秒计时模块的输出要与开关K3相或才能供给校分模块的使能端。
(2)校时模块当K4为0时,校时模块输出1hz的脉冲供给时计时模块正常计数;当K4为1时,校时模块输出2hz的脉冲供给时计时模块校分。
其中为了防止拨开关时引发的颤动给校时带来影响,在校时模块中加入了消颤的D触发器。
由于校时的时候无论秒和分计时模块是否都计到59,都能进行校时,故秒计时模块的输出要与开关K4相或才能供给校分模块的使能端。
5、清零模块通过增加一个开关K2来控制计时电路,开关通过非门直接接在每个74160的清零端,当开关断开的时候,计时器正常工作,当开关闭合时,计时器清零。
K2=0 CLR=1 ,K2=1 CLR=06、保持模块通过开关K1控制秒的使能信号,当秒停止计时时,计时器就“保持”了。
K1=0,ENT=1; K1=1,ENT=07、报时模块当电路计时到59分51,53,55,57秒时,分别发出一声较低的蜂鸣声;当计时到59分59秒时,发出一声较高的蜂鸣声。
需要在某时刻报时,就将该时刻输出为“1”的信号作为触发信号,选通报时脉冲信号进行报时。
设F是报时函数,F1是低音报时函数,F2是高音报时函数。
所有函数为高电平时报时。
则有:F=59’53’’F1+59’55’’F1+59’57’’F1+59’59’’F2=59’51’’(2’’F1+4’’F1+6’’F1+8’’F2)=59’51’’·(2’’F1·4’’F1·8’’F2)原理图如下:四、扩展模块1、星期模块星期计时关键是实现一个模七的计时循环,这里利用同步十进制计数器74160来实现。
星期的跳变需要秒分计到59并且时计到23,即时的进位输出。
原理图如下:五、调试、编程下载选择“Processing-start complication”进行全编译,编译通过后要进行管脚分配,选择“Assignments Pins”,在打开的对话框中的“Location”栏中选择相应的管脚填入,并将未用到的管脚置为三态,最后将程序下载到SmartSOPC实验系统中运行,检验结果是否正确。
六、实验中出现的问题以及解决方法1、一开始在设计分计时和时计时时没有考虑到后位与前位的进位关系,导致在59分的时候便开始向时计时进位,不正确。
后来在分向时进位的时候加入秒进位信息来解决这个问题。
2、在调试的时候发现拨动开关时数字显示跳动不正常,这是由于开关拨动是产生抖动造成的,所以给开关加上运用D锁存器的锁存功能进行消颤处理,即可正常显示。
3、在一开始调试校分电路时,发现分和时并不在59后归零,而是一直不停的计数下去。
经讨论,是因为原先分清零的要求是分和秒的计数值都为59,而在校分的时候,不需要秒位也是59,因此对分的清零信号进行修改,要加入K3的作用,同理,时的清零信号要加入K4的作用。
七、实验收获和感受这次实验强化了我们上学期所学的数字逻辑电路的实质,另一方面也让我们学习和掌握了软件QuartusⅡ和试验箱的用法。
和电工电子实习所要得到的结果大致相同,但是所用的方法却不一样。
电工电子实验所用的multisim软件中的器件是齐全的,所以只需要我们找出所需的元件,然后连线就可以了。
可是这次的实验所用的quartus软件却需要我们根据自己的需要自行合成所需功能的元件,更具有可创性,也更具有挑战性。
同时本次实验可以利用软件仿真,观察波形,进行调试,比较安全。
刚开始的时候对这个实验不是很熟悉,并且刚接触这个软件,比较生疏,有点停滞不前。
不过在熟悉了这个软件之后,便开始尝试按照老师课上讲的分部完成。
首先分频,必须具有全局观念,要把整个试验中所需的频率都做出来,合成为一个新的器件,供后面使用。
然后便是计时模块,设计的时候刚开始先是做出了2个模60和一个模24的计数器,并没有考虑到它们之间的关系,所以造成一开始的调试失误。