用VHDL编数字时钟
数字秒表(vhdl)
3.2.分频器2:将2.5MHz时钟信号变频为1000Hz接时间扫描模块。
(1)编写程序如下:library ieee;use ieee.std_logic_1164.all;entity div0 isport(clk: in bit;q: buffer bit);end div0;architecture a of div0 issignal counter:integer range 0 to 1249;beginprocess(clk)beginif (clk'event and clk='1') thenif counter=1249 thencounter<=0;q<= not q;else counter<=counter+1;end if;end if;end process;end a;3.3.十进制计数器(1)编写程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt10 isport(clk:in std_logic;clr:in std_logic;start:in std_logic;daout:buffer std_logic_vector(3 downto 0);co:out std_logic);end entity cnt10;architecture art of cnt10 isbeginprocess(clk,clr,start)beginif clr='0' then daout<="0000";elsif (clk'event and clk='1')thenif (start='1')thenif daout="1001"then daout<="0000";co<='1';else daout<=daout+'1';co<='0';end if;end if;end if;end process;end art;写程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt6 isport(clk,clr,start:in std_logic;daout:buffer std_logic_vector(3 downto 0);co:out std_logic);end entity cnt6;architecture art of cnt6 isbeginprocess(clk,clr,start)beginif clr='0' then daout<="0000";elsif (clk'event and clk='1')thenif (start='1')thenif daout="0101"then daout<="0000";co<='1';else daout<=daout+'1'; co<='0';end if;3end if;end if;end process;end art;3.5.时间扫描模块(1)编写程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity seltime isport(clk:in std_logic;din1,din2,din3,din4,din5,din6:in std_logic_vector(3 downto0);dp:out std_logic;sel: out std_logic_vector(2 downto 0);daout:out std_logic_vector(3 downto 0));end seltime;architecture fun of seltime issignal count:std_logic_vector(2 downto 0);beginsel<=count;process(clk)beginif(clk'event and clk='1') thenif(count>="101") then count<="000";else count<=count+1;end if;end if;case count iswhen "000" =>daout<= din1 (3 downto 0); dp<='0';when "001" =>daout<= din2 (3 downto 0); dp<='0';when "010" =>daout<= din3 (3 downto 0); dp<='1';when "011" =>daout<= din4 (3 downto 0); dp<='0';when "100" =>daout<= din5 (3 downto 0); dp<='1';when others =>daout<=din6 (3 downto 0); dp<='0';end case;end process;end fun;3.6.显示译码器(1)编写程序如下:library ieee;use ieee.std_logic_1164.all;entity deled isport(num:in std_logic_vector(3 downto 0);led:out std_logic_vector(6 downto 0));end deled ;architecture a of deled isbeginprocess(num)begincase num iswhen"0000"=>led<="";when"0001"=>led<="";when"0010"=>led<="";when"0011"=>led<="";when"0100"=>led<="";when"0101"=>led<="";when"0110"=>led<="";when"0111"=>led<="";when"1000"=>led<="";when"1001"=>led<="";when others=>led<="";end case;end process;end a;3.7.报警器控制模块5(1)编写程序如下:library ieee;use ieee.std_logic_1164.all;entity alarm isport(I,clk: in bit;q: out bit);end alarm;architecture a of alarm issignal counter:integer range 0 to 49;signal q1:integer range 0 to 9;signal q0:bit;beginprocess(I,clk)beginif (clk=’1’ and clk’event) thenif (i=’1’)thenif counter=49 then counter<=0; q0<= not q0; q1<=q1+1;else counter<=counter+1;end if;q<=q0;end if; end if;end process;end a;1.顶层文件library ieee;use ieee.std_logic_1164.all;entity sec_clock isport(clk,stop,start:in std_logic;sel:out std_logic_vector(2 downto 0);speaker:out bit;a,b,c,d,e,f,g,dp:out std_logic);end sec_clock;architecture behave of sec_clock iscomponent div isport(clk,clr:in std_logic;q:buffer std_logic);end component;component div0 isport(clk:in std_logic;q:buffer std_logic);end component;component cnt10 isport(clk,clr,start:in std_logic;co:out std_logic;daout:buffer std_logic_vector(3 downto 0));end component;component cnt6 isport(clk,clr,start:in std_logic;co:out std_logic;daout:buffer std_logic_vector(3 downto 0));end component;component seltime isport(clk:in std_logic;din1,din2,din3,din4,din5,din6:in std_logic_vector(3 downto0);dp:out std_logic;sel:out std_logic_vector(2 downto 0);daout:out std_logic_vector(3 downto 0));end component;component deled isport(num:in std_logic_vector(3 downto 0);led:out std_logic_vector(6 downto 0));end component;component alarm isport(clk,i:in std_logic;q:out bit);end component;signal co1,co2,co3,co4,co5,co6:std_logic;7signal do1,do2,do3,do4,do5,do6,do7:std_logic_vector(3 downto 0);signal q1,q2:std_logic;signal ledout:std_logic_vector(6 downto 0);beginf1:div port map(clk=>clk, clr=>stop, Q=>q1);f2:div0 port map(clk=>clk, Q=>q2);u1:cnt10 port map(clk=>q1, clr=>stop, start=>start, co=>co1,daout=>do1);u2:cnt10 port map(clk=>co1, clr=>stop, start=>start, co=>co2,daout=>do2);u3:cnt10 port map(clk=>co2, clr=>stop, start=>start, co=>co3,daout=>do3);u4:cnt6 port map(clk=>co3,clr=>stop,start=>start,co=>co4,daout=>do4);u5:cnt10 port map(clk=>co4,clr=>stop,start=>start,co=>co5,daout=>do5);u6:cnt6 port map(clk=>co5,clr=>stop,start=>start,co=>co6,daout=>do6);st:seltime port map(clk=>q2,din1=>do1,din2=>do2,din3=>do3,din4=>do4,din5=>do5,din6=>do6,dp,sel=>sel,daout=>do7);de:deled port map(num=>do7,led=>ledout);al:alarm port map(clk=>q1,I=>co6,Q=>speaker);a<=ledout(6);b<=ledout(5);c<=ledout(4);d<=ledout(3);e<=ledout(2);f<=ledout(1);g<=ledout(0);end behave;。
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)波形分析数字时钟控制单元 时调整 分调整使能端信号 CLK 信号时显示 分显示 秒显示24进制 60进制 60进制LED 显示整点报花样显利用60进制计数器完成00到59的循环计数功能,当秒计数至59时,再来一个时钟脉冲则产生进位输出,即enmin=1;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中的时钟是不是可综合的问题
关于VHDL中的时钟是不是可综合的问题1。
VHDL综合器中把通过边沿触发其他信号的东西统统定义为时钟信号。
比如说,一个信号B的变化需要A的下降沿来触发,那么在相应的进程中就把A看作是时钟信号,即使A可能只变化了这一次。
2。
明确了1,就来看2。
任意一个信号或者变量只能有一个时钟驱动。
多时钟驱动的信号或变量会在综合时报错。
比如说,如下语句在一个进程中:if (clk'event and clk = '1') thenB <= '1';end if;if (A'event and A = '0') thenB < = '0';end if;这里面的B就叫做被时钟clk和时钟A同时驱动了,虽然我们平时不习惯把A 也叫做时钟,但是它在综合时似确实被这样认为的。
因此,这就要求我们在写程序之前,要把所有的信号都拼尽全力的用不多于一个时钟来驱动,当然不用时钟也是可以的。
同时也引申出一点,就是一个进程的敏感表表示的是进程间的驱动关系,这个需要极其认真地考虑,要弄清楚进程间究竟是用什么通信的,尤其牵扯到时钟的时候,到搞懂究竟是哪个时钟触发了信号。
切不可随意添加信号,在仿真时可能问题不大,但是综合的时候可能会有大问题。
这个从物理上也好理解,一个又边沿触发的信号物理上就是用一个D触发器实现的,无论这个触发信号是变化很长时间还是只变化一次,只要是牵扯到检测边沿,就需要一个D触发器。
而一个信号只能对应一个D触发器,一个D触发器只能由一个时钟驱动,所以以上语句是无法综合的。
也就是说,两个时钟同时触发的D触发器现阶段无法实现。
为什么无法实现呢?留个问题。
3。
使用异步电路只有如下一种书写方式可以综合:process(clk,reset)beginif (reset = '1') thenB <= '1';elsif (clk'event and clk = '0') thenB < = '0';end if;end process;下面的语句会在综合中报错:process(clk,reset)beginif (reset = '1') thenB <= '1';end if;if (clk'event and clk = '0') thenB < = '0';end if;end process;报的错误是同步时钟前面存在异步信号。
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
一、设计题目:基于VHDL语言的电子秒表设计(可调时,有闹钟、定时功能)二、设计目的:⑴掌握较复杂的逻辑设计和调试⑵学习用原理图+VHDL语言设计逻辑电路⑶学习数字电路模块层次设计⑷掌握QuartusII软件及Modelsim软件的使用方法三、设计内容:(一)设计要求1、具有以二十四小时计时、显示、整点报时、时间设置和闹钟的功能。
2、设计精度要求为1S。
(二).系统功能描述1 . 系统输入:系统状态及校时、定时转换的控制信号为k、set、ds;时钟信号clk,采用实验箱的50MHz;系统复位信号为reset。
输入信号均由按键产生。
系统输出:8位LED七段数码管显示输出,蜂鸣器声音信号输出。
多功能数字钟系统功能的具体描述如下:2. 计时:set=1,ds=1工作状态下,每日按24h计时制计时并显示,蜂鸣器无声,逢整点报时。
3. 校时:在set=0,ds=0状态下,按下“k键”,进入“小时”校准状态,之后按下“k键”则进入“分”校准状态,继续按下“k键”则进入“秒校准”状态,之后如此循环。
1)“小时”校准状态:在“小时”校准状态下,显示“小时”数码管以1Hz的频率递增计数。
2)“分”校准状态:在“分”校准状态下,显示“分”的数码管以1Hz的频率递增计数。
3)“秒”复零状态:在“秒复零”状态下,显示“分”的数码管以1Hz的频率递增计数。
4. 整点报时:蜂鸣器在“59”分钟的第50—59,以1秒为间隔分别发出1000Hz,500Hz的声音。
5. 显示:采用扫描显示方式驱动8个LED数码管显示小时、分、秒。
闹钟:闹钟定时时间到,蜂鸣器发出交替周期为1s的1000Hz、500Hz的声音,持续时间为一分钟;6. 闹钟定时设置:在set=0,ds=1状态下,按下“k”,进入闹钟的“时”设置状态,之后按下“k键”进入闹钟的“分”设置状态,继续按下“k 键”则进入“秒”设置状态, 之后如此循环。
1)闹钟“小时”设置状态:在闹钟“小时”设置状态下,显示“小时”的数码管以1Hz 的频率递增计数。
多功能数字电子钟_VHDL
四、各功能模块的源程序代码 :
-- CONTOR 模块 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity contor is
1 )“小时” 校时状态: 进入“小时”校时状态后,显示 “小时” 的数码管闪烁,每按动“ k” 键一次,“小时” +1,若不按动“ k”键 则小时数不变,一直按下“ k” 键则小时数一 4Hz 的频率递增计数。
2 )“分”校时状态:进入“分”校时状态后,显示“分”的数 码管闪烁,每按动“ k” 键一次,“分” +1,若不按动“ k”键则分数 不变,一直按下“ k” 键则分数一 4Hz的频率递增计数。
chs,cms,css,f4 :in std_logic; bsg,bmg,bhg,bsd,bmd,bhd :buffer std_logic_vector(3 downto 0); comout :out std_logic); end time_com; architecture time_comx of time_com is begin com:process(hh,mh,sh,hl,ml) begin if(bhg=hh and bhd=hl and bmg=mh and bmd=ml and bsg=sh)then comout<='1'; else comout<='0'; end if; end process; set:process(f4) begin if(f4'event and f4='1')then if(chs='1'and k='0')then if(bhg="0010" and bhd="0011")then bhd<="0000";bhg<="0000"; elsif(bhd="1001")then bhd<="0000";bhg<=bhg+1; elsif(bhd="0000"or bhd="0001" or bhd="0010"or bhd="0011"or bhd="0100"or bhd="0101"or bhd="0110"or bhd="0111"or bhd="1000")then bhd<=bhd+1; end if; end if; end if; end process; process(f4) begin if(f4'event and f4='1')then if(cms='1'and k='0')then if(bmg="0101" and bmd="1001")then
基于VHDL数字时钟的设计与实现
1 引言随着科学技术的不断发展,人们对时间计量的精度要求越来越高。
相对机械钟而言,数字钟能实现准确计时,并显示时,分,秒,而且可以方便,准确的对时间进行调节。
在此基础上,还可以实现整点报时的功能。
因此,数字钟的应用十分广泛。
所谓数字时钟,是指利用电子电路构成的计时器。
1.1课题的背景、目的电子技术是一门应用很广,发展极为迅速的科学技术,尤其由于数字电子技术具有高抗干扰能力、更高的可靠性和便于计算机处理等特点,近年来得到更加迅速的发展,数字通讯设备、数字电视、数字照相机、数字摄象机等数字化产品近年如雨后春笋般大量涌现,数字电子技术已经成为今后电子技术发展的主要方向。
现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
通过数字时钟的设计,巩固计算机组成原理课程,理论联系实际,提高分析、解决计算机技术的实际问题的独立工作能力;掌握用VHDL语言编制简单的小型模块,学会数字钟的设计方法,熟悉集成电路的使用方法,初步掌握电子钟的设计方法并实现时间的显示和校对,以及报时的功能,并能对数字电子钟进行扩展。
数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
1.2 课程设计的内容本课程设计实现一个数字时钟,具有按秒走时功能,能够分别显示小时(2位24小时)、分钟(2位)、秒(2位)。
具有整点报时、时间调整功能,且能够对计时系统的小时、分钟进行调整。
基于VHDL语言的数码管闪烁控制的实现
在上位机调试时 , 最重要 的是顺序的处理数据 , 因为
不 同的数据在转化 时会乘 以不同的权 ,所 以如果数据顺
序不正确 , 将得不到预期的效果。当输入一个方波时 , 现
象如 图 7 示 。 所
[ 刘皖, 4 ] 何道君’ 谭明. G F A设计与应用[ ] P M. 北京: 清华大学
出版社, 0 , . 2 66 0 0
[赵宇 玲. 于 F G 5 ] 基 P A的信号采集 与处理 系统设计 与实
现[】 D. 南京: 京理工大学, 0 ,: — 3 南 2 8 2 2. 0 62
1 4
_
w e ” 1” > au =h m ( ; h n 0 = do t su g ) 1 < 3
w e ”0 ” > au< su g ) h n 10= do t=h m ( ; 4 w e ”0 ” > au =h m ( ; h n 1 1= do t su g ) < 5 w e ” ” > au =h m ( ; h n 10= do t su g ) 1 < 6
基 于 V D 语 言的数码管闪烁控制的实现 HL
电子 质 量 ( 1第 0 期) 22 7 0
为数码管闪烁的基准时钟 , 用于控制数字 闪烁 的快慢 , 从
而达到调速的 目的。
S 4:
W HEN 3 >F S = LOW ER2 = 3CURRENT S < FF ; TAT : E<
的 显示 。
END CAS E; END I F;
2各模块设计
21分频模块 。 该模块主要用 V D H L语言实现四分频 和八分频。设
计时主要用 到计数器。主要代码如下 :
I I I GE C K I )HEN FR SNG ED fL NT
基于VHDL语言的数字时钟设计
l rr e : 2 i ayi e 一 4进 制 计 数 器 VHD 语 言 描 述 b e L
u e ie . d lgc 6 .l; s e es t o ij 1 4al
_
程 序 的仿 真 波 形 如 图 2所 示 ,n为 使 能 端 ,o为 计 满 标 e c
1 . 系统 的 工 作 流 程描 述 3
1 数 字 时钟 的 设计 方 案及 框 图
1 设 计 方 案 . 1
系统 要 完 成 的 主要 功能 有 : 1数 字 时 钟 按 2 ) 4h制 设 计 , 6只 数 码 管 显 示 小 时 、 由 分
钟、 ; 秒
如 图 1 时 钟 系 统 具 有 一 个 使 能 端 e 、 个 异 步 清 零 端 。 n一
管 的片 选 信 号 , 时作 为 选 择 显 示 数据 模 块 的地 址 产 生 器 。 同
12 系统 的 模 块 框 图 . 如 图 1 示 。 用 自顶 向 下 的 设 计 方 法 圈 通 过 对 功 能 框 所 采 , 图 的分 析 , 系 统分 模 块 来进 行 设 计 , 后 再 通 过例 化语 句 完 将 然 成 各模 块 间的衔 接 , 终实 现了顶 层描述 , 最 完成 系统预 定功 能 。
时 功 能 [ 并 且 具 有 异 步 清 零 端 cr低 电平 有 效 ) 使 能 端 e 5 1 , l( 、 n
( 电 平 有 效 ) 当 数 字 钟 处 于 正 常 计 时 状 态 时 , 成 小 时 计 高 ; 完
时 , 且 受 分计 时模 块 (0进 制 ) 位 输 出信 号 的控 制 。程 序 并 6 进
示 译码 器 . 即在一个时 间单 元 内只显示 一路信号 的值 ; ⑤动
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的数字时钟的设计
字 时钟具有 一定 的实 际应 用性 。
关键 词 : 字 时钟 ; 数 VHD Qu ru 1 L; at sI
中 图分 类号 : TN72 0
文 献标 识码 : A
h v n r d c d d a a d r fs a s i o m ut f n t n dg tl l c d sg a e o VH DL a e ito u e ie s n c atm n hp f li u ci ii co k e in b s d n — o a
制及 计算机 应用领 域 的重 要性 日益 突 出。E DA 技 术 就是 依 赖 功 能 强大 的 计算 机 , E A 工 在 D 具 软件 平 台上 , 以硬 件描述 语 言 VHDL为系 统逻 辑 描述 手段 完 成 的设 计 文件 , 对 自动地 完 成 逻 辑优 化和 仿真 测试 , 至实现 既定 的 电子线路 系统功 能 。本 文介 绍 了基于 VHD 直 L硬件 描述 语 言设 计 的 多功能数 字 时钟 的思路和 技 巧。在 Qu ru atsI开发 环境 中编译 和 仿真 了所设 计 的 1
文章 编号 :0 60 9 20 )20 1—5 10—0X(08 0—000
De i n o g t lc o k ba e n VH DL sg fdi ia l c s d o
Z a g Zi a g , u Ge ,Ti n P n h n — n L g a eg
维普资讯
第 2 期
20 08年 6 月
气 象 水 文 海 洋 仪 器
基于VHDL的数字时钟设计
1.引言在传统的硬件电路设计中,主要的设计文件是电路原理图,而采用硬件描述语言(HDL)设计系统硬件电路时主要使用HDL编写源程序。
所谓硬件描述语言,就是该语言可以描述硬件电路的功能、信号连接关系及定时关系。
许多公司开发了自己专有的HDL,但一直没有一种标准的HDL,直到1987年底,IE EE确认美国国防部开发的VHDL 为标准的硬件描述语言(IEEE-1076)。
此后,各EDA公司研制的硬件电路设计工具逐渐向VHDL靠拢,VHDL在电子设计领域得到广泛的接受,1993年,IEEE对VHDL进行了修订,公布了新版本的VHDL(即IEEE-1076-1993)。
现在,VHDL和Verilo g作为IEEE的工业标准硬件描述语言,在电子工程领域,设计人员都极其重视对其的学习研究, VHDL成为事实上的通用硬件描述语言。
2.VHDL的优点及设计流程VHDL支持硬件的设计、验证、综合和测试,以及硬件设计数据的交换、维护、修改和硬件的实现,具有描述能力强、生命周期长、支持大规模设计的分解和已有设计的再利用等优点。
VHDL程序结构特点是将一个电路模块或一个系统分成端口和内部功能算法实现两部分。
对于一个电路模块或者数字系统而言,定义了外部端口后,一旦内部功能算法完成后,其他系统可以直接依据外部端口调用该电路模块或数字系统,而不必知道其内部结构和算法。
VHDL的特点使得电子系统新的设计方法一一“自顶向下”设计方法更加容易实现。
可以先对整个系统进行方案设计,按功能划分成若干单元模块,然后对每个单元模块进一步细分编程,直到简单实现的单元电路。
本设计在MAX+plusII环境中进行,M AX+plusII是美国ALT ERA 公司提供的FPGA/CPL D开发集成环境。
M AX+plusII界面友好,使用便捷被誉为业界最容易的EDA软件。
下面详细论述使用M AX+plusII设计简易电子表的全过程。
3.VHDL设计举例:简易电子表3.1设计思想简易电子表是由各种功能管脚和计数器模块共同构成的,而其中的计数器模块是由两个60进制计数器和一个24进制计数器三个子模块组成的。
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。
VHDL秒表功能
本程序利用VHDL实现功能:按下键开始计时,再次按下停止计时,再次按下清零,再次按下开始计时4位数码管显示,最大99.99秒。
程序分为分频模块,按键消抖模块/数码管显示转换模块和top模块--通用偶数分频器—输入时钟和复位信号,输出分频后的时钟library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity gen_div isgeneric(div_param:integer:=1);--分频因子,分频为2*div_param,默认2分频port(clk:instd_logic;--输入时钟bclk:outstd_logic;--分频输出resetb:instd_logic--复位信号);end gen_div;architecture behave of gen_div issignal tmp:std_logic;--输出暂存寄存器signal cnt:integer range 0 to div_param:=0;--计数寄存器begin------------------------------process(clk,resetb)beginif resetb='1' then --reset有效时,bclk始终是0 cnt<=0;tmp<='0';elsifrising_edge(clk) thencnt<=cnt+1;if cnt=div_param-1 thentmp<=not tmp;--取反信号cnt<=0;end if;end if;end process;bclk<=tmp;--输出--------------------------------end behave;--按键消抖模块--输入时钟和复位信号,按键信号,输出按键标识--确定按下之后输出一个值library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity sig_key isport( clkin,resetin:instd_logic;--时钟,复位信号输入key:instd_logic;--键输入key_out:outstd_logic—输出按键标识);end sig_key;architecture behave of sig_key iscomponent gen_div is--分频元件调用声明generic(div_param:integer:=2);--默认是4分频port(clk:instd_logic;bclk:outstd_logic;resetb:instd_logic);----type key_state is (check_down,off_twitter,re_check_down);signal sk_state_key0:key_state:=check_down;--定义按键3状态,分别是等待按下确定按下signal clk_1k:std_logic;--1k时钟,T=1ms—用于延时begingen_1k: --分频产生1k脉冲gen_div generic map(24000)--48000分频的,产生1k脉冲port map--分频元件例化(clk=>clkin,resetb=>not resetin,bclk=>clk_1k);---check_key0_state:process(clk_1k,resetin,key)variable cnt:integer range 0 to 63:=0;beginif resetin='0' thenkey_out<='0';sk_state_key0<=check_down;elseif rising_edge(clk_1k) thencase sk_state_key0 iswhen check_down=>if key='1' then--=0位按下,1位松开sk_state_key0<=check_down;key_out<='0';--松开了,输出0elsif key='0' then--有键按下,准备消抖sk_state_key0<=off_twitter;cnt:=0;end if;when off_twitter=>--延时10ms,消抖cnt:=cnt+1;if cnt>=10 thensk_state_key0<=re_check_down;cnt:=0;end if;when re_check_down=>if key='1' thensk_state_key0<=check_down;--重新检测elsif key='0' then--确实有键按下key_out<= '1'; --输出1sk_state_key0<=check_down;--进入下一次检测end if;when others=>null;end case;end if;end if;end process;end behave;数码管显示转换模块—输入时钟复位信号和数字,输出段码--把输入的整型转变为对应显示段码library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity led_change isport( clkin,resetin:instd_logic;--时钟,复位信号输入data_in:in integer range 0 to 21;--输入整型data_out:outstd_logic_vector(7 downto 0)--数码管段码输出);end led_change;architecture behave of led_change isbeginprocess(clkin,resetin,data_in)beginif resetin='1' thendata_out<=X"FF";---复位后全灭elseif rising_edge(clkin) thencase data_in iswhen 0=>data_out<=X"03";when 1=>data_out<=X"9F";when 2=>data_out<=X"25";when 3=>data_out<=X"0d";when 4=>data_out<=X"99";when 5=>data_out<=X"49";when 6=>data_out<=X"41";when 7=>data_out<=X"1F";when 8=>data_out<=X"01";when 9=>data_out<=X"09";when 10=>data_out<=X"02";--0带点,用于区分秒和毫秒when 11=>data_out<=X"9E";--1带点,下同when 12=>data_out<=X"24";when 13=>data_out<=X"0C";when 14=>data_out<=X"98";when 15=>data_out<=X"48";when 16=>data_out<=X"40";when 17=>data_out<=X"1E";when 18=>data_out<=X"00";when 19=>data_out<=X"08";when others=>data_out<=X"FF";end case;end if;end if;end process; end behave;top模块,输入总时钟,总复位,按键,输出段码和位码--秒计数器,按下开始计时,按下停止,按下清零,按下开始library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity stopwatch isport(clk_init,reset_init:instd_logic;sw:instd_logic;led:outstd_logic;--指示状态data:outstd_logic_vector(7 downto 0);--数码管段码输出com:outstd_logic_vector(3 downto 0)--位码输出);end stopwatch;architecture behave of stopwatch is---申明分频模块gen_divcomponent gen_div isgeneric(div_param:integer:=1);--分频因子,分频为2*div_param,默认2分频port(clk:instd_logic;--输入时钟bclk:outstd_logic;--分频输出resetb:instd_logic--复位信号);end component;--申明数码管数据转换模块led_changecomponent led_change is--段码转换调用port(clkin,resetin:instd_logic;--时钟,复位信号输入data_in:in integer range 0 to 21;--输入整型data_out:outstd_logic_vector(7 downto 0)--数码管段码输出);end component;--申明按键消抖模块sig_keycomponent sig_key isport(clkin,resetin:instd_logic;--时钟,复位信号输入key:instd_logic;--键输入key_out:outstd_logic);end component;--定义信号----承接转化之前的数字signal data_1_tmp: integer range 0 to 21;--段码个位signal data_10_tmp: integer range 0 to 21;--段码十位signal data_100_tmp: integer range 0 to 21;--段码百位signal data_1000_tmp: integer range 0 to 21;--段码千位---承接经转化后的段码signal data_1:std_logic_vector(7 downto 0);--段码个位signal data_10:std_logic_vector(7 downto 0);--段码十位signal data_100:std_logic_vector(7 downto 0);--段码百位signal data_1000:std_logic_vector(7 downto 0);--段码千位signal clk_sm:std_logic;--50k扫描周期signal key_out_init:std_logic;--承接按键消抖模块传出来的按键信号signal cnt_50k:std_logic_vector(1 downto 0);--对clk_sm计数,产生4种状态,对应位码type sw_state_wich is (sw_1,sw_2,sw_3);--按钮状态,1清零等待启动,2计时中,3停止signal sw_state:sw_state_wich:=sw_1;begin--例化gen_100k: --分频产生50k脉冲gen_div generic map(480)—48M晶振,960分频,得到50k时钟port map--分频元件例化(clk=>clk_init,resetb=> not reset_init,bclk=>clk_sm);gen_data_1:--个位段码转换led_change port map(clkin=>clk_init,resetin=>not reset_init,data_in=>data_1_tmp,data_out=>data_1);gen_data_10:--十位段码转换led_change port map(clkin=>clk_init,resetin=>not reset_init,data_in=>data_10_tmp,data_out=>data_10);gen_data_100:--百位段码转换led_change port map(clkin=>clk_init,resetin=>not reset_init,data_in=>data_100_tmp,data_out=>data_100);gen_data_1000:--千位段码转换led_change port map(clkin=>clk_init,resetin=>not reset_init,data_in=>data_1000_tmp,data_out=>data_1000);key_sig:--调用按键消抖程序sig_key port map(clk_init,reset_init,sw,key_out_init);gen_cnt_50k:--cnt_50k循环计数,四个状态的循环周期是20us*4=80us,即为扫描周期process(clk_sm,reset_init,data_1000,data_100,data_10,data_1) beginif reset_init='0' thencnt_50k<="00";elseif rising_edge(clk_sm) thencnt_50k<=cnt_50k+'1';end if;end if;end process;Display:--根据上面的计数将转换后的段码送给对应的位process(cnt_50k,data_1,data_10,data_100,data_1000)begincase cnt_50k is--循环扫描when "00"=> com<="0111";data<=data_1000;--千位when "01"=> com<="1011";data<=data_100;--百位when "10"=> com<="1101";data<=data_10;--十位when "11"=> com<="1110";data<=data_1;--个位when others=> com<="1111";--全灭end case;end process;process(key_out_init,clk_sm)variable cnt_clk_1k :integer range 0 to 3000000:=0;--用于计时variable key_flog:std_logic:='0';--用于判断按键是否松开,0表示松开beginif rising_edge(clk_sm) thencase sw_state iswhen sw_1 =>if key_out_init='0' then –松开,置1key_flog:='1';end if;if key_out_init='1' and key_flog='1' then—按下,且之前是松开转到状态2开始计时,按下后flog置0sw_state<= sw_2;key_flog:='0';end if;when sw_2 =>if key_out_init='0' then--松开健开始计时,且置1key_flog:='1';cnt_clk_1k:=cnt_clk_1k+1;data_1_tmp <= ( cnt_clk_1k /50 / 10 ) rem 10;data_10_tmp <= ( cnt_clk_1k /50 / 100 ) rem 10;data_100_tmp <= ( cnt_clk_1k /50 / 1000 ) rem 10+10;data_1000_tmp <= ( cnt_clk_1k /50 / 10000 ) rem 10;end if;if key_flog='1' then –置1表示已经松开if key_out_init='1' then –再次按下sw_state<= sw_3;key_flog:='0';end if;end if;when sw_3 =>if key_out_init='0' thenkey_flog:='1';end if;if key_flog='1' thenif key_out_init='1' thensw_state<= sw_1;key_flog:='0';cnt_clk_1k:=0;data_1_tmp <=0;--清零data_10_tmp <=0;data_100_tmp <=0;data_1000_tmp <=0;end if;end if;when others =>sw_state<= sw_1;end case;end if;end process;end behave;--top程序应该有复位信号,本除没有加。
基于硬件描述语言(VHDL)的数字时钟设计
品设计 开发技 术 的发 展 . 者 以微 细加 工 技 术 为 代 前
表, 而后 者 的代 表 就 是 电子 设 计 自动 化 ( l t nc ee r i co ds na t t , D 技 术 . D 以计 算机 为工作 平 ei uo i E A) g mac EA
计, 而两个 不 同侧 面 的设 计 人 员 各 自从 事 自身 的 工 作, 彼此 很少涉 足对 方 的工作 领域 . 随着 计算 机 技 术 的发展 和硬件描 述语 言 的 出现 , 种 界 限被 打 破 , 这 即 软件 设计 人员 也 同样 可借 助 V D H L设计 出符 合 不 同
( col f l t nc Ifr ao n o m n ai sE gne n , S ho o e r i nom t nadC m u i t n nier g E co s i c o i .叭i nvr t o T cnlg , i j 0 1 1 C ia r i U i sy f ehooy Ta i 3 0 9 , h ) i n e i nn n
Absr c t a t:VHDL c n be u e o d s rb a s d t e c e, sm ua e a d de in diia y tm utmai al No d y i i lt n sg gtls se a o tc y. l wa a s, i b c me e t e o sa k y tc oo n utmai lcr ni sg e hn lg i a o t ee to cde in.Thee i o fs p ro t n t sde c pt n l n ua .Thi ri l nto u e h y c r sa lto u e r y i hi s r i a g ge i i i o sa tce i r d c st e meho n heprc s sn t d a d t o e s u ig VHDL t sg i t y tm y a x mpl fdg t lc e in.Ther s l gv n i hi ode i a dgi s se b n e a n l a eo iia co k d sg l e ut i e n t s p p r s o h tVHDL i n ft esr n e ttosi r a e h wsta so eo h to g s o l nhadwa e d s rpto n ti e il mo h sg eh d. Th r e c i i na d i saf xb ea ngt ede i m to l n e meho ie n t i a e a e c h fiu t fd gtls se d sg nd i p o e te wo k e c e c 、 t d gv n i hs p p rc n r du e te di c ly o i i y tm e in a m r v h r f i n y f a i
EDA课程设计——基于VHDL语言的数字时钟设计(可编辑)
EDA课程设计——基于VHDL 语言的数字时钟设计(可编辑)(文档可以直接使用,也可根据实际需要修改使用,可编辑推荐下载)一、设计要求 0二、设计原理及框图 01、设计原理 02、结构框图 0三、设计过程 (1)1、模块化设计 (1)2、顶层文件生成 (2)四、仿真调试过程 (3)1、各模块时序仿真图 (3)2、仿真过程中遇到的问题 (4)五、设计体会及收获 (4)一、设计要求1、稳定的显示时、分、秒。
2、当电路发生走时误差时,要求电路有校时功能。
3、电路有整点报时功能。
报时声响为四低一高,最后一响高音正好为整点。
二、设计原理及框图1、设计原理系统框图由六个模块组成,分别为:秒、分、时计数模块,整点报时模块,LED动态显示扫描模块,调时控制模块组成。
其工作原理是:基准脉冲输入信号同时加到秒、分、时、分隔符的脉冲输入端,采用并行计数的方式,秒的进位接到分的使能端上,秒的使能借到分隔符的使能上,分得接到时的使能端上,完成秒、分、时和分隔符的循环计数。
整点报时是根据分的A、B输出同时为0时,整点报时模块输出高电平控制报时。
LED显示扫描模块根据输入的扫描信号CKDSP轮流选通秒、分、时、分隔符的8位八段数码管,LED显示译码器完成计数器输出的BCD的译码。
2、结构框图三、设计过程1、模块化设计(1)秒计时模块秒计时模块由一个60位计数器为主体构成,其输入输出端口组成为:Clk:计时时钟信号Reset:异步清零信号Setmin:分钟设置信号Enmin:使能输出信号Daout[6:0]:BCD码输出(2)分计时模块分计时模块由一个60位计数器为主体构成,其输入输出端口组成为:Clk、clk1:计时时钟信号Reset:异步清零信号Sethour:小时设置信号Enmin:使能输出信号Daout[6:0]:BCD码输出(3)时计时模块时计时模块由24位计数器为主体构成,其输入输出端口组成为:Clk:计时时钟信号Reset:异步清零信号Daout[6:0]:BCD码输出(4)显示模块系统时间输出由六个七段数码管显示。
分频器VHDL
分频器的VHDL代码在数字电路中,常需要对较高频率的时钟进行分频操作,得到较低频率的时钟信号。
我们知道,在硬件电路设计中时钟信号是最重要的信号之一。
下面我们介绍分频器的VHDL 描述,在源代码中完成对时钟信号CLK 的 2 分频,4 分频,8 分频,16 分频。
这也是最简单的分频电路,只需要一个计数器即可。
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY clkdiv ISPORT(clk : IN STD_LOGIC;clk_div2 : OUT STD_LOGIC;clk_div4 : OUT STD_LOGIC;clk_div8 : OUT STD_LOGIC;clk_div16 : OUT STD_LOGIC);END clk_div;ARCHITECTURE rtl OF clk_div ISSIGNAL count : STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(clk)BEGINIF (clk"event AND clk=" 1" ) THENIF(count=” 1111” ) THENCount <= (OTHERS =>" 0" );ELSECount <= count +1;END IF ;END IF ;END PROCESS;clk_div2 <= count(0);clk_div4 <= count(1);clk_div8 <= count(2);clk_div16 <= count(3);END rtl;对于分频倍数不是 2 的整数次幂的情况,我们只需要对源代码中的计数器进行一下计数控制就可以了,如下面源代码描述一个对时钟信号进行 6 分频的分频器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_SIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY Clock ISPORT( CLK5:IN STD_LOGIC;CLK3:IN STD_LOGIC; --时钟控制SET1:IN STD_LOGIC;SET2:IN STD_LOGIC; --模式控制SEG_SEL:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);SEG_DA :OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END Clock;ARCHITECTURE ADO OF Clock ISSIGNAL SEG_BUF1,SEG_BUF2,SEG_BUF3,SEG_BUF4:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL SEG_BUF5,SEG_BUF6,SEG_BUF7,SEG_BUF8:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL SEG_CNT :STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL SEG_TEMP:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS (CLK3) --扫描累加BEGINIF CLK3'EVENT AND CLK3='1' THENSEG_CNT<=SEG_CNT+1;END IF;END PROCESS;SEG_SEL<=SEG_CNT;SEG_BUF3<="1111";SEG_BUF6<="1111";PROCESS(SEG_CNT,SEG_BUF1,SEG_BUF2,SEG_BUF3,SEG_BUF4,SEG_BUF5,SEG_BUF6,SEG_BUF7 ,SEG_BUF8)BEGINCASE SEG_CNT ISWHEN "000" => SEG_TEMP<=SEG_BUF1;WHEN "001" => SEG_TEMP<=SEG_BUF2;WHEN "010" => SEG_TEMP<=SEG_BUF3;WHEN "011" => SEG_TEMP<=SEG_BUF4;WHEN "100" => SEG_TEMP<=SEG_BUF5;WHEN "101" => SEG_TEMP<=SEG_BUF6;WHEN "110" => SEG_TEMP<=SEG_BUF7;WHEN "111" => SEG_TEMP<=SEG_BUF8;WHEN OTHERS => NULL;END CASE;END PROCESS;PROCESS (SEG_TEMP) --显示转换BEGINCASE SEG_TEMP ISWHEN "0000" => SEG_DA<=x"3F";WHEN "0001" => SEG_DA<=x"06";WHEN "0010" => SEG_DA<=x"5B";WHEN "0011" => SEG_DA<=x"4F";WHEN "0100" => SEG_DA<=x"66";WHEN "0101" => SEG_DA<=x"6D";WHEN "0110" => SEG_DA<=x"7D";WHEN "0111" => SEG_DA<=x"07";WHEN "1000" => SEG_DA<=x"7F";WHEN "1001" => SEG_DA<=x"6F";WHEN "1010" => SEG_DA<=x"77";WHEN "1011" => SEG_DA<=x"7B";WHEN "1100" => SEG_DA<=x"39";WHEN "1101" => SEG_DA<=x"3E";WHEN "1110" => SEG_DA<=x"79";WHEN "1111" => SEG_DA<=x"00";END CASE;END PROCESS;PROCESS(Clk5,SET1,SET2)BEGINif(SET1='1' AND SET2='1') then --系统复位SEG_BUF1<="0000";SEG_BUF2<="0000";SEG_BUF4<="0000";SEG_BUF5<="0000";SEG_BUF7<="0000";SEG_BUF8<="0000";elsif(Clk5'event and Clk5='1') thenif(SET1='1' and SET2='0') then --调节小时if(SEG_BUF7=9) thenSEG_BUF7<="0000";SEG_BUF8<=SEG_BUF8+1;elsif(SEG_BUF8>=2 and SEG_BUF7>=3) thenSEG_BUF7<="0000";SEG_BUF8<="0000";elseSEG_BUF7<=SEG_BUF7+1;end if;elsif(SET1='0' and SET2='1') then --调节分钟if(SEG_BUF4=9) thenSEG_BUF4<="0000";if(SEG_BUF5=5) thenSEG_BUF5<="0000";elseSEG_BUF5<=SEG_BUF5+1;end if;elseSEG_BUF4<=SEG_BUF4+1;end if;elsif(SET1='0' and SET2='0') then --正常计数SEG_BUF1<=SEG_BUF1;SEG_BUF2<=SEG_BUF2;SEG_BUF4<=SEG_BUF4;SEG_BUF5<=SEG_BUF5;SEG_BUF7<=SEG_BUF7;SEG_BUF8<=SEG_BUF8;if(SEG_BUF1=9) thenSEG_BUF1<="0000";if(SEG_BUF2=5) thenSEG_BUF2<="0000";if(SEG_BUF4=9) thenSEG_BUF4<="0000";if(SEG_BUF5=5) thenSEG_BUF5<="0000";if(SEG_BUF7=9) thenSEG_BUF7<="0000";SEG_BUF8<=SEG_BUF8+1;elsif(SEG_BUF8>=2 and SEG_BUF7>=3) thenSEG_BUF7<="0000";SEG_BUF8<="0000";elseSEG_BUF7<=SEG_BUF7+1;end if;elseSEG_BUF5<=SEG_BUF5+1;end if;elseSEG_BUF4<=SEG_BUF4+1;end if;elseSEG_BUF2<=SEG_BUF2+1;end if;elseSEG_BUF1<=SEG_BUF1+1;end if;end if;end if;end process;end ADO;引脚绑定:ClK3 PIN_25CLK5 PIN_89SET1 PIN_32SET2 PIN_33SEG_DA[7] PIN_128SEG_DA[6] PIN_142SEG_DA[5] PIN_141SEG_DA[4] PIN_138SEG_DA[3] PIN_137SEG_DA[2] PIN_136SEG_DA[1] PIN_135SEG_DA[0] PIN_133SEG_SEL[2] PIN_127SEG_SEL[1] PIN_126SEG_SEL[0] PIN_125仿真图:。