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。
- 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 数码管,但 仍设置输出 将另两个数