VHDL,FPGA数字闹钟
VHDL语言数字时钟论文-基于FPGA的具有闹钟和校时功能的数字钟设计
VHDL语言数字时钟论文-基于FPGA的具有闹钟和校时功能的数字钟设计实验名称:基于FPGA的具有闹钟和校时功能的数字钟设计一、设计内容和要求实验要求使用 VHDL进行多功能时钟的设计具体要求如下:1.能将基本的小时、分钟、及秒钟显示在数码管上。
2(能利用拨码开关进行时间的校正。
3.具有整点报时和闹钟的功能。
二、 FPGA简介以硬件描述语言,Verilog或VHDL,所完成的电路设计~可以经过简单的综合与布局~快速的烧录至 FPGA 上进行测试~是现代 IC设计验证的技术主流。
这些可编辑元件可以被用来实现一些基本的逻辑门电路,比如AND、OR、XOR、NOT,或者更复杂一些的组合功能比如解码器或数学方程式。
在大多数的FPGA里面~这些可编辑的元件里也包含记忆元件例如触发器,Flip,flop,或者其他更加完整的记忆块。
FPGA采用了逻辑单元阵列LCA,Logic Cell Array,这样一个概念~内部包括可配臵逻辑模块CLB,Configurable Logic Block,、输入输出模块IOB,Input Output Block,和内部连线,Interconnect,三个部分。
现场可编程门阵列,FPGA,是可编程器件~与传统逻辑电路和门阵列,如PAL~GAL及CPLD器件,相比~FPGA具有不同的结构。
FPGA利用小型查找表,16×1RAM,来实现组合逻辑~每个查找表连接到一个D触发器的输入端~触发器再来驱动其他逻辑电路或驱动I/O~由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块~这些模块间利用金属连线互相连接或连接到I/O模块。
FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的~存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式~并最终决定了FPGA所能实现的功能~FPGA允许无限次的编程。
FPGA基本特点采用FPGA设计ASIC电路(专用集成电路,~用户不需要投片生产~就能得到合用的芯片。
vhdl数字电子钟的设计与实现
基于VHDL数字电子钟的设计与实现摘要:本课程设计完成了数字电子钟的设计,数字电子钟是一种用数字显示秒、分、时的计时装置,由于数字集成电路技术的发展和采用了先进的石英技术,它使数字钟具有走时准确、性能稳定、携带方便等优点。
数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活带来极大的方便。
在这里我们将已学过的比较零散的数字电路的知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路的能力。
关键词:电子钟;门电路及单次按键;琴键开关目录第一章引言----------------------------------------------------------------11.1 课题的背景、目的------------------------------------------11.2 课程设计的内容------------------------------------------1 第二章EDA与VHDL简介--------------------------------------------------22.1 EDA的介绍---------------------------------------------22.2 VHDL的介绍--------------------------------------------32.2.1 VHDL的用途与优点-----------------------------------------------------------------32.2.2 VHDL的主要特点----------------------------------------------------------------------2.2.3 用VHDL语言开发的流程------------------------------------------------------------ 第三章数字电子钟的设计方案------------------------------------------63.1秒脉冲发生器--------------------------------------------73.2可调时钟模块--------------------------------------------83.3校正电路------------------------------------------------83.4闹铃功能------------------------------------------------103.5日历系统------------------------------------------------11 第四章结束语---------------------------------------------------------------134.1致谢----------------------------------------------------144.2参考文献------------------------------------------------151引言随着科学技术的不断发展,人们对时间计量的精度要求越来越高。
VHDL数字时钟设计
VHDL数字时钟设计序⾔这个是我在做FPGA界的HelloWorld——数字钟设计时随⼿写下的,再现了数字钟设计的过程⽬标分析1. 时钟具有时分秒的显⽰,需6个数码管。
为了减⼩功耗采⽤扫描法显⽰2. 按键设置时间,需要对按键进⾏消抖3. 时分秒即为2个60进制计数器,⼀个24进制计数器。
模块设计综上所述,我采⽤模块化设计⽅法进⾏设计,绘制框图如下。
1. 时钟分频产⽣各个模块所需频率时钟。
2. 按键处理模块对按键信号进⾏消抖、变长脉冲为短脉冲等处理。
3. 时间控制模块产⽣时间信号或对时间进⾏设置。
4. 数码管驱动模块负责对时间信号BCD码译码为数码管的段码并且扫描输出到数码管。
下⾯对各个模块分别详细叙述时钟分频模块我打算把时钟分频模块做成“数控N分频器”,通过给分频器传⼊数值N来对时钟信号进⾏N分频。
得到的信号频率为原时钟信号的频率/N,占空⽐为1/N。
稍微考虑下其他模块所需时钟:按键处理模块100Hz ,时间控制模块1Hz,数码管驱动50Hz。
⽽输⼊时钟为33.8688MHz。
我不想传⼊的N数值过⼤,我打算先对时钟进⾏两次:第⼀次调⽤时钟分频模块得到1Mhz,第⼆次得到1Khz。
这样N的位数为10可以满⾜需求。
代码如下library IEEE;use IEEE.STD_LOGIC_1164.all;use IEEE.STD_LOGIC_UNSIGNED.all;entity ClkDiv isport(clk_i:IN STD_LOGIC;N_i: IN STD_LOGIC_VECTOR(9 DOWNTO 0);clk_o:OUT STD_LOGIC);end ClkDiv;architecture behavior of ClkDiv issignal count:STD_LOGIC_VECTOR(9 DOWNTO 0):="0000000001";signal clk_temp:STD_LOGIC:='0';beginprocess(clk_i)beginif(clk_i'EVENT and clk_i='1')thenif (count=N_i)thencount<="0000000001";clk_temp<='1';elsecount<=count+1;clk_temp<='0';end if;end if;end process;clk_o<=clk_temp;end behavior;仿真结果如下:2分频:输出信号为f/2Hz,占空⽐1:23分频:输出信号为f/3Hz,占空⽐1:3按键处理模块去抖动根据以往的经验,按键按下弹起电平会有⼀⼩段⽑刺,可能会引起电路误操作,所以要对按键进⾏消抖处理使变为⼲净的矩形信号。
VHDL数字钟
课程设计报告设计题目:用VHDL语言实现数字钟的设计班级:学号:姓名:指导老师:设计时间:摘要本设计是基于VHDL语言的数字钟,硬件平台是Xilinx的Virtex2系列FPGA 开发板。
该数字钟具备预置年月日时分秒的功能,通过按键还可以改变数字钟显示的内容和进入不同的设置状态,并通过加减按键调整系统时间。
在整个VHDl数字电路系统中,采用层次化设计方法,自顶向下进行设计。
设计中根据系统的功能要求合理划分出层次,进行分级设计和仿真验证,将较为复杂的数字系统逻辑简化为基本的模型从而降低实现的难度。
工程中底层实体实现了年月日、时分秒的双向计数器功能,另外还单独设计了系统的时钟模块,用来生成周期为125Hz的按键扫描时钟和周期为1Hz单位脉冲时钟。
为了消除按键的抖动,为此设计了按键消抖模块,采用了状态机来对按键进行消抖。
为了实现根据年份和月份对当前月的天数的判断逻辑,采用了函数对该逻辑进行分析,给出正确的判断结果。
为了提高利用率,在工程中建立了一个包集文件,对底层实体进行了统一封装,方便顶层的调用。
底层的所有实体系统的顶层主要完成了底层的元件例化,主控状态机对系统的状态转换进行控制,按键响应和时钟重新分配电路则完成了整个系统的控制逻辑。
关键词:层次化设计,元件例化,函数,状态机目录摘要 (2)一、课程设计目的 (4)二、课程设计内容及其要求 (4)三、VHDL程序设计 (5)1.设计方案论证 (5)2.设计思路与方法 (6)3.VHDL源代码及其仿真结果 (7)1、六进制可逆计数器 (7)2、十进制可逆计数器, (9)3、十二进制可逆计数器, (11)4、二十四进制可逆计数器 (13)5、天数计数器 (16)6、判断闰年和月份 (18)7、时钟分频模块 (22)8、按键消抖模块 (24)9、程序包 (27)10、顶层实体(主控状态机) (29)四、编程下载 (38)五、课程设计总结 (38)六、参考文献 (38)一、课程设计目的诞生于1983年的VHDL语言,在1987年被美国国防部和IEEE指定为标准硬件描述语言。
VHDL编程--数字钟
一、数字钟要求:1、能进行正常的时、分、秒计时功能,分别由6个数码管显示24h、60min、60s。
2、可以进行当前时间设置。
二、应用系统功能的详细说明该数字钟使用的是二十四时计时制。
计时时间范围从00:00:00到23:59:59。
当时间及时到23:59:59时,钟面跳转到00:00:00重新下一轮计时。
该数字钟总共有三个按钮,分别是md1控制数字钟的开关,md2(1)控制数字钟的正常运行还是时间设置和md2(0)控制对时还是对分的设置。
md1:为0时,数字钟电源关闭;为1时,数字钟电源开启。
md2(1):为0时,数字钟正常运行;为1时,数字钟进入设置状态。
md2(0):为0时,数字钟对时进行设置;为1时,数字钟对分进行设置。
三、主要模块的算法描述1、扫描显示模块scan6由于试验箱上的8只显示数码管只有16个接脚,当显示四个以上时,每次只能显示一位,所以要显示六位要轮流输出,即扫描显示。
人的视觉暂留大约为1/30s,所以每只数码管闪动频率为32Hz即可。
那么8只数码管轮流显示一遍,2、计时模块hourten,huoroen,minten,minone,secten,secone计时模块共分为6个部分,分别是时、分、秒的十位和个位。
由每位之间的逻辑关系以及md1和md2来控制正常计数、进位和对小时分钟的设置。
3、译码模块dec7s把计时模块输出的时、分、秒各位的二进制数翻译成能在七段数码管上显示的七位二进制码,能够显示0~9各个数字。
四、程序的源代码清单library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity digital_clock isport(clk:in std_logic; --扫描频率,>=256Hz clk1:in std_logic; --计时频率,1Hzmd1:in std_logic; --开关,0时有效md2:in std_logic_vector(1 downto 0); --时间设置dout:out std_logic_vector(6 downto 0); --译码显示ms:out std_logic_vector(5 downto 0)); --扫描控制end digital_clock;architecture one of digital_clock issignal sel:std_logic_vector(2 downto 0);signal hou1,hou2,min1,min2,sec1,sec2:std_logic_vector(3 downto 0);signal time:std_logic_vector(3 downto 0);begin---------------------------------------------scan6scan6:process(clk1,hou1,hou2,min1,min2,sec1,sec2)beginif clk1'event and clk1='1' thenif sel="101" thensel<="000";elsesel<=sel+1;end if;end if;case sel iswhen "000"=>ms<="000001";time<=hou1;when "001"=>ms<="000010";time<=hou2;when "010"=>ms<="000100";time<=min1;when "011"=>ms<="001000";time<=min2;when "100"=>ms<="010000";time<=sec1;when "101"=>ms<="100000";time<=sec2;when others=>ms<="100000";time1=sec2;end case;end process scan6;---------------------------------------------hourtenhourten:process(clk,hou2,min1,min2,sec1,sec2,md1,md2)beginif clk'event and clk='1' thenif (hou1&hou2&min1&min2&sec1&sec2="001000110101100101011001") then hou1<="0000"; --当23:59:59时,时十位归0elsif (hou1&hou2="00100011"and md1&md2="001") thenhou1<="0000"; --当设置小时,时位是23时,时十位归0elsif ((hou2&min1&min2&sec1&sec2="10010101100101011001")or(hou2="1001"and md1&md2="001")) thenhou1<=hou1+1; --当正常计时,时间是x9:59:59时,或设置小时,end if; --时位是x9时,时十位加1end if;end process hourten;---------------------------------------------houronehourone:process(clk,min1,min2,sec1,sec2,md1,md2,hou1)beginif clk'event and clk='1' thenif (hou1&hou2&min1&min2&sec1&sec2="001000110101100101011001") then hou2<="0000"; --当23:59:59时,时个位归0elsif (hou2&min1&min2&sec1&sec2="001000110101100101011001") thenhou2<="0000"; --当x9:59:59时,时个位归0elsif ((hou2="1001"or hou1&hou2="00100011")and(md1&md2="001")) thenhou2<="0000"; --当设置小时,时位是x9或23时,时个位归0 elsif (min1&min2&sec1&sec2="0101100101011001)or(md1&md2="001")then hou2<=hou2+1; --当正常计时,时间是xx:59:59时,或设置小时,时个位加1 end if;end if;end process hourone;---------------------------------------------mintenminten:process(clk,min2,sec1,sec2,md1,md2)beginif clk'event and clk='1' thenif (min1&min2&sec1&sec2="0101100101011001") thenmin1<="0000"; --当xx:59:59时,分十位归0elsif (min1&min2="01011001"and md1&md2="000")thenmin1<="0000"; --当设置分钟,分位是59时,分十位归0elsif (min2&sec1&sec2="100101011001")or --正常计时,时间是xx:x9:59时,或(min2="1001"and md1&md2="000") then --设置分钟,时间是x9,分十位加1min1<=min1+1;end if;end if;end process minten;---------------------------------------------minoneminone:process(clk,sec1,sec2,md1,md2)beginif clk'event and clk='1' thenif (min2&sec1&sec2="100101011001") thenmin2<="0000"; --当xx:x9:59时,分个位归0elsif (min2="1001"and md1&md2="000") thenmin2<="0000"; --当设置分钟,分位是x9时分个位归0elsif (sec1&sec2="01011001")or(md1&md2="000") thenmin2<=min2+1; --正常计时,时间是xx:xx:59时,或设置分钟,分个位加1 end if;end if;end process minone;---------------------------------------------sectensecten:process(clk)beginif clk'event and clk='1' thenif (sec1&sec2="01011001") then --当时间是xx:xx:59时,秒十位归0sec1<="0000";elsif sec2="1001"then --当秒位是x9时,秒十位加1sec1<=sec1+1;end if;end if;end process secten;--------------------------------------------seconesecone:process(clk)beginif clk'event and clk='1' thenif sec2="1001" then --当秒位是x9时,秒个位归0sec2<="0000";else sec2<=sec2+1; --否则加1end if;end if;end process secone;------------------------------------------dec7sdec7s:process(time)begincase time 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 others=>dout<="0111111";end case;end process dec7s;end one;。
用VHDL语言编写的数字钟程序
永州职业技术学院课程设计课程名称:EDA技术实用教程题目:基于FPGA的数字钟设计系、专业:电子技术系应用电子年级、班级:07级电子大专学生姓名:**指导老师:***时间:2008年12月目录一、系统设计………………………………………………………..1.1设计要求……………………………………………………1.1.1任务………………………………………………..1.1.2要求……………………………………………….1.1.3题目分析…………………………………………二.方案论证与比较…………………………………2.1方案一…………………………………………2.2 方案二…………………………………………2.3 方案三…………………………………………三、设计思路……………………………………………………3.1硬件模块………………………………………………3.2软件模块………………………………………………….四、调试情况………………………………………………….五、系统调试…………………………………………………六、心得体会……………………………………………………... 附:参考文献……………………………………………………..用VHDL语言编写的数字钟程序摘要:本设计要求一个12进制或24进制的具有时、分、秒计时功能的数字钟,并要求能进行时、分、秒调整,每逢时有报时功能。
数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
本设计基于FPGA芯片的数字钟的设计,通过多功能数字钟的设计思路,详细叙述了整个系统的硬件、软件实现过程,实现了时间的显示和修改功能、报时功能等,并尽可能的减少误差,使得系统可以达到实际数字钟的允许误差范围内。
关键词:FBGA、数码管、按键一、系统设计1.1 设计要求1.1.1 任务设计并制作一个数字钟,通过设计,掌握电子设计的一般思路,学习电子设计的一般方法。
fpga 闹钟
基于FPGA的闹钟设计与实现专业:电子设计自动化学号:201210525115 姓名:和天留本文在EDA 开发平台上,利用VHDL语言设计数控分频器电路,采用可编程逻辑器件FPGA,经过整体分析、模块化分析、整体与模块的仿真分析三个步骤,使硬件实现了闹钟的显示以及整点报时等功能,其中整点报时采用整体复位、按键选择演奏方式、循环演奏以及数码管显示乐谱的功能。
系统能自动从头开始循环播放,也可随时起停、按键选择播放、循环播放播放中切换歌曲以及发光二极管动态显示播放的音符。
经过实际电路测试验证,达到了设计要求。
1.题目要求1.1功能要求(1)时钟的显示(2)播放歌曲(3)通过LED灯显示音阶(4)按键控制开始与停止(5)切换播放音乐及循环播放1.2设计完成指标(1)实现了能在数码管上显示时钟并且可以调整,设置闹钟。
(2)实现预先设置乐曲的播放功能,实现预置乐曲的暂停和继续播放实时控制功能,实现预置多首乐曲间的切换功能。
(3)为了提供乐曲发音所需要的发音频率,编写数控分频器程序,对单一输入高频,进行预置数分频,生成每个音符发音的相应频率。
为了给分频提供预置数,需要计算分频预置数。
简谱音符和频率关系如下表所示:表1 各音阶频率对应的分频值音名分频系数初始值音名分频系数初始值音名分频系数初始值低音1 1274 773 中音1 637 1410 高音1 319 1728 低音2 1135 912 中音2 587 1480 高音2 277 1770 低音3 1011 1036 中音3 505 1542 高音3 248 1799 低音4 970 1077 中音4 468 1579 高音4 233 1814 低音5 950 1197 中音5 425 1622 高音5 208 1839 低音6 757 1290 中音6 379 1668 高音6 185 1862 低音7 675 1372 中音7 330 1717 高音7 165 18822.系统整体设计2.1系统采用自顶向下的设计思路(1)可调时钟的设计首先利用计数的方式,用数码管实现显示时钟,然后添加按键来设置时钟,最后传出一个整点报时的标志位。
VHDL设计的12进制可调时钟带闹铃功能
VHDL设计的12进制可调时钟带闹铃功能1、顶层原理图如下:2、各模块生成的电路符号如下:分频模块计数模块闹铃模块二选一模块设置闹铃时间模块显示模块3、各模块程序清单如下:(1)、分频模块(将开发板上的50Mhz的信号进行分频得到1hz的计时信号和1khz的位选信号)library ieee; --对开发板上的50MHZ信号进行分频得到1khz和1hz信号use ieee.std_logic_1164.all;entity div_freq isport(freq_in:in std_logic;flag_1khz,flag_1hz: buffer std_logic);end entity;architecture one of div_freq issignal complete_1khz: integer range 0 to 50000;signal complete_1hz: integer range 0 to 1000;signal test_out:std_logic;beginprocess(freq_in) --此进程得到的是1khz的信号beginif(freq_in 'event and freq_in='1') thencomplete_1khz<=complete_1khz+1;if(complete_1khz=50000) thencomplete_1khz<=0;elsif(complete_1khz<25000) thenflag_1khz<='0';elseflag_1khz<='1';end if;end if;end process;process(flag_1khz) --此进程是得到1hz信号beginif(flag_1khz 'event and flag_1khz='1') thencomplete_1hz<=complete_1hz+1;if(complete_1hz=1000)thencomplete_1hz<=0;flag_1hz<='0';elseflag_1hz<='1';end if;end if;test_out<=flag_1hz;end process;end architecture one;(2)、计时模块library ieee; --此模块是时分秒计时程序use ieee.std_logic_1164.all;entity counter isport(flag_1hz:in std_logic; --1hz信号到来时开始计时pause:in std_logic; --计时与调整的选择,决定是自动计时还是按键调整时间add_min:in std_logic; --按键调整分的信号add_hour:in std_logic; --按键调整时的信号cnt_60s:out integer range 0 to 59; --秒计数值cnt_60m:out integer range 0 to 59; --分计数值cnt_12h:out integer range 0 to 11); --时计数值end entity;architecture one of counter issignal sc_c:std_logic; --秒的进位信号signal min_c:std_logic; --分的进位信号signal selector_min:std_logic; --存放秒的进位信号或者分调整的按键信号signal selector_hour:std_logic; --存放分的进位信号或者时调整的按键信号beginprocess(flag_1hz) --此进程是进行60秒计时variable cnt_60s_v:integer range 0 to 59; --存放秒计时的中间变量,最后传到秒输出端cnt_60sbeginif(flag_1hz 'event and flag_1hz='1') thenif(cnt_60s_v=59) thencnt_60s_v:=0;sc_c<='1';elsecnt_60s_v:=cnt_60s_v+1;sc_c<='0';end if;end if;cnt_60s<=cnt_60s_v; --将计数的中间变量传给秒的输出端end process;process(sc_c,add_min) --此进程是进行60分计时variable cnt_60m_v:integer range 0 to 59 ; --存放分计时的中间变量,最后传到分输出端cnt_60mbeginif(pause='0') thenselector_min<=sc_c; --当计时/ 调整信号为0时正常计时,否则按键调整时间elseselector_min<=add_min;end if;if(selector_min 'event and selector_min='1') thenif(cnt_60m_v=59) thencnt_60m_v:=0;min_c<='1'; --分的进位信号elsecnt_60m_v:=cnt_60m_v+1;min_c<='0';end if;end if;cnt_60m<=cnt_60m_v; --将计数的中间变量传给分输出端end process;process(min_c,selector_hour) --此进程是进行12小时计时variable cnt_12h_v:integer range 0 to 11; --存放时的中间变量,最后传到分输出端cnt_60hbeginif(pause='0') thenselector_hour<=min_c;elseselector_hour<=add_hour;end if;if(selector_hour 'event and selector_hour='1') thenif(cnt_12h_v=11) thencnt_12h_v:=0;elsecnt_12h_v:=cnt_12h_v+1;end if;end if;cnt_12h<=cnt_12h_v;end process;end architecture one;(3)、设置闹铃时间模块library ieee; --设置闹铃时间,定时闹铃use ieee.std_logic_1164.all;entity setalarmtime isport(set_alarm,set_sc,set_min,set_hour:in std_logic;sc_data,min_data: out integer range 0 to 59;hour_data:out integer range 0 to 11);end entity ;architecture one of setalarmtime isbeginprocess(set_sc)variable set_sc_data:integer range 0 to 59; --定义局部变量beginif(set_alarm='1') thenif(set_sc 'event and set_sc='1') thenif(set_sc_data=59)thenset_sc_data:=0;elseset_sc_data:=set_sc_data+1; --设置秒end if;end if;end if;sc_data<=set_sc_data; --秒设置好赋值给输出端end process;process(set_min)variable set_min_data:integer range 0 to 59;beginif(set_alarm='1') thenif(set_min 'event and set_min='1') thenif(set_min_data=59)thenset_min_data:=0;elseset_min_data:=set_min_data+1; --设置分end if;end if;end if;min_data<=set_min_data; --分设置好赋值给输出端end process;process(set_hour)variable set_hour_data:integer range 0 to 11;beginif(set_alarm='1') thenif(set_hour 'event and set_hour='1') thenif(set_hour_data=11)thenset_hour_data:=0;elseset_hour_data:=set_hour_data+1; --设置时end if;end if;end if;hour_data<=set_hour_data; --时设置好赋值给输出端end process;end architecture one;(4)、闹铃模块library ieee;--闹铃模块,时间相等则开始闹铃use ieee.std_logic_1164.all;entity alarm isport(sc,min:in integer range 0 to 59;hour:in integer range 0 to 11; --正常计时的时分秒set_sc,set_min:in integer range 0 to 59;set_hour:in integer range 0 to 11; --设置闹铃时间的时分秒clear_alarm:in std_logic; --停止闹铃信号flag_1s:in std_logic; --1hz信号alarm_start:out bit; --开始闹铃信号alarm_end:out bit; --结束闹铃信号flag_alarm:out bit); --闹铃标志信号end entity;architecture one of alarm issignal flag_alarm_start:bit; --定义开始闹铃信号signal flag_alarm_end:bit; --定义结束闹铃信号beginprocess(sc,min,hour)beginif(flag_1s 'event and flag_1s='1') thenif(sc=set_sc and min=set_min hour=set_hour) thenflag_alarm_start<=not flag_alarm_start; --如果正常计时的时间和设置的闹铃时间相等时开始闹铃elseflag_alarm_start<='0'; --如果时间不相等则不闹铃end if;end if;alarm_start<=flag_alarm_start; 将信号赋值给输出端end process;process(clear_alarm)beginif(clear_alarm 'event and clear_alarm='1') thenflag_alarm_end<=not flag_alarm_end; --如果停止闹铃信号到来则停止闹铃end if;alarm_end<=flag_alarm_end;end process;process(flag_alarm_start,flag_alarm_end)beginflag_alarm<=flag_alarm_start xor flag_alarm_end;end process;end architecture one;(5)、二选一模块library ieee; --选择正常计时时间或者设置闹铃时间use ieee.std_logic_1164.all;entity two_sel_one isport(selector:in std_logic;--选择信号sc,min:in integer range 0 to 59;hour: in integer range 0 to 11;--正常计时时间输入端set_sc,set_min:in integer range 0 to 59;set_hour:in integer range 0 to 11; --设置闹铃时间的输入端sc_out,min_out: out integer range 0 to 59;hour_out:out integer range 0 to 11);--二选一选择后输出end entity ;architecture one of two_sel_one isbeginprocess(sc,min,hour,set_sc,set_min,set_hour)beginif(selector='0') thensc_out<=sc;min_out<=min;hour_out<=hour;--如果选择信号为0时,输出的是正常计时时间elsesc_out<=set_sc;min_out<=set_min;hour_out<=set_hour; --如果选择信号为1时,输出的是设置的闹铃时间end if;end process;end architecture one;(6)、显示模块library ieee; --此程序是将时分秒的十位和个位数分开并且转换成段码,还有位选use ieee.std_logic_1164.all;entity display isport(sc_data:in integer range 0 to 59;min_data:in integer range 0 to 59;hour_data:in integer range 0 to 11;flag_1khz:in std_logic; --1khz的位选信号Q:out std_logic_vector(7 downto 0); --接数码管的段码引脚S:out std_logic_vector(7 downto 0)); --接数码管的位选引脚end entity display;architecture one of display issignal sc_l,sc_h,min_l,min_h,hour_l,hour_h:integer range 0 to 9;signal sc_l_q,sc_h_q,min_l_q,min_h_q,hour_l_q,hour_h_q: std_logic_vector(7 downto 0);beginprocess(sc_data,min_data,hour_data) --将时分秒的十位和各位分开beginsc_l<=sc_data mod 10;sc_h<=integer(sc_data/10);min_l<=min_data mod 10;min_h<=integer(min_data/10);hour_l<=hour_data mod 10;hour_h<=integer(hour_data/10);end process;process(sc_l,sc_h,min_l,min_h,hour_l,hour_h) --将时分秒的个位和十位转换成数码管显示的段码begincase(sc_l)is --秒各位when 0 => sc_l_q<="00000011";when 1 => sc_l_q<="10011111";when 2 => sc_l_q<="00100101";when 3 => sc_l_q<="00001101";when 4 => sc_l_q<="10011001";when 5 => sc_l_q<="01001001";when 6 => sc_l_q<="01000001";when 7 => sc_l_q<="00011111";when 8 => sc_l_q<="00000001";when 9 => sc_l_q<="00001001";when others=>null;end case;case(sc_h)is --秒十位when 0 => sc_h_q<="00000011";when 1 => sc_h_q<="10011111";when 2 => sc_h_q<="00100101";when 3 => sc_h_q<="00001101";when 4 => sc_h_q<="10011001";when 5 => sc_h_q<="01001001";when others=>null;end case;case(min_l)is --分个位when 0 => min_l_q<="00000011";when 1 => min_l_q<="10011111";when 2 => min_l_q<="00100101";when 3 => min_l_q<="00001101";when 4 => min_l_q<="10011001";when 5 => min_l_q<="01001001";when 6 => min_l_q<="01000001";when 7 => min_l_q<="00011111";when 8 => min_l_q<="00000001";when 9 => min_l_q<="00001001";when others=>null;end case;case(min_h)is --分十位when 0 => min_h_q<="00000011";when 1 => min_h_q<="10011111";when 2 => min_h_q<="00100101";when 3 => min_h_q<="00001101";when 4 => min_h_q<="10011001";when 5 => min_h_q<="01001001";when others=>null;end case;case(hour_l)is --时个位when 0 => hour_l_q<="00000011";when 1 => hour_l_q<="10011111";when 2 => hour_l_q<="00100101";when 3 => hour_l_q<="00001101";when 4 => hour_l_q<="10011001";when 5 => hour_l_q<="01001001";when 6 => hour_l_q<="01000001";when 7 => hour_l_q<="00011111";when 8 => hour_l_q<="00000001";when 9 => hour_l_q<="00001001";when others=>null;end case;case(hour_h)is --时十位when 0 => hour_h_q<="00000011";when 1 => hour_h_q<="10011111";when others=>null;end case;end process;process(flag_1khz) --此进程是实现数码管动态显示variable counter_10:integer range 0 to 10;beginif(flag_1khz 'event and flag_1khz='1') thenif(counter_10=7) thencounter_10:=0;elsecounter_10:=counter_10+1;end if;end if;case (counter_10)iswhen 0 => S<="01111111";Q<=sc_l_q;when 1 => S<="10111111";Q<=sc_h_q;when 2 => S<="11011111";Q<="11111101";--显示'-'when 3 => S<="11101111";Q<=min_l_q;when 4 => S<="11110111";Q<=min_h_q;when 5 => S<="11111011";Q<="11111101";--显示'-'when 6 => S<="11111101";Q<=hour_l_q;when 7 => S<="11111110";Q<=hour_h_q;when others=>null;end case;end process;end architecture one;4、硬件仿真如下:。
基于VHDL的简易数字钟
课程设计报告设计题目:基于VHDL语言的简易数字钟设计摘要随着电子设计自动化技术(EDA)的进步,数字电路在实际生活当中已经占据了重要的位置。
在EDA技术中,最为瞩目的是以现代电子技术为特征的逻辑设计仿真测试技术。
该技术的出现,使电子系统设计发生了质的变化。
设计速度快、体积小、重量轻、功耗小的集成电路已成为趋势。
用VHDL 语言开发的数字电路,大大简化了对工控电路的设计并且减低了成本。
本文介绍了利用VHDL硬件描述语言设计一款多功能数字钟的方法。
可以实现显示、预置时分秒,年月日(可以准确显示每月天数,包括对闰年的计算);秒表;整点报时的功能。
利用6个7段数码管显示时分秒或年月日。
在Quartus II 开发环境下编译仿真了设计的程序。
仿真结果表明,该设计方法切实可行,具有一定的借鉴性。
关键词:EDA,VHDL,数字钟,Quartus II目录摘要I一、课程设计目的 1二、课程设计内容及要求 12.1 设计内容12.2设计要求 12.3发挥部分1三、VHDL程序设计 13.1整体介绍 13.2时钟模块 23.3日期模块23.4整点报时模块33.5秒表模块4四、仿真与分析 5五、器件编程下载及设计结果 5六、课程设计总结 5七、参考文献 6八、附录7一、课程设计目的掌握利用可编程逻辑器件和EDA设计工具进行电子系统设计的方法二、课程设计内容及要求2.1设计内容用VHDL语言实现数字钟的设计,要求设计实现一个具有带预置数的数字钟,具有显示年月日时分秒的功能。
2.2设计要求用6个数码管显示时分秒,set按钮产生第一个脉冲时,显示切换年月日,第2个脉冲到来时可预置年份,第3个脉冲到来时可预置月份,依次第4、5、6、7个脉冲到来时分别可预置日期、时、分、秒,第 8个脉冲到来后预置结束,正常工作,显示的是时分秒。
Up为高电平时,upclk有脉冲到达时,预置位加1.否则减1.2.3发挥部分本设计除满足基本要求外,还实现了秒表及整点报时的功能。
基于-VHDL语言实现数字电子钟设计
基于VHDL语言实现数字电子钟的设计一.设计要求:1、设计容选用适宜的可编程逻辑器件及外围电子元器件,设计一个数字电子钟,利用EDA软件〔QUARTUS Ⅱ〕进展编译及仿真,设计输入可采用VHDL硬件描述语言输入法〕和原理图输入法,并下载到EDA实验开发系统,连接外围电路,完成实际测试。
2、设计要求〔1〕具有时、分、秒计数显示功能。
〔2〕具有清零的功能,且能够对计时系统的小时、分钟进展调整。
〔3〕小时为十二小时制。
二.实验目的:1.通过这次EDA设计中,提高手动能力。
2.深入了解时事时钟的工作原理,以及时事时钟外围硬件设备的组成。
3.掌握多位计数器相连的设计方法。
4.掌握十进制,六进制,二十四进制计数器的设计方法。
5.继续稳固多位共阴极扫描显示数码管的驱动,及编码。
6.掌握扬声器的驱动。
7.LED灯的把戏显示。
8.掌握CPLD技术的层次化设计方法三.实验方案:数字系统的设计采用自顶向下、由粗到细, 逐步分解的设计方法, 最顶层电路是指系统的整体要求, 最下层是具体的逻辑电路的实现。
自顶向下的设计方法将一个复杂的系统逐渐分解成假设干功能模块, 从而进展设计描述, 并且应用EDA 软件平台自动完成各功能模块的逻辑综合与优化, 门级电路的布局, 再下载到硬件中实现设计。
因此对于数字钟来说首先是时分秒的计数功能,然后能显示,附带功能是清零、调整时分。
通过参考EDA 课程设计指导书,现有以下方案:1.作为顶层文件有输入端口:时钟信号,清零按键,调时按键,调分按键;输出端口有:用于接数码管的八段码输出口,扫描用于显示的六个数码管的输出口。
2.底层文件分为:〔1〕时间计数模块。
分秒计数模块计数为60计数,时计数模块为12计数。
〔2〕显示模块。
显示模块由一个六进制计数器模块和一个七段译码器组成。
进制计数器为六选一选择器的选择判断端提供输入信号, 六选一选择器的选择输出端分别接秒个位、秒十位、分个位、分十位和时个位、时十位的选通位用来完成动态扫描显示,同时依次输出秒个位、秒十位、分个位、分十位和时个位、时十位数向给译码模块。
基于vhdl的电子闹钟设计
基于vhdl的电子闹钟设计基于VHDL的电子闹钟设计电子闹钟是我们日常生活中常用的物品之一,在我们每天的生活中起着非常重要的作用。
现在,大量人们自己亲手打造自己的电子闹钟,这已经成为一种流行的风潮。
其中一种制作闹钟的方法就是使用VHDL语言进行设计,在这里我们将介绍基于VHDL的电子闹钟的设计。
VHDL的定义VHDL是“可综合的硬件描述语言”的缩写,其对于电子器件的设计和工程制造具有极大的重要性。
VHDL可以直接描述数字电路,然后通过其编译器和模拟器生成对应的硬件电路。
它是在20世纪80年代产生的,在当时风靡一时,并且现在仍然是电路仿真和设计过程中的重要工具。
闹钟设计一块基于FPGA开发板上的闹钟的设计步骤从以下几个方面进行:模块划分根据闹钟的功能划分模块,这些模块可以包括:时钟模块(时钟、分钟、秒钟、时令),轮询模块(轮询时钟模块,测量按键状态),SDRAM芯片(用来存储当前时间和闹钟时间),闹铃模块(识别达到设定时间的闹钟)。
时钟模块时钟模块是一个非常重要的模块。
时钟的频率由外部电源提供,频率通常为50Hz,可以通过PLL进行锁相放大处理来获取1秒的时钟信号。
时钟信号用于计算当前时间和闹钟时间。
模块中还必须包括一个开关,在程序中用来控制时钟的启停,以及计时和控制亮度的显示屏。
轮询模块轮询模块用来轮询时钟模块和按键状态。
通过轮询时钟模块,我们可以获取当前时间,并存储在SDRAM芯片中。
同时,我们也可以通过轮询按键状态来检测用户是否更改了设置,如设定时间、闹钟时间和亮度等。
SDRAMSDRAM芯片的作用是用来存储当前时间和闹钟时间。
需要的RAM空间相当小,只需要一些字节就足够了。
因此,常用的8位RAM芯片足以实现此目的。
闹铃模块闹铃模块用于识别设定时间是否和当前时间相同,并在正确的时间触发闹钟响铃。
当闹钟时间到来时,闹铃模块会向用户发出闹钟信号,通过控制LED灯来让用户知道是闹钟响了。
要注意的是,该模块必须在程序运行时轮询保持警醒状态。
VHDL数字时钟
一、功能要求:1、能够分别显示时、分、秒,以24小时循环设计;2、能够对小时、分钟进行调时;3、能够设置闹钟,使其能够在指定时间响;二、设计原理:该数字时钟有三个状态,分别是正常显示状态、调时状态和闹钟设置状态,每当来到一个z的上升沿时,状态改变一次;正常显示状态:对输入的频率clk1进行分频,产生一个与秒的频率相等的频率信号clk,用clk来控制秒的走时,秒的个位每到10往秒的十位进位,秒的十位每到6就往分的个位进位,分的个位十位进位和秒一样,时的个位每到10就往时的十位进位,时的十位每到2就为0;当时间为23:59:59时,全部清零,重新开始计时;调时状态:当处于调时状态时,可对时间进行调整,先选择对哪位进行调整,可分别对分和时的个位和十位进行调整,每当来到一个md2的上升沿时可选中其中一位,每来到一个md3的上升沿时对其进行加“1”操作并设置一个开关allow1,当allow1接通一次时可把设置的时间赋给正常显示的时间,否则不影响正常显示的时间;闹钟设置状态:当处于闹钟设置状态时,同样通过md2选择要调整的位,并通过md3对其进行加“1”操作,并设置一个闹钟开关allow2,接通时闹钟开启;数字显示:对6个显示器用一个频率进行循环扫描,利用人眼停留的效果使其达到同时显示的效果;三、变量说明:端口说明:clk1:输入频率md1:负责对时钟状态的切换,每接通一次,状态就切换一次md2:在调时状态和闹钟设置状态时,负责选定对那个位进行操作(时的个位和十位,分的个位和十位)md3:负责对所选中的位进行加“1”操作,每接通一次,就加“1”allow1:负责是否确定对时钟的设置,设置好时钟后,若allow1接通一次,时钟就被修改;若allow1没有接通,则所调整的时间对原来的时钟没有影响allow2:负责是否确定开启闹钟,当allow2处于接通状态时,时钟到了设置的时间闹钟会响,断开allow2闹钟关闭speak:负责闹钟的发声dout,sellout:负责板子上显示管的显示数字内部变量说明:sel:选择哪个位置显示数counter:对输入频率进行分频,得出秒的频率clkcounter1:对输入频率进行分频,得出闹钟发声的频率z:选择时钟的状态,“00”为正常显示状态,“01”为调整状态,“10”为闹钟设置状态k:选择要对哪位进行操作,“00”为分的个位,“01”为分的十位,“10”为时的个位,“11”为时的十位hou1,hou2,min1,min2,sec1,sec2:分别代表正常显示状态下的时的十位,个位;分的十位,个位;秒的十位,个位;hou1n,hou2n,min1n,min2n,:分别代表处于调时状态时的时和分的十位和个位;seth1,seth2,setm1,setm2:分别代表处于闹钟设置状态的时和分的十位和个位;h1,h2,m1,m2,s1,s2:分别代表最终显示在板子上的时、分、秒的十位和个位;四、源代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity zhong isport(clk1:in std_logic;md1:in std_logic;-----xuan ze zhuang taimd2:in std_logic;------xuan ze she zhi na ge wei zhimd3:in std_logic;------jia yiallow1:in std_logic;allow2:in std_logic;speak:out std_logic;-----nao zhongdout:out std_logic_vector(6 downto 0);-------shu chuselout:out std_logic_vector(5 downto 0));-----xuan ze xian shi end zhong;architecture one of zhong issignal sel:std_logic_vector(2 downto 0);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 hou1n:std_logic_vector(3 downto 0);signal hou2n:std_logic_vector(3 downto 0);signal min1n:std_logic_vector(3 downto 0);signal min2n:std_logic_vector(3 downto 0);signal seth1:std_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);signal h1:std_logic_vector(3 downto 0);signal h2:std_logic_vector(3 downto 0);signal m1:std_logic_vector(3 downto 0);signal m2:std_logic_vector(3 downto 0);signal s1:std_logic_vector(3 downto 0);signal s2:std_logic_vector(3 downto 0);signal counter:std_logic_vector(8 downto 0);-----------secondsignal countern1:std_logic_vector(7 downto 0);----------speakersignal clk:std_logic;----------secondsignal clkn1:std_logic;-----speakersignal k:std_logic_vector(1 downto 0);---------xuan ze xian shisignal z:std_logic_vector(1 downto 0);------00 zheng chang ;01 tiao zheng;10 nao ling;-------------------------------------------------beginfen:process(clk1)beginif(clk1'event and clk1='1')thenif(counter="110000000")thencounter<="000000000";clk<=not clk;elsecounter<=counter+'1';end if;if(countern1="10000000")thencountern1<="00000000";elseclkn1<=not clkn1;end if;end if;end process fen;-------------------------------------------kong:process(md2)beginif( md2'event and md2='1')thenif(k="11")thenk<="00";elsek<=k+1;end if;end if;end process kong;process(md1)beginif(md1'event and md1='1')thenif(z="10")thenz<="00";elsez<=z+1;end if;end if;end process;----------------------------------------------choice:process(clk1)beginif clk1'event and clk1='1' thenif sel="101" thensel<="000";elsesel<=sel+1;end if;end if;end process choice;-------------------------------------------zheng chang xian shi-----------------------------------------------hour1hou_1:process(clk,hou2,min1,min2,sec1,sec2)beginif clk'event and clk='1' thenif (hou1="0010" and hou2="0011" and min1="0101" and min2="1001" and sec1="0101" andsec2="1001") thenhou1<="0000";elsif (hou2="1001"and min1="0101" and min2="1001" and sec1="0101" and sec2="1001") thenhou1<=hou1+1;end if;end if;if(allow1='1' and z="01")thenhou1<=hou1n;end if;end process hou_1;-----------------------------------------------hour2hou_2:process(clk,min1,min2,sec1,sec2,hou1)beginif clk'event and clk='1' thenif (hou1="0010" and hou2="0011"and min1="0101" and min2="1001" and sec1="0101" andsec2="1001") thenhou2<="0000";elsif hou2="1001"and(min1="0101" and min2="1001" and sec1="0101" and sec2="1001") thenhou2<="0000";elsif (min1="0101" and min2="1001" and sec1="0101" and sec2="1001")thenhou2<=hou2+1;end if;end if;if(allow1='1' and z="01")thenhou2<=hou2n;end if;end process hou_2;-----------------------------------------------min1min_1:process(clk,min2,sec1,sec2)beginif clk'event and clk='1' thenif (min1="0101" and min2="1001" and sec1="0101" and sec2="1001") then min1<="0000";elsif (min2="1001"and sec1="0101" and sec2="1001") thenmin1<=min1+1;end if;end if;if(allow1='1' and z="01")thenmin1<=min1n;end if;end process min_1;----------------------------------------------min2min_2:process(clk,sec1,sec2)beginif clk'event and clk='1' thenif (min2="1001" and sec1="0101" and sec2="1001")thenmin2<="0000";elsif (sec1="0101" and sec2="1001")thenmin2<=min2+1;end if;end if;if(allow1='1' and z="01")thenmin2<=min2n;end if;end process min_2;---------------------------------------------second1sec_1:process(clk)beginif clk'event and clk='1' thenif (sec1="0101" and sec2="1001")thensec1<="0000";elsif sec2="1001"thensec1<=sec1+1;end if;end if;if(allow1='1' and z="01")thensec1<="0000";end if;end process sec_1;--------------------------------------------second2sec_2:process(clk)beginif clk'event and clk='1' thenif sec2="1001" thensec2<="0000";else sec2<=sec2+1;end if;end if;if(allow1='1' and z="01")thensec2<="0000";end if;end process sec_2;-----------------------------------------------------------------------------------shi jian tiao zheng process(md3)-----------hour1beginif(z="01")thenif(k="11")thenif(md3'event and md3='1')thenif(hou1n="0010")thenhou1n<="0000";elsehou1n<=hou1n+1;end if;end if;end if;end if;end process;process(md3)-----------hour2beginif(z="01")thenif(k="10")thenif(md3'event and md3='1')thenif(hou2n="1001")or(hou1n="0010" and hou2n="0011")then hou2n<="0000";elsehou2n<=hou2n+1;end if;end if;end if;end if;end process;process(md3)-----------min1beginif(z="01")thenif(k="01")thenif(md3'event and md3='1')thenif(min1n="0110")thenmin1n<="0000";elsemin1n<=min1n+1;end if;end if;end if;end if;end process;process(md3)------------min2beginif(z="01")thenif(k="00")thenif(md3'event and md3='1')thenif(min2n="1001")thenmin2n<="0000";elsemin2n<=min2n+1;end if;end if;end if;end if;end process;--------------------------------------------------------------------------------------she zhi nao zhong sethour1:process(md3)beginif(z="10")thenif(k="11")thenif(md3'event and md3='1')thenif(seth1="0010")thenseth1<="0000";elseseth1<=seth1+1;end if;end if;end if;end if;end process sethour1;-------------------------------------------sethour2:process(md3)beginif(z="10")thenif(k="10")thenif(md3'event and md3='1')thenif(seth2="1001")or(seth2="0010" and seth2="0100")then seth2<="0000";elseseth2<=seth2+1;end if;end if;end if;end if;end process sethour2;-------------------------------------------setmin1:process(md3)beginif(z="10")thenif(k="01")thenif(md3'event and md3='1')thenif(setm1="0110")thensetm1<="0000";elsesetm1<=setm1+1;end if;end if;end if;end if;end process setmin1;----------------------------------------------setmin2:process(md3)beginif(z="10")thenif(k="00")thenif(md3'event and md3='1')thenif(setm2="1001")thensetm2<="0000";elsesetm2<=setm2+1;end if;end if;end if;end if;end process setmin2;----------------------------------------------------------------------------------------nao zhongspeaker:process(clk1,hou1,hou2,min1,min2)beginif clk1'event and clk1='1'thenif(allow2='1')thenif seth1=hou1 and seth2=hou2 and setm1=min1 and setm2=min2 thenspeak<=clkn1;elsespeak<='0';end if;end if;end if;end process speaker;--------------------------------------------------------------------------------------disp:process(sel,md1,hou1,hou2,min1,min2,sec1,sec2,seth1,seth2,setm1,setm2) beginif sel="000" thenselout<="111110";case h1 iswhen "0000"=>dout<="1000000";--0when "0001"=>dout<="1111001";--1when "0010"=>dout<="0100100";--2when others =>dout<="1000000";--0end case;elsif sel="001" thenselout<="111101";case h2 iswhen "0000"=>dout<="1000000";--0when "0001"=>dout<="1111001";--1when "0010"=>dout<="0100100";--2when "0011"=>dout<="0110000";--3when "0100"=>dout<="0011001";--4when "0101"=>dout<="0010010";--5when "0110"=>dout<="0000010";--6when "0111"=>dout<="1111000";--7when "1000"=>dout<="0000000";--8when "1001"=>dout<="0010000";--9when others=>dout<="1000000";end case;elsif sel="010" thenselout<="111011";case m1 iswhen "0000"=>dout<="1000000";--0 when "0001"=>dout<="1111001";--1 when "0010"=>dout<="0100100";--2 when "0011"=>dout<="0110000";--3 when "0100"=>dout<="0011001";--4 when "0101"=>dout<="0010010";--5 when others=>dout<="1000000";--0 end case;elsif sel="011" thenselout<="110111";case m2 iswhen "0000"=>dout<="1000000";--0 when "0001"=>dout<="1111001";--1 when "0010"=>dout<="0100100";--2 when "0011"=>dout<="0110000";--3 when "0100"=>dout<="0011001";--4 when "0101"=>dout<="0010010";--5 when "0110"=>dout<="0000010";--6 when "0111"=>dout<="1111000";--7 when "1000"=>dout<="0000000";--8 when "1001"=>dout<="0010000";--9 when others=>dout<="1000000";--0 end case;elsif sel="100" thenselout<="101111";case s1 iswhen "0000"=>dout<="1000000";--0 when "0001"=>dout<="1111001";--1 when "0010"=>dout<="0100100";--2 when "0011"=>dout<="0110000";--3 when "0100"=>dout<="0011001";--4 when "0101"=>dout<="0010010";--5 when others=>dout<="1000000";--0 end case;elsif sel="101" thenselout<="011111";case s2 iswhen "0000"=>dout<="1000000";--0 when "0001"=>dout<="1111001";--1 when "0010"=>dout<="0100100";--2 when "0011"=>dout<="0110000";--3 when "0100"=>dout<="0011001";--4 when "0101"=>dout<="0010010";--5when "0110"=>dout<="0000010";--6when "0111"=>dout<="1111000";--7when "1000"=>dout<="0000000";--8when "1001"=>dout<="0010000";--9when others=>dout<="1000000";--0end case;end if;if z="00" then---------------zheng chang xian shih1<=hou1;h2<=hou2;m1<=min1;m2<=min2;s1<=sec1;s2<=sec2;elsif z="01"thenh1<=hou1n;h2<=hou2n;m1<=min1n;m2<=min2n;s1<="0000";s2<="0000";elsif z="10" then ----------------nao zhong xian shi h1<=seth1;h2<=seth2;m1<=setm1;m2<=setm2;s1<="0000";s2<="0000";end if;end process disp;------------------------------------------end one;11。
(2024版)vhdl数字时钟设计
可编辑修改精选全文完整版一、题目分析1、功能介绍(1)具有时、分、秒计数显示功能,以24小时循环计时。
(2)时钟计数显示时有LED灯的花样显示。
(3)具有调节小时、分钟及清零的功能。
(4)具有整点报时功能。
2、总体方框图3、性能指标及功能设计1)时钟计数:完成时、分、秒的正确计时并且显示所计的数字;对秒、分——60进制计数,即从0到59循环计数,时钟——24进制计数,即从0到23循环计数,并且在数码管上显示数值。
2)时间设置:手动调节分钟、小时,可以对所设计的时钟任意调时间,这样使数字钟真正具有使用功能。
我们可以通过实验板上的键7和键4进行任意的调整,因为我们用的时钟信号均是1HZ的,所以每LED灯变化一次就来一个脉冲,即计数一次。
3)清零功能:reset为复位键,低电平时实现清零功能,高电平时正常计数。
可以根据我们自己任意时间的复位。
4)蜂鸣器在整点时有报时信号产生,蜂鸣器报警。
产生“滴答.滴答”的报警声音。
5)LED灯在时钟显示时有花样显示信号产生。
即根据进位情况,LED不停的闪烁,从而产生“花样”信号。
二、选择方案1、方案选择方案一:根据总体方框图及各部分分配的功能可知,本系统可以由秒计数器、分钟计数器、小时计数器、整点报时、分的调整以及小时的调整和一个顶层文件构成。
采用自顶向下的设计方法,子模块利用VHDL语言设计,顶层文件用原理图的设计方法。
显示:小时采用24进制,而分钟均是采用6进制和10进制的组合。
方案二:根据总体方框图及各部分分配的功能可知,本系统可以由秒计数器、分钟计数器、小时计数器、整点报时、分的调整以及小时的调整和一个顶层文件构成。
采用自顶向下的设计方法,子模块利用VHDL语言设计,顶层文件用原理图的设计方法。
显示:小时采用24进制,而分钟和秒均60进制。
终上所述,考虑到试验时的简单性,故我选择了方案二。
三、细化框图根据自顶向下的方法以及各功能模块的的功能实现上述设计方案应系统细化框图:四、编写程序、仿真和分析1、秒计数器1)VHDL 语言描述程序见附录 2)秒计数器的仿真波形图3)波形分析利用60进制计数器完成00到59的循环计数功能,当秒计数至59时,再来一个时钟脉冲则产生进位输出,即enmin=1;reset 作为复位信号低电平有效,数字时钟控制单元 时调整 分调整使能端信号 CLK 信号时显示 分显示 秒显示24进制 60进制 60进制LED 显示整点报花样显即高电平时正常循环计数,低电平清零。
VHDL课程设计---多功能数字钟
多功能电子时钟报告一、实验目的1.学习数字系统设计的自顶向下设计法及控制器的设计。
2.加深利用EDA技术实现数字系统的体会。
二、实验仪器及器件1.EDA 开发软件(Quartus7.2)(1套)2.电脑(1台)3.实验板(1个)三、实验要求及设计方案1.设计一个具有24进制计时、显示、整点报时、时间设置和闹钟功能的数字钟,要求时钟的最小分辨率时间为1s。
2.数字钟的设计方案如下:系统输入:mode为计时显示和闹钟定时显示转换输入;set为校时和定时设置的时、分、秒转换输入;k为校时的时、分、秒手动加1输入;4*4矩阵键盘为闹钟设置调节闹钟的时、分、秒、时钟的清零以及暂停;clk40M为板载时钟信号;reset为系统复位信号。
输入信号均由按键和4*4矩阵键盘产生。
系统输出:七段数码管显示输出;蜂鸣器(bell)声音信号输出(用LED灯代替)。
3.多功能数字钟系统功能的具体描述如下:计时:正常工作状态下,每日按24小时计时制计时并显示,蜂鸣器逢整点报时。
校时:在计时显示状态下,按下“set键”,进入“小时”校时状态,再次按下“set键”,进入“分”校时状态,继续按下“set键”,进入“秒”校时状态,第四次按下“set键”又回复到正常计时显示状态。
1)“小时”校时状态:进入“小时”校时状态后,显示“小时”的数码管闪烁,每按动“k”键一次,“小时”+1,若不按动“k”键则小时数不变,一直按下“k”键则小时数以4Hz的频率递增计数。
2)“分”校时状态:进入“分”校时状态后,显示“分”的数码管闪烁,每按动“k”键一次,“分”+1,若不按动“k”键则分数不变,一直按下“k”键则分数以4Hz的频率递增计数。
3)“秒”校时状态:进入“秒”校时状态后,显示“秒”的数码管闪烁,每按动“k”键一次,“秒”+1,若不按动“k”键则秒数不变,一直按下“k”键则秒数以4Hz的频率递增计数。
整点报时:蜂鸣器在“59”分钟的第51、53、55、57秒发出频率为512Hz的低音,在“59”秒发出频率为1024Hz的高音,结束时为整点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计:多功能数字闹钟的设计专业:电气工程与自动化姓名:陶静、孙韬学号:**********、**********引言人类社会已进入到高度发达的信息化社会,信息社会的发展离不开电子产品的进步。
现代电子产品在性能提高、复杂度增大的同时,价格却一直呈下降趋势,而且产品更新换代的步伐也越来越快,实现这种进步的主要因素是生产制造技术和电子设计技术的发展。
前者以微细加工技术为代表,目前已进展到深亚微米阶段,可以在几平方厘米的芯片上集成数千万个晶体管。
后者的核心就是EDA技术,EDA是指以计算机为工作平台,融合应用电子技术、计算机技术、智能化技术最新成果而研制成的电子CAD通用软件包,主要能辅助进行三方面的设计工作:IC设计,电子电路设计,PCB设计。
没有EDA技术的支持,想要完成上述超大规模集成电路的设计制造是不可想象的,反过来,生产制造技术的不断进步又必将对EDA技术提出新的要求。
回顾近30年电子设计技术的发展历程,可将EDA技术分为三个阶段。
七十年代为CAD阶段,人们开始用计算机辅助进行IC版图编辑、PCB布局布线,取代了手工操作,产生了计算机辅助设计的概念。
八十年代为CAE阶段,与CAD相比,除了纯粹的图形绘制功能外,又增加了电路功能设计和结构设计,并且通过电气连接网络表将两者结合在一起,实现了工程设计,这就是计算机辅助工程的概念。
CAE的主要功能是:原理图输入,逻辑仿真,电路分析,自动布局布线,PCB后分析。
九十年代为ESDA阶段,尽管CAD/CAE技术取得了巨大的成功,但并没有把人从繁重的设计工作中彻底解放出来。
在整个设计过程中,自动化和智能化程度还不高,各种EDA软件界面千差万别,学习使用困难,并且互不兼容,直接影响到设计环节间的衔接。
基于以上不足,人们开始追求:贯彻整个设计过程的自动化,这就是ESDA即电子系统设计自动化。
高层次设计给我们提供了一种%26ldquo;自顶向下%26rdquo;(Top%26ndash;Down)的全新设计方法,这种设计方法首先从系统设计入手,在顶层进行功能方框图的划分和结构设计。
在方框图一级进行仿真、纠错,并用硬件描述语言对高层次的系统行为进行描述,在系统一级进行验证。
然后用综合优化工具生成具体门电路的网表,其对应的物理实现级可以是印刷电路板或专用集成电路。
由于设计的主要仿真和调试过程是在高层次上完成的,这一方面有利于早期发现结构设计上的错误,避免设计工作的浪费,同时也减少了逻辑功能仿真的工作量,提高了设计的一次成功率。
现代电子产品的复杂度日益加深,一个电子系统可能由数万个中小规模集成电路构成,这就带来了体积大、功耗大、可靠性差的问题,解决这一问题的有效方法就是采用ASIC(Application Specific Integrated Circuits)芯片进行设计。
ASIC按照设计方法的不同可分为:全定制ASIC,半定制ASIC,可编程ASIC(也称为可编程逻辑器件)。
设计全定制ASIC 芯片时,设计师要定义芯片上所有晶体管的几何图形和工艺规则,最后将设计结果交由IC厂家掩膜制造完成。
优点是:芯片可以获得最优的性能,即面积利用率高、速度快、功耗低。
缺点是:开发周期长,费用高,只适合大批量产品开发。
半定制ASIC芯片的版图设计方法有所不同,分为门阵列设计法和标准单元设计法,这两种方法都是约束性的设计方法,其主要目的就是简化设计,以牺牲芯片性能为代价来缩短开发时间。
可编程逻辑芯片与上述掩膜ASIC的不同之处在于:设计人员完成版图设计后,在实验室内就可以烧制出自己的芯片,无须IC厂家的参与,大大缩短了开发周期。
20世纪末,电子技术获得了飞速的发展,在其带动下,现代电子产品几乎渗透了社会的各个领域,有力的推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
现代电子设计技术的核心是EDA技术。
EDA技术就是依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言VHDL为系统逻辑描述手段完成的设计文件,自动的完成逻辑编译、逻辑化简、逻辑分割、逻辑综合、结构综合,以及逻辑优化和仿真测试,直至实现既定的电子线路系统功能。
EDA技术使得设计者的工作仅限于利用软件的方式,即利用硬件描述语言和EDA软件来完成对系统硬件功能的实现。
从另一方面看,在现代到新电子产品的设计和生产中,微电子技术和现代电子设计技术时互相促进、互相推动又相互制约的两个技术环节。
前者代表了物理层在广度和深度上硬件电路实现的发展,后者则反应了现代先进的电子理论、电子技术、仿真技术、设计。
工艺和设计技术与最新的计算机软件技术有机的融合和升华。
因此,严格的说,EDA 技术已不是某一学科的分支,或某种新的技能技术,它应该是一门综合性学科。
它融合多学科于一体,又渗透于各学科之中,打破了软件和硬件间的壁垒,使计算机的软件技术与硬件实现、设计效率和产品性能合二为一,它代表了电子设计技术和应用技术的发展方向。
作为当代大学生,特别是信息工程类的学生,EDA技术是知识体系中不可缺少的一部分。
所以我们这次课程设计是基于EDA技术来设计一个闹钟系统,通过对EDA的实际应用来更加充分的认识、使用和发展EDA 技术。
一、设计任务与要求1、设计要求(1)有“时”、“分”、“秒”十进制显示;(2)计时以24小时为周期;(3)具有校时电路,能对当前时间进行校对,(校对小时和分钟);(4)整点报时;(5)闹钟起闹(整点起闹)。
2、系统设计3、主体设计(1)秒信号发生器(2)计时部分框图(3)校时电路当数字钟接通电源或者计时出现误差时,均需要校正时间,校时是数字钟应具备的基本功能方案:快脉冲。
将所需要校对的时或分计数电路的脉冲输入端切换到秒信号,使之用快脉冲计数,当到达标准时间后再切换回正确的输入信号,达到校准目的;(4)定时起闹要求整点起闹,不要求分;可以用点亮发光二极管来表示。
(5)整点报时每到整点时起闹。
二、设计原理、方案1、系统结构描述(一)系统的顶层文件:1、顶层文件图:(见下页)2、各模块的解释:(1)、7个输入量clk,rst,alinem,alineh,alarm:其中clk为1KHZ,给数码管译码模块提供刷新频率,并且经过三个74163十倍分频变为1HZ给秒模块,闹铃模块,校准模块等提供脉冲。
Res为复位输入端:按下的时候时钟时间全部清零;alinem,alineh为分、时的校准开关:按下的时候能够使分、时以秒的速度跳动,达到校时的功能。
Alarm为闹钟设定开关:按下时设定闹钟时间。
(2)4个输出端口:sg[7..0]、bt[7..0]、point、ledalarm。
其中sg[7..0]为数码管的段选,bt[7..0]为数码管的位选。
Point为整点报时的闹铃输出端,ledalarm为闹钟时的响铃输出端。
(3)、CNT60s模块:这个模块式将clk_1hz这个时钟信号进行60进制计数,并产生一个分钟的触发信号。
该模块能将当前计数值实时按BCD码的格式输出。
将该输出接到两位LED数码后能时时显示秒的状态。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt60 isport(clk,rst:in std_logic;co:out std_logic;qh,ql:buffer std_logic_vector(3 downto 0));end cnt60;architecture behave of cnt60 isbeginprocess(rst,clk)beginif(rst='0')then ql<="0000";qh<="0000";elsif(clk'event and clk='1')thenif(ql=9) then ql<="0000";if (qh=5) thenqh<="0000";co<='1';elseqh<=qh+1;end if;else ql<=ql+1;co<='0';end if;end if;end process;end behave;(4)、CNT60M模块:这个模块式将CNT60S或者1HZ的clk的输出信号进行60进制计数,并产生一个时位的触发信号。
该模块能将当前计数值实时按BCD码的格式输出。
将该输出接到两位LED数码后能时时显示分的状态。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt60 isport(clk,rst:in std_logic;co:out std_logic;qh,ql:buffer std_logic_vector(3 downto 0));end cnt60;architecture behave of cnt60 isbeginprocess(rst,clk)beginif(rst='0')then ql<="0000";qh<="0000";elsif(clk'event and clk='1')thenif(ql=9) then ql<="0000";if (qh=5) thenqh<="0000";co<='1';elseqh<=qh+1;end if;else ql<=ql+1;co<='0';end if;end if;end process;end behave;(5)、CNT24H这个模块式将CNT60M或者1HZ的clk的输出信号进行24进制计数,并产生一个时位的触发信号。
该模块能将当前计数值实时按BCD码的格式输出。
将该输出接到两位LED数码后能时时显示分的状态。
library ieee ;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt24h isport(clk,rst:in std_logic ;ql,qh:buffer std_logic_vector(3 downto 0));end cnt24h;architecture behave of cnt24h isbeginprocess(clk,rst)variable y0,y1:std_logic_vector(3 downto 0);beginif(rst='0')then ql<="0000";qh<="0000";elsif(clk'event and clk='1')thenif(ql=9 or (qh=2 and ql=3)) then ql<="0000";if (qh=2) thenqh<="0000";elseqh<=qh+1;end if;else ql<=ql+1;end if;end if;end process ;end behave ;(6)、ALINE模块这个模块是校时模块,有两个时钟输入端,一个是秒信号输入,一个是进位信号输入。