VHDL 数字钟
VHDL多功能数字钟
一、设计要求设计一个能进行时、分、秒计时的十二小时制或二十四小时制的数字钟,并具有定时与闹钟功能,能在设定的时间发出闹铃音,能非常方便地对小时、分钟和秒进行手动调节以校准时间,每逢整点,产生报时音报时。
二、设计环境:Quartus II三、系统框图四、模块说明1、分频器模块(1)模块说明:输入一个频率为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);END fdiv ;ARCHITECTURE bhv OF fdivIS图4-1-1数字钟系统框图BEGINP1KHZ:PROCESS(CLK)VARIABLE cout:INTEGER:=0;BEGINIF CLK'EVENT AND CLK='1'THENcout:=cout+1;--每来个时钟上升沿时cout开始计数IF cout<=25000THEN q1KHz<='0';--当cout<=25000时,q1KHz输出“0”ELSIF cout<50000THEN q1KHz<='1';--当25000<cout<=50000时,q1KHz ELSE cout:=0;--输出“1”,完成1KHz频率输出END 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=1THEN q500Hz<='0';--二分频ELSIF cout=2THEN cout:=0;q500Hz<='1';END IF;END IF;END PROCESS;P2HZ:PROCESS(q500Hz)VARIABLE cout:INTEGER:=0;BEGINIF q500Hz'EVENT AND q500Hz='1'THENcout:=cout+1;IF cout<=125THEN q2Hz<='0';ELSIF cout<250THEN 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=1THEN q1Hz<='0';ELSIF cout=2THEN cout:=0;q1Hz<='1';END IF;END IF;END PROCESS;END bhv;(3)模块图:2、控制器模块(1)模块说明:输入端口enset,k,set键来控制6个状态,这六个状态分别是显示计时时间状态,调计时的时、分、秒状态,调闹铃的时、分的状态,reset键是复位键,用来回到显示计时时间的状态。
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编程--数字钟
一、数字钟要求: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语言的数字钟设计
信息与通信工程学院数字电路与逻辑设计实验题目:基于VHDL语言的数字钟设计班级:姓名:学号:日期:指导教师:一.摘要数字钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置。
它的基本功能是计时,计时周期为24小时,显示满刻度23时59分59秒;或者计时周期为12小时并配有上下午指示,显示满刻度为11时59分59秒,通过六个七段数码管显示出来。
本实验主要在理论分析和具体的软硬件实现上,基于VHDL语言编写源代码,使用软件Quartus II 进行处理,再配合具体电路连接,实现一个多功能的数字钟。
关键词:数字钟;VHDL语言;七段数码管二.设计任务要求设计实现一个数字钟。
1.24小时制,显示刻度从0:0:0到23:59:59 。
2.12小时制,显示刻度从0:0:0到11:59:59 。
3.12/24小时制可切换,12小时制下上下午有不同显示(上午发光二极管不亮,下午发光二极管亮)。
4.可手动校对时间,能对时和分进行校正。
5.整点报时功能。
6.闹铃功能,可设置闹铃时间,当计时到预定时间时,蜂鸣器发出闹铃信号,闹铃时间为5秒,可提前终止闹铃。
7.可认为设置时间为倒计时模式8.可切到屏保模式,六个数码管显示为“supper”字样。
三.设计思路和总体设计框图1.设计思路程序设计主要分为四个模块,第一部分,做分频器,分出一秒的时钟用来计数,再分出一个中频时钟用来扫描显示数码管,我选择的频率是50kHZ;第二部分,做计数器,秒随时钟沿计数进1,分钟随着秒计数60次进一,而小时,由于有12/24小时制的切换,时的计数有两个信号来进行,一个信号hour1是分60进一在0到23循环计数,另一个信号hour2是分60进一在0到11循环计数;第三部分,做扫描显示六个七段数码管,通过选通信号6矢量cat来依次使六个数码管亮,数码管每两位对应相应的时分秒;第四部分,其他输入输出单元,比如数字钟的时间修正,闹铃等,这些都是基于前三个部分,做起来难度不大。
数字钟VHDL
数字电子钟设计目录一 . 设计目的二 . 设计要求三 . 设计方案四 . 设计原理五 . 设计过程六 . 调试过程中的问题和解决方法七. 设计小结八.VHDL程序九 . EDA实物图片十. 参考书目一、设计目的1.熟练地运用数字系统的设计方法进行数字系统的设计;2.掌握运用数字钟的VHDL语言设计方法;3.熟悉编程的过程;4.理解运用分频、计时、多路选择器等课本理论;5.进一步的学习电路的调试;二、设计要求1、显示(1)小时——分钟——秒钟(2)小时、分钟和秒钟各用两个数码管来显示(3)小时、分钟、秒钟之间用一杠来显示(4)杠每秒闪烁一次2、时钟(1)一个时钟3、整点报时(当整点的时候,LED闪烁)4、校准(1)能够实现对小时、分钟、秒钟的调整(2)按键去抖动三、设计方案:1、采用一个时钟信号,即扫描时钟,而秒时钟通过扫描时钟分频得到的。
2、利用嵌套的模式,在秒时钟的情况下且无模式选择时,让秒分时自动跳时。
3、使用防抖动的原理,减少按键产生的干扰。
4、当按键an1有效时,运用多路选择器,依次实现校时、校分和校秒多种模式的选择,在校准模式的时候,让数码管闪烁,杠不闪烁。
当按键an2有效时,当模式选择在校时或校分或校秒时,其数码管显示的值累加;当按键an3有效时,当模式选择在校时或校分或校秒时,其数码管显示的值递减。
5、在整点时,运用流水灯进行整点报时显示。
6、用阴极数码管来译码显示时分秒的数值。
四、设计原理1、定义模块1、动态扫描模块2、分频模块3、去抖动模块4、模式选择模块5、(显示+闪烁)模块6、跳时模块7、校时模块(加法模块和减法模块)8、整点报时模块(LED灯移位显示模块)9、译码模块五、设计过程1、定义模块(1)、定义实体:对输入信号(扫描时钟sec_clk,按键(an1,an2,an3))、输出信号(动态扫描seg,LED输出temp,七段数码管data)进行声明(2)、定义结构体:对中间信号进行声明。
VHDL设计多功能数字钟
EDA期末作业班级:020914(一)选题目的学习使用QuartusII 9.0,巩固已掌握的EDA知识,增强自己的动手实践能力。
(二)设计目标实现多功能数字钟的设计,主要有以下功能:①计时,并且可以24小时制和12小时制转换。
②闹钟③整点报时④秒表(三)实现方案该课题的实现过程大体如下:先对4MHZ的信号进行分频使其变为1HZ;将该信号加入计数器中(模60和模24/12)实现基本时钟功能;然后在此基础上加入闹钟,秒表,整点报时,24/12小时制转换模块;最后在动态显示电路中实现上述功能。
(四)设计过程、模块仿真及实现结果一、分频器分频器的VHDL语言为(4M分频)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpinqi isport(clk_in : in std_logic;clk_out : out std_logic);end fenpinqi;architecture behivor of fenpinqi issignal cou : std_logic_vector(21 downto 0);beginprocess(clk_in)beginif clk_in'event and clk_in='1' thencou<=cou+1;end if;end process;process(cou)beginclk_out<=cou(21);end process;end architecture behivor;完成4Mhz到1hz的转换仿真结果略。
二、计时器(模60,模24,模12)模60设计的电路图如下模24/12计数器如下合成模块分别如下仿真波形如下M60波形分析:ql[3..0]从0变到9,qh[3..0]从0变到5,当clk经过60个周期后,co输出一个脉冲。
VHDL--数字钟.
1.实验目的1.学习数字钟的基本原理2.学习数字钟的基本设计方法3.学习数字钟的校时控制的基本设计方法4.学习数字钟的中可变进制计数器的设计方法5.掌握采用VHDL 语言设计频率测量和周期测量2.实验原理数字钟的主要功能有年月日时分秒的显示输出功能,以及对日期和时间进行设置的功能,还可以有整点报时,闹钟功能。
设计数字钟的核心问题是时钟日期的自动转换功能。
即自动识别不同月份的天数不同的控制。
据此可以设计一个如图3-13 所示结构的数字钟,该数字钟包括校时模块、月份天数处理模块、时分秒计时模块、年月日模块和输出选择模块。
图3-13 数字钟原理框图3.实验内容1.根据图3-13 设计数字钟的各模块电路2.仿真设计结果3.用vhdl 语言完成设计4.分析设计方法,选择最佳方案完成天数处理功能5.设计两键校时操作4.设计实例library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity digital_clock isport(clk,iset,oset,en:in std_logic;i1,i2,i3,i4:std_logic_vector(3 downto 0);o1,o2,o3,o4,o5,o6:out std_logic_vector(3 downto 0));end digital_clock;architecture rtl of digital_clock issignal hmd:integer; --meiyuetianshusignal zs,om:std_logic_vector(1 downto 0); --:=signal ya,yb,yc,yd,moa,mob,da,db,ha,hb,ma,mb,sa,sb,ms:std_logic_vector(3 downto 0); --shuchusignal bya,byb,byc,byd,bmoa,bmob,bda,bdb,bha,bhb,bma,bmb,bsa,bsb,bms:std_logic_vector(3 downto 0); --shurubeginin_set:process(iset)beginif(iset='1' and iset'event) thenzs<=zs+'1';end if;end process in_set;out_set:process(oset)beginif(oset='1' and oset'event) thenom<=om+'1';end if;end process out_set;input:process(zs,iset)beginif(iset='1' and iset'event) thenbsa<="0000";bsb<="0000";bms<="0000";if zs="00" thenbya<=i1;byb<=i2;byc<=i3;byd<=i4;elsif zs="01" thenbmoa<=i1;bmob<=i2;bda<=i3;bdb<=i4;elsif zs="10" thenbha<=i1;bhb<=i2;bma<=i3;bmb<=i4;elseend if;end if;end process input;output:process(om,oset)beginif om="01" theno1<=ma;o2<=mb;o3<=sa;o4<=sb;o5<=ms;o6<="0000";elsif om="10" theno1<=moa;o2<=mob;o3<=da;o4<=db;o5<=ha;o6<=hb;elsif om="11" theno1<='0' & week;o2<="0000";o3<=ya;o4<=yb;o5<=yc;o6<=yd; elseend if;end process output;a1:process(clk)beginif(clk='1' and clk'event) thenif en='0' thenya<=bya;yb<=byb;yc<=byc;yd<=byd;moa<=bmoa;mob<=bmob;da<=bda;db<=bdb;ha<=bha;hb<=bhb;ma<=bma;mb<=bmb;sa<=bsa;sb<=bsb;ms<=bms;elsems<=ms+'1';if ms="1001" thenms<="0000";if sb/="1001" thensb<=sb+'1';elsesb<="0000";if sa/="0101" thensa<=sa+'1';elsesa<="0000";if mb/="1001" thenmb<=mb+'1';elsemb<="0000";if ma/="0101" thenma<=ma+'1';elsema<="0000";if(hb/="1001") and ((hb/="0011") or (ha/="0010")) thenhb<=hb+'1';elsif hb="1001" thenhb<="0000";ha<=ha+'1';elsif (hb="0011" and ha="0010") thenhb<="0000"; ha<="0000";if(db/="1001") and ((conv_integer(da)*10+conv_integer(db))/=hmd) thendb<=db+'1';elsif(conv_integer(da)*10+conv_integer(db))=hmd thenda<="0000"; db<="0001";if(mob/="1001")and((mob/="0010")or(moa/="0001"))thenmob<=mob+'1';elsif mob="1001" thenmob<="0000";moa<="0001";elsemob<="0001";moa<="0000";if(yd/="1001") thenyd<=ya+'1';elseyd<="0000";if(yc/="1001") thenyc<=yc+'1';elseyc<="0000";if(yb/="1001") thenyb<=yb+'1';elseyb<="0000";ya<=ya+'1';end if;end if;end if;end if;elsif db="1001" thendb<="0000";da<=da+'1';end if;end if;end if;end if;end if;end if;elseend if;end if;elseend if;end process a1;a2:process(ya,yb,yc,yd)beginif((mob="0001")and(moa="0000"))or(mob="0011")or(mob="0101") or(mob="0111")or(mob="1000")or(mob="0000")or(mob="0010" and moa="0001") thenhmd<=31;elsif mob="0010" thenif(yc="0000")and(yd="0000")thenif(yb(0)='0')and (yb(1)=ya(0))thenhmd<=29;elsehmd<=28;end if;elsif (yd(0)='0')and(yd(1)='0')thenhmd<=28;end if;elsehmd<=30;end if;end process a2;end rtl;。
(完整word版)24小时数字钟VHDL语言
数字钟的设计」、任务要求:(1) 设计一个数字钟。
(2) 具有时,分,秒计数显示功能,以24小时循环计时(3) 具有清零,调节小时、分钟功能。
(4) 具有整点报时功能,整LED灯花样显示。
1、系统框图:T荃点捱吋盘花畔亦,*5fS*.三、模块说明(含程序代码)1.秒模块程序清单library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_ un sig ned.all;en tity SECOND isport(clk,clr:in std_logic;----时钟/清零信号sec1,sec0:out std」ogic_vector(3 downto 0);----秒高位/低位co:out std」ogic); 输出/进位信号end SECOND;architecture SEC of SECOND isbeginprocess(clk,clr)variable cnt1,cnt0:std_logic_vector(3 downto 0);--- 计数beginif clr='1' then----当ckr为1时,高低位均为0cnt1:="0000";cnt0:="0000";elsif clk'eve nt and clk='1' the nif ent仁"0101" and cnt0="1000" then----当记数为58(实际是经过59个记时脉冲) co<='1';----进位cnt0:="1001";----低位为9elsif cnt0<"1001" then----小于9 时cnt0:=cnt0+1;----计数elsecntO:="OOOO";if cnt1<"0101" then----高位小于 5 时 cnt1:=cnt1+1; elsecnt1:="0000"; co<='0'; end if; end if; end if; sec1<=c ntl; sec0<=c ntO; end process; end SEC;秒模块仿真波形mwmnnmuuuumjumnmnnnnnmmjuuuuumnR秒模块原理图Ei i 1Jsecip. 0J «oD[3.4]coi insti. . 1 B 1. .iVW 召当clr=1时,秒的高低位清零;当 clr=0时,来一个时钟信号 sec0加1,当sec0加到九时清零,co=1, secl 加1。
vhdl实验报告--数字钟
VHDL实验报告一、实验目的1、设计一个24小时制数字钟,要求能显示时,分,秒,并且可以手动调整时和分。
2、通过复杂实验,进一步加深对VHDL语言的掌握程度。
二、实验原理数字钟的主体是计数器,它记录并显示接收到的秒脉冲个数,其中秒和分为模60计数器,小时是模24计数器,分别产生3位BCD码。
BCD码经译码,驱动后接数码管显示电路。
秒模60计数器的进位作为分模60计数器的时钟,分模60计数器的进位作为模24计数器的时钟。
为了实现手动调整时间,在外部增加了setm(调整分),seth(调整时)按键,当这两个按键为低电平时,电路正常计时,当为高电平时,分别调整分,时。
同时在外部还增加了一个清零按键clr.和消抖动电路。
三、实验步骤1、单元模块设计部分1)消抖动电路关键部分signal key_in1,key_in2:std_logic:='0';beginprocess(clk,key_in)beginif clk'event and clk='1' thenkey_in1<=key_in;key_in2<=key_in1;if key_in='1' and key_in1='1' and key_in2='1' then key_out<='1';else key_out<='0';end if;2) 模60计数器程序关键部分:signal md_temp,mg_temp:std_logic_vector(3 downto 0);beginprocess(clk,clr)beginif clr='1' thenmd_temp<="0000"; mg_temp<="0000";elsif set='1' thenmd_temp<=setl; mg_temp<=seth;elsif clk'event and clk='1' thenif md_temp="1001" thenmd_temp<="0000";mg_temp<=mg_temp+'1';else md_temp<=md_temp+'1';if md_temp="1001" and mg_temp="0101" thenmd_temp<="0000";mg_temp<="0000";2、模24计数器程序关键部分signal hd_temp,hg_temp:std_logic_vector(3 downto 0);beginprocess(clk,clr,set,setl,seth)isbeginif set='1' then hd_temp<=setl; hg_temp<=seth;elsif clr='1' then hd_temp<="0000"; hg_temp<="0000";elsif clk'event and clk='1' thenif hg_temp="0010" and hd_temp="0011" thenhd_temp<="0000"; hg_temp<="0000";elsif hd_temp="1001" thenhg_temp<=hg_temp+'1' hd_temp<="0000";else hd_temp<=hd_temp+'1';end if;end if;end process ;3、清零和调时部分显示部分关键程序process (sd,sg,md,mg,hd,hg)begincase sd iswhen "0000" =>sl<="1111110";when "0001" =>sl<="0110000";when "0010" =>sl<="1101101";when "0011" =>sl<="1111001";when "0100" =>sl<="0110011";when "0101" =>sl<="1011011";when "0110" =>sl<="1011111";when "0111" =>sl<="1110000";when "1000" =>sl<="1111111";when "1001" =>sl<="1111011";when others =>sl<="0000000";end case;if clk_g'event and clk_g='1' thenif sel="101" thensel<="000";else sel<=sel+'1';end if;end if;process(sel,sd,sl,sg,sh,md,ml,mg,mh,hd,hl,hg,hh)begincase sel iswhen"000"=>led<=sl;led_which<=sd;when"001"=>led<=sh;led_which<=sg;when"010"=>led<=ml;led_which<=md;when"011"=>led<=mh;led_which<=mg;when"100"=>led<=hl;led_which<=hd;when"101"=>led<=hh;led_which<=hg;when others=>led<="0000000";led_which<="0000";end case;4、顶层文件关键程序port(clk,clk_g:in std_logic;-----clk_g是用在数码管显示里面的信号clr: in std_logic;------clr=1时清零setm,seth:in std_logic;---------setm为1时调分,seth为1时调时setd,setg:in std_logic_vector(3 downto 0);----调整时间的时候,setd调整的是低位setg 调整高位led:out std_logic_vector(6 downto 0);sel_out: out std_logic_vector(2 downto 0);led_which: out std_logic_vector(3 downto 0));---输出的是秒分时的哪一个beginu1:de_shake port map (clk=>clk,key_in=>clr,key_out=>clro);u2:de_shake port map (clk=>clk,key_in=>setm,key_out=>setmo);u3:de_shake port map (clk=>clk,key_in=>seth,key_out=>setho);u4:s60 port map (clk=>clk,clr=>clro,sd=>sdl,sg=>sgh,fenmaichong=>fenmaichong o);u5:m60 port map (clk=>fenmaichongo,clr=>clro,md=>mdl,mg=>mgh,xiaoshimaichong=> xiaoshimaichongo,setl=>setd,seth=>setg,set=>setmo);u6:h24 port map (clk=>xiaoshimaichongo,clr=>clro,hd=>hdl,hg=>hgh,set=>setho,se tl=>setd,seth=>setg);u7:led_xs port map (clk_g=>clk_g,sd=>sdl,sg=>sgh,md=>mdl,mg=>mgh,hd=>hdl, hg=>hgh,led=>led,sel_out=>sel_out,led_which=>led_which);四、实验结果及分析本设计,满足了本次试验设计的任务要求,能显示时分秒,并且可以手动调节分和时。
数字钟VHDL
VHDL实验报告:数字钟一:数字钟的功能1:具有以二十四小时计时、显示、整点报时、时间设置和闹钟的功能。
设计精度要求为1S。
二.功能描述1 . 系统输入:系统状态及校时、定时转换的控制信号为k、trans、set;时钟信号clk,采用1024Hz;系统复位信号reset。
输入信号均由按键产生。
系统输出:LED显示输出,蜂鸣器声音信号输出。
2. 计时:正常工作状态下,每日按24h计时制计时并显示,蜂鸣器无声,逢整点报时。
3. 校时:在计时状态显示下,按下“set键”,进入“小时”校准状态,之后按下“k键”则进入“分”校准状态,继续按下“k 键”则进入“秒复零”状态,第三次按下“k 键”又恢复到正常计时显示状态。
A:“小时”校准状态:在“小时”校准状态下,显示“小时”数码管以1Hz的频率递增计数。
B:“分”校准状态:在“分”校准状态下,显示“分”的数码管以1Hz的频率递增计数。
C:“秒”复零状态:在“秒复零”状态下,显示“秒”的数码管复零。
4. 整点报时:蜂鸣器在“59”分钟的第“51”、“53”、“55”、“57‘秒发频率为512Hz的低音,在“59”分钟的第“59”秒发频率为1024Hz的高音,结束时为整点。
5. 显示:要求采用扫描显示方式驱动6个LED数码管显示小时、分、秒。
闹钟:闹钟定时时间到,蜂鸣器发出周期为1s的“滴”、“滴”声,持续时间为10s;闹钟定时显示。
6. 闹钟定时设置:在闹钟定时显示状态下,按下“set键”,进入闹钟的“时”设置状态,之后按下“k键”进入闹钟的“分”设置状态,继续按下“k 键”则进入“秒”设置状态,第三次按下“k键”又恢复到闹钟定时显示状态。
A:闹钟“小时”设置状态:在闹钟“小时”设置状态下,显示“小时”的数码管以1Hz的频率递增计数。
B:闹钟:“分”设置状态:在闹钟“分”设置状态下,显示“分”的数码管以1Hz的频率递增计数。
三:仿真。
分主控模块、计时校时模块、闹钟设定模块、选择显示模块、整点报时及闹铃模块、分频模块、动态显示模块。
VHDL数字钟
多功能数字钟设计一、设计任务与要求1、具有时、分显示功能(用数码管显示)。
以二十四小时循环计时。
2、具有清零,调节小时,分钟的功能。
3、具有整点(正小时)报时同时用多颗LED灯花样显示秒的功能。
4、运用多层次化设计方式,底层元件用VHDL编写,顶(最高)层元件用原理图法连线。
5、写出课程设计报告,包括设计源程序代码、顶层原理图及必要的文字说明二、选择器件网络线若干/人、LED数码管4个、蜂鸣器、hour(24进制记数器)、minute(60进制记数器)、second(60进制记数器)、xalert(整点报时驱动信号产生模块)、分频fenpin32模块三、功能模块(1) 时钟记数模块:<1.1>该模块的功能是:在时钟信号(CLK)的作用下可以生成波形;在清零信号(RST)作用下,即可清零。
VHDL程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity counter24shi isport( clk,SEL2,SET1:in std_logic;rst:in std_logic;x,y :out std_logic_vector(3 downto 0));end counter24shi;architecture rtl of counter24shi issignal CE:std_logic_vector(7 downto 0) ;SIGNAL clk2 :STD_LOGIC;beginclk2<=CLK WHEN SET1='0'ELSE SEL2;process(clk2)beginif(rst='1') thenCE<="00000000";elsif (clk2'event and clk2='1') thenif(CE="00100011") thenCE<="00000000";elsif(CE(3 downto 0)=x"9") thenCE(7 downto 4)<=CE(7 downto 4)+1;CE(3 downto 0)<=x"0";elseCE<=CE+1;end if;end if;x<=CE(3 downto 0);y<=CE(7 downto 4);end process;end rtl;<1.2>VHDL程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER60fen ISPORT(CLK,SEL1,SET1,RST: IN STD_LOGIC;CO : OUT STD_LOGIC;X,Y: OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );END COUNTER60fen;ARCHITECTURE a OF COUNTER60fen ISSIGNAL QN,QO :STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL CE,CLK1 :STD_LOGIC; BEGINCLK1<=CLK WHEN SET1='0'ELSE SEL1;PROCESS(CLK1,RST)BEGINIF RST='1' THEN QN<="0000";ELSIF (CLK1'EVENT AND CLK1='1') THENIF (QN="1001") THENQN<="0000";CE<='1';ELSE QN<=QN+1;CE<='0';END IF;END IF;X<=QN;END PROCESS;PROCESS(CE,RST)BEGINIF RST='1' THEN QO<="0000";ELSIF (CE'EVENT AND CE='1')THENIF (QO="0101") THENQO<="0000";CO<='1';ELSE CO<='0';QO<=QO+1;END IF;END IF;Y<=QO;END PROCESS;END a;<1.3>VHDL程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER60miao ISPORT(CLK,RST: IN STD_LOGIC;CO : OUT STD_LOGIC;X,Y: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END COUNTER60miao;ARCHITECTURE a OF COUNTER60miao ISSIGNAL QN,QO :STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL CE:STD_LOGIC;BEGINPROCESS(CLK,RST)BEGINIF RST='1' THEN QN<="0000";ELSIF (CLK'EVENT AND CLK='1') THENIF (QN="1001") THENQN<="0000";CE<='1';ELSE QN<=QN+1;CE<='0';END IF;END IF;X<=QN;END PROCESS;PROCESS(CE,RST)BEGINIF RST='1' THEN QO<="0000";ELSIF (CE'EVENT AND CE='1')THENIF (QO="0101") THENQO<="0000";CO<='1';ELSE CO<='0';QO<=QO+1;END IF;END IF;Y<=QO;END PROCESS;END a;(2)整点报时驱动信号产生模块该模块功能:在时钟信号(CLK)的作用下可以生成波形,SPEAK输出接扬声器,以产生整点报时发声。
VHDL的数字钟
数字钟设计要求:(1)能进行正常的时、分、秒计时功能,分别由6个数码管显示24h、60min、60s。
(2)sa键进行校时。
按下sa键时,时计数器以秒速度递增,并按24计数循环,计满23后回到00。
(3)sb键进行校分。
按下sb键时,分计时器以秒速度递增,并按60计数循环,计满59后回到00,但不向“时”进位。
(4)扬声器整点报时:当计时达到59’51”时开始报时,在59’51”、59’53”、59’55”、59’57”鸣叫,鸣叫声频为500Hz,到达59’59”时为最后一声整点报时,频率为1kHz。
秒计时模块MIAN的VHDL源程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity mian isport(clk,clr:in std_logic;sec1,sec0:out std_logic_vector(3 downto 0);co:out std_logic);end mian;architecture mian_arc of mian isbeginprocess(clk,clr)variable cnt1,cnt0:std_logic_vector(3 downto 0);beginif clr='1' thencnt1:="0000";cnt0:="0000";elsif clk'event and clk='1' thenif cnt1="0101" and cnt0="1000" thenco<='1';cnt0:="1001";elsif cnt0<"1001" thencnt0:=cnt0+1;elsecnt0:="0000";if cnt1<"0101" thencnt1:=cnt1+1;elsecnt1:="0000";co<='0';end if;end if;end if;sec1<=cnt1;sec0<=cnt0;end process;end mian_arc;分频模块CCC的输入频率为4MHz方波,输出为500Hz和1kHz的方波。
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数字钟设计
题目:VHDL数字钟设计1 设计要求1:可以正常计时,能够准确实现由秒到分,由分到时的进位;2:具有修改时间功能,可以对分位和时位置数;3:具有整点报时功能,分位向时位进位时响铃;4:具有闹钟功能,可以设置闹钟时间,当闹钟时间与计时时间一样时响铃;2 设计分析及系统方案设计1:正常计时,采用三个进程,分别控制秒、分、时,低位进程走满时产生进位信号控制高位。
2:修改时间,采用键5、6、7、8和键4配合,当键4按下方可保存修改值。
四键中某一个按下时,每一个时钟沿,分别对应分加1、分减1、时加1、时减1。
3:整点报时,当秒个位为9、秒十位为5,、分个位为9、分十位为5时,再来一个时钟信号则时个位加1以上各位都清零,同时响铃,响铃持续一分钟。
4:闹钟,设置一个闹钟位,当闹钟位置1时调整时间是设置闹钟时间,当闹钟位置0时调整时间是设置正常计时的时间。
设置好闹钟时间后,当正常计时的分个位、分十位、时个位、时十位均与设置的闹钟时间相等时响铃一分钟。
3系统以及模块硬件电路设计下载时选择的开发系统模式以及管脚定义(注:采用模式“0”)4 系统的VHDL设计library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity dc_1 isport( clk,alarm,close,set:in std_logic;--走时频率,闹钟频率,修改控制键,脑中设置控制键choice: in std_logic_vector(3 downto 0);--模式选择键组合speak : out std_logic; --喇叭频率来源s1,s2,m1,m2,h1,h2 :out std_logic_vector(3 downto 0));--时间输出,依次是秒个位,秒十位,分个位,分十位,时个位,时十位end;architecture a of dc_1 issignal s_1,s_2,m_1,h_1,m_2,h_2 : std_logic_vector(3 downto 0);--存正常走时的时间,不能存修改的时间signal ss1,ss2,mm1,hh1,mm2,hh2 : std_logic_vector(3 downto 0);--转存所有时间,赋值给输出signal as1,as2,am1,ah1,am2,ah2 : std_logic_vector(3 downto 0):--存放闹钟设定值signal clksp,x,y: std_logic;--整点报时低频信号,分走满的进位信号,时走满的进位信号signal n:std_logic_vector(1 downto 0); --控制分频产生clksp beginprocess(alarm)begin --get low frequency of strike on the hour if alarm'event and alarm='1' thenif n="10" thenn<="00";clksp<=not clksp;else n<=n+1;end if;end if;end process;process(clk)beginif clk'event and clk='1' then --second if(s_1="0101" and s_2="1001") thens_1<="0000";s_2<="0000";x<='1';elsif (s_2="1001") thens_2<="0000";s_1<=s_1+1;x<='0';else s_2<=s_2+1;x<='0';end if;end if;end process;process(clk) --adjust the second to match minute and hour beginif clk'event and clk='1' then ss1<=s_1;ss2<=s_2;end if;end process;process(clk)begin if close='1' then m_1<=mm1;m_2<=mm2; --minute elsif clk'event and clk='0' thenif s_2="1001" and s_1="0101" thenif m_2="1001" thenm_2<="0000";if (m_1="0101") thenm_1<="0000";y<='1';else m_1<=m_1+1;y<='0';end if;else m_2<=m_2+1;y<='0';end if;end if;end if;end process;process(clk)beginif clk'event and clk='1' then ---change minute if set='0' thenif choice="0000" thenmm1<=m_1;mm2<=m_2;elsif choice="0001" thenif (mm2="1001" and mm1="0101") thenmm2<="0000";mm1<="0000";elsif mm2="1001" thenmm2<="0000";mm1<=mm1+1;else mm2<=mm2+1;end if;elsif choice="0010" thenif (mm2="0000" and mm1="0000") thenmm2<="1001";mm1<="0101";elsif (mm2="0000") thenmm2<="1001";mm1<=mm1-1;else mm2<=mm2-1;end if;end if;end if;end if;end process;process(clk) --hour beginif close='1' then h_1<=hh1;h_2<=hh2;elsif clk'event and clk='0' thenif x='1' and y='1' thenif (h_1="0010" and h_2="0100") thenh_1<="0000" ;h_2<="0000";elsif(h_2="1001") thenh_2<="0000";h_1<=h_1+1;else h_2<=h_2+1;end if;end if;end if;end process;process(clk)beginif clk'event and clk=’1’ then --change hour if set='0' thenif choice="0000" thenhh1<=h_1;hh2<=h_2;elsif choice="0100" thenif (hh2="0100" and hh1="0010") thenhh2<="0000";hh1<="0000";elsif hh2="1001" thenhh2<="0000";hh1<=hh1+1;else hh2<=hh2+1;end if;elsif choice="1000" thenif (hh2="0000" and hh1="0000") thenhh2<="0100";hh1<="0010";elsif (hh2="0000") thenhh2<="1001";hh1<=hh1-1;else hh2<=hh2-1;end if;end if;end if;end if;end process;process(clk,set) --set alarm beginif clk'event and clk='1' thenif set='1' thenif choice="0001" then --set second if (as2="1001" and as1="0101") thenas2<="0000";as1<="0000";elsif as2="1001" thenas2<="0000";as1<=as1+1;else as2<=as2+1;end if;elsif choice="0010" then --set minif (am2="1001" and am1="0101") thenam2<="0000";am1<="0000";elsif am2="1001" thenam2<="0000";am1<=am1+1;else am2<=am2+1;end if;elsif choice="0100" then --set hour if (ah2="0100" and ah1="0010") thenah2<="0000";ah1<="0000";elsif ah2="1001" thenah2<="0000";ah1<=ah1+1;else ah2<=ah2+1;end if;end if;end if;end if;end process;process(clk)begin --display if set='1' thens1<=as1;s2<=as2;m1<=am1;m2<=am2;h1<=ah1;h2<=ah2;elses1<=s_1;s2<=s_2;m1<=mm1;m2<=mm2;h1<=hh1;h2<=hh2;end if;end process;process(clk)begin --alarm control and speaker control if set='0' thenif (mm1=am1 and mm2=am2 and hh1=ah1 and hh2=ah2) thenspeak<=alarm;elsif mm1="0101" and mm2="1001" and ss1="0101" thenif ss2="0010" or ss2="0100" or ss2="0110" or ss2="1000" thenspeak<=clksp;end if;elsif mm1="0000" and mm2="0000" and ss1="0000" and ss2="0000" thenif hh1="0000" and hh2="0000" thenspeak<='0';elsespeak<=alarm;end if;else speak<='0';end if;end if;end process;end;5 结论以及结果说明在windows系统下运行MAX+PLUSII10.2软件,编译仿真成功后,连接引脚,实验箱选择EPF10K10LC84-4。
VHDL课程设计(数字钟)
1.设计任务及要求:
设计任务:设计一台能显示时、分、秒的数字钟。具体要求如下:
(1)由实验箱上的时钟信号经分频产生秒脉冲;
(2)计时计数器用24进制计时电路;
(3)可手动校时,能分别进行时、分的校正;
(4)整点报时;
(5)选做:可设置闹时功能,当计时计到预定时间时,扬声器发出闹铃信号,闹铃时间为4s,并可提前终止闹铃。
end if;
end if;
if sethour='1' then
h0:=h0+1;
if h0="1010" then
h0:="0000";
h1:=h1+1;
ifh0="0100"and h1="0010"
then h0:="0000";h1:="0000";
end if;
end if;
end if;
3.2.3.秒计时模块
将“秒计时脉冲”clk接信号源单元的1HZ脉冲信号,此时秒显示将从00计时到59,然后回到00,重新计时。在秒位进行计时的过程中。
秒计时器是由一个60进制的计数器构成的,具有置数和计数功能。其中rst为置数信号,当rst为1时,秒计时器置数。clk为驱动秒计时器的时钟,sec1、sec0为秒计时器的高位和低位输出。
begin
if(clk1'event and clk1='1') then
if(count="10") then
count:=(others=>'0');
tmp<=not tmp;
VHDL电子时钟的设计
目录第一章数字电子钟功能简介 (3)第二章数字电子钟原理介绍 (3)2.1数字电子钟基本原理 (3)2.2数字电子钟电路组成 (3)第三章利用QuartusII设计数字电子钟 (7)3.1按键去抖动模块 (7)3.2分频电路模块 (9)3.3选择器模块 (13)3.4计数模块 (14)3.5分位电路模块 (18)3.6数码管动态显示扫描模块 (21)3.7数码管动态显示模块 (22)第四章仿真与实现 (25)第一章数字电子钟功能简介计时功能:这是本计时器设计的基本功能,可进行时、分、秒计时,并显示在6个七段数码管上。
调时功能:当需要校时,可通过实验箱上的按键控制,按下对应的按键,可调整对应的时、分状态。
第二章数字电子钟原理简介2.1数字电子钟基本原理数字钟电路的基本结构由两个60进制计数器和一个24进制计数器组成,分别对秒、分、小时进行计时,当计时到23时59分59秒时,再来一个计数脉冲,计数器清零,重新开始计时。
秒计数器的计数时钟CLK为1Hz的标准信号,可以由27MHz信号通过分频得到。
当数字钟处于计时状态时,秒计数器的进位输出信号作为分钟计数器的计数信号,分钟计数器的进位输出信号又作为小时计数器的计数信号。
时、分、秒的计时结果通过6个数码管来动态显示。
数字钟除了能够正常计时外,还应能够对时间进行调整。
可通过模式选择信号控制数字钟的工作状态,即控制数字钟,使其分别工作于正常计时,调整分、时和设定分、时状态。
当数字钟处于计时状态时,3个计数器允许计数,且秒、分、时计数器的计数时钟信号分别为CLK,秒的进位, 分的进位;当数字钟处于调整时间状态时,被调的分或时会一秒一秒地增加。
2.2数字电子钟电路组成本实验数字电子钟的设计电路主要由七个模块组成,分别是:按键去抖动模块、分频电路模块、选择器模块、计数模块、分位电路模块、数码管动态显示扫描模块、数码管动态显示模块。
按键去抖动模块如图2-1所示图2-1分频电路模块如图2-2所示图2-2选择器模块如图2-3所示图2-3计数模块如图2-4所示图2-4分位电路模块如图2-5所示图2-5数码管动态显示扫描模块如图2-6所示图2-6数码管动态显示模块如图2-7所示图2-7电路图整体设计如图2-8所示图2-8第三章利用QuartusII设计数字电子钟3.1按键去抖动模块按键去抖动模块的元件设计如图3-1所示图3-1按键去抖动的VHDL语言设计如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity debounce isport(clk:in std_logic;qcin:in std_logic;qcout:out std_logic);end debounce;architecture behave of bounce is type state is (S0,S1,S2);signal current: state;Beginprocess(clk,qin)beginif(clk'event and clk = '1') then case current iswhen S0 => qcout <= '1';if(qcin = '0') thencurrent <= S1;elsecurrent <= S0;end if;when S1 => qcout <= '1';if(qcin = '0') thencurrent <= S2;elsecurrent <= S0;end if;when S2 => qcout <= '0';if(qcin = '0') thencurrent <= S2;elsecurrent <= S0;end if;when others => qcout <= '1';current <= S0;end case;end if;end process;end behave;///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ////3.2分频电路模块分频电路模块元件设计如图3-2所示:图3-2分频模块VHDL语言设计如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity clk1kHz isgeneric(N: integer:=50000);port(clk: in std_logic;clk1kHz: out std_logic);end clk1kHz;architecture behave of clk1kHz issignal cnt: integer range 0 to N/2-1;signal temp: std_logic;Beginprocess(clk)beginif(clk'event and clk='1') thenif(cnt=N/2-1) thencnt <= 0;temp <= NOT temp;elsecnt <= cnt+1;end if;end if;end process;clk1KHz <= temp;end behave;///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ////library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity clk1Hz isgeneric(N: integer:=50000000);port(clk: in std_logic;clk1Hz: out std_logic);end clk1Hz;architecture behave of clk1Hz issignal cnt: integer range 0 to N/2-1;signal temp: std_logic;Beginprocess(clk)beginif(clk'event and clk='1') thenif(cnt=N/2-1) thencnt <= 0;temp <= NOT temp;elsecnt <= cnt+1;end if;end if;end process;clk1Hz <= temp;end behave;///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ////library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity clk10Hz isgeneric(N: integer:=20000000);port(clk: in std_logic;clk10Hz: out std_logic);end clk10Hz;architecture behave of clk10Hz issignal cnt: integer range 0 to N/2-1;signal temp: std_logic;Beginprocess(clk)beginif(clk'event and clk='1') thenif(cnt=N/2-1) thencnt <= 0;temp <= NOT temp;elsecnt <= cnt+1;end if;end if;end process;clk10Hz <= temp;end behave;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////3.3选择器模块选择器模块元件设计如图3-3所示:图3-3选择器模块VHDL与颜色合计如下所示:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity xzq isport(sel: in std_logic;date0,date1:in std_logic;dcout:out std_logic);end xzq;architecture behave of xzqisbeginwith sel selectdcout <=date0 when '0',date1 when others;end behave;///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ////3.4计数模块计数模块元件设计如图3-4所示:图3-4计数器模块VHDL语言设计如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity count60s isport(clk:in std_logic;clk10:in std_logic;set: in std_logic:='1';change: out std_logic;qcout: buffer integer range 0 to 59:=0);end count60s;architecture behave of count60s issignal temp:integer range 0 to 59;signal temp1:std_logic;beginprocess(clk,set,clk10)beginif(set='0') thentemp <= 0;elsif(clk'event and clk='1') thenif(qcout=59) thentemp <= 0;temp1 <= '1';elsetemp <= temp+1;temp1 <= '0';end if;end if;qcout <= temp;change <= temp1;end process;end behave;///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ////library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity count60m isport(clk:in std_logic;change: out std_logic;qcout: buffer integer range 0 to 59:=0;set:in std_logic:='1');end count60m;architecture behave of count60m issignal temp:integer range 0 to 59;signal temp1:std_logic;beginprocess(clk)beginif(clk'event and clk='1') thenif(qcout=59) thentemp <= 0;temp1 <= '1';elsetemp <= temp+1;temp1 <= '0';end if;end if;qcout <= temp;if(set = '1') thenchange <= car;end if;end process;end behave;///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ////library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity count24h isport(clk:in std_logic;qcout: buffer integer range 0 to 23:=0);end count24h;architecture behave of count24h issignal temp:integer range 0 to 23;beginprocess(clk)beginif(clk'event and clk='1')thenif(qcout=23) thentemp <= 0;elsetemp <= temp+1;end if;end if;qcout <= temp;end process;end behave;///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ////3.5分位电路模块分位电路模块元件设计如图3-5所示图3-5分位电路模块VHDL语言设计如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity decircuit isport(cnt: in integer range 0 to 59;ge: out integer range 0 to 9;shi: out integer range 0 to 9);end decircuit;architecture behave of decircuit isbegin--fenwei circuitprocess(cnt)variable shi_temp:integer;beginge <= cnt mod 10;shi <= cnt / 10;end process;end behave;///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ////library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity decircuit isport(cnt: in integer range 0 to 59;ge: out integer range 0 to 9;shi: out integer range 0 to 9);end decircuit;architecture behave of decircuit isbeginprocess(cnt)variable shi_temp:integer;beginge <= cnt mod 10;shi <= cnt / 10;end process;end behave;///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ////library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity decircuit2 isport(cnt: in integer range 0 to 23;ge: out integer range 0 to 9;shi: out integer range 0 to 9);end decircuit2;architecture behave of decircuit2 isbegin--fenwei circuitprocess(cnt)variable shi_temp:integer;beginge <= cnt mod 10;shi <= cnt / 10;end process;end behave;///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ////3.6数码管动态显示扫描模块图3-6元件设计如图3-6所示:图3-6数码管动态显示扫描模块VHDL语言设计如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity dyn_display_count isport(clk1kHz: in std_logic;qout: out integer range 0 to 7);end dyn_display_count;architecture behave of dyn_display_count issignal temp:integer range 0 to 7 :=0;Beginprocess(clk1kHz)beginif(clk1kHz'event and clk1kHz = '1') thenif(temp=7) thentemp <= 0;elsetemp <= temp + 1;end if;end if;qout <= temp;end process;end behave;///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ////3.7数码管动态显示模块数码管动态显示模块元件设计如图3-7所示:图3-7数码管动态显示模块VHDL语言设计如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity display isport(qcnt: in integer range 0 to 7;secshi,secge,minshi,minge,hshi,hge:in integer range 0 to 9;seg: out std_logic_vector(6 downto 0);scan: out std_logic_vector(7 downto 0));end display;architecture behave of display issignal data: integer range 0 to 10;beginprocess(qcnt,secshi,secge,minshi,minge,hshi,hge)begincase qcnt iswhen 0 => scan <= "11111110";data <= secge;when 1 => scan <= "11111101";data <= secshi;when 2 => scan <= "11111011";data <= 10;when 3 => scan <= "11110111";data <= minge;when 4 => scan <= "11101111";data <= minshi;when 5 => scan <= "11011111";data <= 10;when 6 => scan <= "10111111";data <= hge;when 7 => scan <= "01111111";data <= hshi;when others => scan <= "11111111";data <=0;end case;end process;process(data)begincase data iswhen 0 => seg <= "0111111";when 1 => seg <= "0000110";when 2 => seg <= "1011011";when 3 => seg <= "1001111";when 4 => seg <= "1100110";when 5 => seg <= "1101101";when 6 => seg <= "1111101";when 7 => seg <= "0000111";when 8 => seg <= "1111111";when 9 => seg <= "1100111";when 10 => seg <= "1000000";when others => seg <= "0111111";end case;end process;end behave;///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// ////第四章仿真与实现硬件仿真结果如图4-1所示图4-1。
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)。
3
从上面的介绍中该数字钟的校时电路实际由两部分组成,即图中的“校时电路”和“校时闪烁电路”。
4 模块设计及仿真
数字钟的设计包括分频器、去抖动电路、校时电路、“时、分、秒”计数器、校时闪烁电路和译码显示 电路。设计时,我将每一个功能模块作为一个实体单独进行设计,最后再用 VHDL 的例化语句将各个模块进 行整合,生成顶层实体 ADigCLK。
4.1. 分频器 Distributer........................................................04 4.2. 去抖动电路 Debounce....................................................05 4.3 校时电路 RvsTime.........................................................08 4.4 时计数器 Counter24hour,分计数器 Counter60min,秒计数器 Counter60sec.......10 4.5 校时闪烁电路 FlashTime..................................................13 4.6 译码显示电路 Displayer....................................................15 5. 数字钟整体...................................................................16 6. 硬件测试...... ..............................................................20 7. 总结和体会、致谢.............................................................20 参考资料........................................................................21 附录............................................................................22
END IF; END PROCESS psec;
)THEN
4
pscan:PROCESS(div_cnt(14)) BEGIN
IF(div_cnt(14)'EVENT AND div_cnt(14) = '1')THEN scanclk<=NOT scanclk;
END IF; END PROCESS pscan;
该数字钟可以实现 2 个功能:计时功能和设置时间功能。
4.1 分频器 Distributer 在数字钟的设计中,采用了 EPM7128SLC84-15N 内部提供的 50MHz 全局时钟,将其分频率后产生一个接
近 1Hz 秒时钟 secclk,和一个 763Hz 左右的扫描时钟 scanclk。 值得说明的是,由于将 50MHz 精确地分频出 1Hz 将占去非常多的宏单元,因此我下面的程序只是粗
来控制是否时行校时,用一个自由按键来选择对小时或分钟进行校时,用一个自由按键来调整时间值。 MAX7128 CPLD 开发板原理图见附录 1。表 2-1 对该数字钟中用到的硬件资源进行列表说明:
硬件名称
程序中的标 识符
EPM7128SLC8 4-15N
-
全局复位按 键
key0in
拨码开关 DipSwi_in
2 软硬件资源分析
实验室提供了 Alter 公司的设计环境软件 Quartus II9.1 和 MAX7128 实验开发板。Quartus II 软件的
使用可以参考教材和 Internet 资源。MAX7128 CPLD 开发板是针对 CPLD 初、中级学习者设计的,帮助用 户降低学习成本和加快用户快速进入可编程逻辑器件设计开发领域,提供一个帮助用户快速开始可编程逻 辑器件学习之旅的硬件平台。该开发板提供了一片 EPM7128SLC84-15N 芯片,8 个拨码开关,8 个自由按键, 一个全局复位按键,8 个可动态扫描显示的数码管,12 个 LED 灯,一个蜂鸣器等硬件资源。在该数字钟设 计中,将用 6 个数吗管来显示时分秒(分别有十位和个位),用全局复位按键来复位时钟,用一个拨码开关
其源代码如下所示: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY Distributer IS PORT(ori_clk:IN STD_LOGIC; --晶振时钟
EDA 技术及应用实验报告
题 目:基于 VHDL 的数字钟设计
学 校: 学科专业: 学 生: 学 号: 任课教师:
中南大学 生物医学工程
0405080704
完成日期: 2011 年 5 月 24 日
目录
1. 设计任务及要求...............................................................02 2. 软硬件资源分析...............................................................02 3. 设计方案及原理...............................................................03 4. 模块设计及仿真...............................................................04
“50MHz 时钟”和“分频器”产生整个系统的时基信号,它直接决定计时系统的精度。 进行校时和复位时,所有按钮的输入都要经过“去抖动电路”。 “秒计数器”采用六十进制计数器,每累计 60 秒向“分计数器”进位;“分计数器”采用六十进制计 数器,每累计 60 分向“时计数器”进位;“时计数器”采用二十四进制计数器,按照“24 翻 1”规律计数。 但秒进位并不直接输入给“分计数器”,分进位并不直接输入给“时计数器”,而是都先经过“校时电路”。 如果不进行校时,“校时电路”将秒进位直接输出给“分计数器”,将分进位直接输出给“时计数器”;如果 进行小时校时,“校时电路”将秒进位直接输出给“分计数器”,而将校时按键 keyin[1]的输入脉冲输出给 “时计数器”,从而修改小时数值;同理,如果进行分钟校时,“校时电路”将分进位直接输出给“时计数 器”,而将校时按键 keyin[1]的输入脉冲输出给“分计数器”,从而修改分钟数值。 任何情况下,“秒计数器”的输出直接送“译码显示电路”显示。非校时状态下,“时/分计数器”的输 出经由“校时闪烁电路”直接送“译码显示电路”显示。如果在校正小时,“分计数器”的输出以正常方式 送“译码显示电路”显示,而“时计数器”在经过“校时闪烁电路”后,其对应数码管交替点亮和熄灭, 这样使用者便可能很容易知道当前是在对小时校时;同理,如果当前正在校正分钟,则有相似的效果。
1
基于 VHDL 的数字钟设计
1 设计任务及要求:
设计任务 设计一台能显示时、分、秒的数字钟。具体要求如下:
(1) 由实验箱上的时钟信号经分频产生秒脉冲; (2) 计时计数器用 24 进制计时电路; (3) 能进行复位操作; (4) 可手动校时,能分别进行时、分的校正; 设计要求: (5) 采用 VHDL 语言描述系统功能,并在 QUARTUS II 工具软件中进行仿真,下载到 EDA 实验箱进行验证。 (6) 编写设计报告,要求包括方案选择、程序代码清单、调试过程、测试结果及心得体会。
END one;
Distributer 的管脚图如图 4-1 所示,仿真波形如图 4-2 所示。由于对 50MHz 进行仿真速度较慢,且不便于观察,故仿真进将 ori_clk 设为 1024Hz, 分频出秒时钟 secclk 为 1Hz,扫描时钟 scanclk 为 512Hz。后面在进行整个 系统仿真时也将进行同样的处理。具体做法是将程序中的数值 24 改为 8,将 14 改为 0。
PROCESS(ori_clk) BEGIN IF(ori_clk'EVENT AND ori_clk = '1')THEN div_cnt <= div_cnt + 1; END IF; END PROCESS;
psec:PROCESS(div_cnt(24)) BEGIN
IF(div_cnt(24)'EVENT AND div_cnt(24) = '1' secclk<=NOT secclk;
自由按键
keyin[0]
自由按键
keyin[1]
seg7out和 8位数码管 select_sigo
ut
表2-1 数字钟硬件资源
开发板上的 对应CPLD芯
标号
片管脚数
功能
-
-
-
RESET
P_01
实现时钟复 位至00: 00:00
J9/1
P_33
决定是否进 行校时
K1
P_44
选择小时或 分钟校时
K2
P_45
值增1
本数字钟只
参见有关动 态扫描的介
绍资料。
使用了Q1-Q6 数码管,但 仍设置输出 将另两个数