文档库 最新最全的文档下载
当前位置:文档库 › 基于VHDL的多功能电子钟

基于VHDL的多功能电子钟

基于VHDL的多功能电子钟
基于VHDL的多功能电子钟

数字系统课程设计报告

课程设计题目:基于vhdl语言的电子钟

组员:陈洪彬,麦俊辉,缪超

课程设计要求:

设计一个用4位数码管显示的电子钟,包括整点报时,闹钟功能,4按键输入

采用 VHDL 语言描述系统功能,并在 QUARTUS II 工具软件中进行仿真,下载到 EDA 实验板进行验证。编写设计报告,要求包括方案选择、程序代码清单、调试过程、测试结果及心得体会。

一、软硬件资源分析

实验室提供了Altera公司的cyclone系列EP1C6Q240C8实验开发板,该开发板提供了四个自由按键,八个发光LED,蜂鸣器,四个七段数码管,四位拨码开关等等硬件资源。我们所设计的数字钟用到了四个自由按键用于对显示的选择,对设置时间的选择,还有用于用于设置时间时的加一操作,四个七段数码管用于显示,蜂鸣器用于整点报时和闹钟,还有四个发光LED用于判断自由按键的通断。以下列表对数字钟中用到的硬件资源进行说明:

总体设计框图:

Key1的1表示闹钟,0表示时钟;

Key2则是‘时-分’切换或者‘时分-分秒’切换。

各模块介绍

(1)分频器

在数字钟的设计中,采用了芯片内部提供的

50MHz 全局时钟,将其分频率后产生一个接近 1Hz

秒时钟 clk1,一个 2Hz 左右的闪烁时钟clk2,一

个显示模块800Hz的clk3,一个用于消抖模块的

20000Hz的clk4。clk1作用是:每秒产生一个脉冲,

触发“秒”的累加。clk2作用是:在修改状态下通

过判断clk2的电平值来决定数码管的亮灭。clk3作

用是:作为扫描频率刷新数码管的示数。具体做法

是令clk不断产生50MHz的方波,同时clk作为累加

器的触发源。当累加器累计到一定数目时,使

clk1,clk2,clk3,clk4的电平发生跳转,从而输出

不同频率的方波。

设计要点:例如要产生20000Hz,即周期50us。50,000,000/20000=2500,即使50MHz的晶振频率作为累加触发源,累计到1250个方波则使clk4状态反转。

程序:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

ENTITY distribu1 IS

PORT(

clk:IN STD_LOGIC;--晶振时钟

clk1: BUFFER STD_LOGIC; --1Hz,用于秒的增加

clk2: BUFFER STD_LOGIC;--2Hz,用于修改时间的闪烁

clk3: BUFFER STD_LOGIC;--800Hz,显示模块的扫描时钟

clk4: BUFFER STD_LOGIC);--20000Hz消除抖动的扫描时钟END ENTITY distribu1;

ARCHITECTURE one OF distribu1 IS

BEGIN

dividefreq1Hz:PROCESS(clk) --1Hz

VARIABLE z1: integer range 0 to 25000000;

BEGIN

IF(clk'event AND clk='1')THEN

z1:=z1+1;

if z1=25000000 then

z1:=0;

clk1<= not clk1; --25,000,000 END IF;

END IF;

END PROCESS dividefreq1Hz;

dividefreq2Hz:PROCESS(clk) --2Hz

VARIABLE z2: integer range 0 to 12500000;

BEGIN

IF(clk'event AND clk='1')THEN

z2:=z2+1;

if z2=12500000 then

z2:=0;

clk2<= not clk2;

END IF;

END IF;

END PROCESS dividefreq2Hz;

dividefreq800Hz:PROCESS(clk) --800Hz

VARIABLE z3: integer range 0 to 31250;

BEGIN

IF(clk'event AND clk='1')THEN

z3:=z3+1;

if z3=31250 then

z3:=0;

clk3<= not clk3;

END IF;

END IF;

END PROCESS dividefreq800Hz;

dividefreq02MS:PROCESS(clk) --0.05ms,20000Hz

VARIABLE z4 : integer range 0 to 1250;

BEGIN

IF(clk'event AND clk='1')THEN

z4:=z4+1;

if z4=1250 then

z4:=0;

clk4<= not clk4;

END IF;

END IF;

END PROCESS dividefreq02mS;

END one;

仿真:由于信号频率相差较大,所以仿真结果以clk4为代表,另外几个信号没有显示得出来:

(2)消除抖动模块

该数字钟将用到 4个自由按键,故程序只对这四个开关进行去抖。

去抖原理如下:机械开关在按下时都会一定的抖动,对应信号线电平的变化有一个不稳定期,在读取按键状态时必须避开这个不稳定期,以免造成误判。本文采用了这延迟算法进行去抖。利用频率较高的时钟(本文采用了扫描时钟 clk)反复读取按键状态,并利用一个寄存器来记录当前状态出现的次数,如果当前状态与前一次读取的状态不一样,则将计

数寄存器清零;如果当前状态与前一次读取

的状态一致,刚计数寄存器加 1。当计数寄

存器达到一定值 N 时便认为按键已按下并

产生了一个电平改变。

设计要点:虽然我们采用4位自由开关,

实际上其中key1,key2,和key3充当拨码开

关的功能,而key4实现按键功能拨码开关与

自由按键的处理是不同的,因为拨码开关是

有两个稳定状态的,即可任意长时间处于‘0’或‘1’态,而自由按键只有一个稳态,例如在实验板上,未进行操作时自由按键的输出默认是高电平,如果按一下,变为低电平,操作者一旦松手,按键输出自动恢复为高电平。因此在处理时,让自由按键一次按便输出一个脉冲(相当于进行了两次电平转换,而不是一次)。

程序:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY debounce2 IS

PORT(

clk4: IN STD_LOGIC; --消除抖动的扫描时钟

key1in:IN STD_LOGIC;--按键的输入

key1out:BUFFER STD_LOGIC;--按键的输出

key2in:IN STD_LOGIC;

key2out:BUFFER STD_LOGIC;

key3in:IN STD_LOGIC;

key3out:BUFFER STD_LOGIC;

key4in:IN STD_LOGIC;

key4out:BUFFER STD_LOGIC);

END debounce2 ;

ARCHITECTURE behave OF debounce2 IS

BEGIN

pkey1:PROCESS(clk4,key1out)

VARIABLE count1 : integer range 0 to 100; ---处理抖动的时为0.2msX100=20ms

BEGIN

if key1in='0' then

IF(clk4'EVENT AND clk4 = '1') THEN

if count1=100 then count1:=count1;--20ms后结束处理

else count1:=count1+1;

end if;

if count1=99 then key1out<= not key1out; --延时到后状态反转

else key1out<=key1out;

end if;

end if;

else count1:=0;

end if;

END PROCESS pkey1;

pkey2:PROCESS(clk4,key2out)

VARIABLE count2 : integer range 0 to 100;

BEGIN

if key2in='0' then

IF(clk4'EVENT AND clk4 = '1') THEN

if count2=100 then count2:=count2;

else count2:=count2+1;

end if;

if count2=99 then key2out<= not key2out;

else key2out<=key2out;

end if;

end if;

else count2:=0;

end if;

END PROCESS pkey2;

pkey3:PROCESS(clk4,key3out)

VARIABLE count3 : integer range 0 to 100;

begin

if key3in='0' then

IF(clk4'EVENT AND clk4 = '1') THEN

if count3=100 then count3:=count3;

else count3:=count3+1;

end if;

if count3=99 then key3out<=not key3out;

else key3out<=key3out;

end if;

end if;

else count3:=0;

end if;

END PROCESS pkey3;

pkey4:PROCESS(clk4,key4out) --Key4out不同以上处理

VARIABLE count4 : integer range 0 to 100;

BEGIN

if key4in='0' then

IF(clk4'EVENT AND clk4 = '1') THEN

if count4=100 then count4:=count4;

else count4:=count4+1;

end if;

if count4=99 then key4out<= '1';--延时20ms后给key4out 一个上升沿

else key4out<='0';---其余时间key4out都为'0'

end if;

end if;

else count4:=0;

end if;

END PROCESS pkey4;

END behave;

我们在仿真时,由于消抖时时钟周期要求过大,我们对消抖时间对应的时钟周期进行改动,将其改小,从而从仿真中可以看出消抖的效果,我们设消抖的延迟时间为八个时钟周期,则仿真结果如下:

从图中看出,已经实现消抖。

(3)时间设置模块:

主要分为手动增值和自动增值两个进程。当key4按下,且key3out=’1’时进入手动增值模式。Key2和key1在不同状态对应不同的情况,分别是时钟小时,时钟分钟,闹钟小时,闹钟分钟。自动增值和手动增值都要在更新了要加的值之后才进行上述的增值。由于更新的需要,要把输出端的“a”和“b”互相传输,所以设置了一组“ain”和“bin”来过渡,且VHDL不能把输出口值赋给输入口,所以在原理图上强制把输出口连接到输入口。

小时部分:将小时分成两位分别设置,当小时十位为0010,个位是0011,即为23点的时候,再加一就将十位个位都设置为0000。而其他情况中,小时将加从0000到0010(2)循环运行。而小时个位为从0000到1001(即为9)循环运行。当分钟部分,十位为0101,而个位为1001(即59分)再加一时,小时个位加一;当小时个位从1001(9)加一时,小时十位加一。时间设置时,选定设置位,key4in按下时,选定位加一。

分钟部分:分钟部分也分为十位及个位分别设置,当小时为十位0101而个位是1001(即59分)时,再加一就将十位和个位都清零。而其他情况,十位按照0000到0101(0到5)循环,个位从0000到1001(0到

59秒)再加一时,分钟个位加一;当分钟个位从1001

(9)加一时,分钟十位加一。时间设置时,选定设置

位,key4in按下时,选定位加一。

秒钟部分:跟分钟一样,秒钟部分也分为十位及个

位分别设置,当十位0101而个位是1001(即59分)

时,再加一就将十位和个位都清零。而其他情况,十位

按照0000到0101循环,个位从0000到1001(0到9)

循环。其正常时间工作时个位在1HZ脉冲上升沿来到时

加一。时间设置时,选定设置位,key4in按下时,选定

位加一。

闹钟时间设置:本模块分4个进程,分别对闹钟时

间的小时十位,小时个位,分钟十位,分钟个位进行检

测,每个进程均以芯片的晶振50MHz进行触发。对分

钟个位,来一个时钟的上升沿,检测按键输出状态,当

key1out='1' and key2out='0' and key3out='1' 时每输入

一个key4in信号脉冲使得key4out来上升沿则闹钟设置

的分钟个位加1,当个位加到9,再加一次则复位为0;

下一个进程检测分钟十位,每来一个时钟上升沿,在对

应的按键状态下,当个位为9时,再来一个key4out上

升沿脉冲则分钟十位加1,当加到十位为5,个位为9,

则再加一次就复位为0。同样原理设计闹钟小时部分。

自动增值则是由每一个1Hz的clk上升沿触发,每秒加一次。

程序如下:

library ieee;

use ieee.std_logic_1164.all;

use IEEE.STD_LOGIC_ARITH.ALL;

use ieee.std_logic_unsigned.all;

entity shijian2 is

port(

clk:in std_logic;

key1out:in std_logic; ---按键状态

key2out:in std_logic;

key3out:in std_logic;

key4out:in std_logic;

hou1a:buffer std_logic_vector(3 downto 0); -- 手动修改后的时间数据

hou2a:buffer std_logic_vector(3 downto 0);

min1a:buffer std_logic_vector(3 downto 0);

min2a:buffer std_logic_vector(3 downto 0);

seth1a: buffer std_logic_vector(3 downto 0); ---手动修改后或没有修改的闹钟数据

seth2a: buffer std_logic_vector(3 downto 0);

setm1a: buffer std_logic_vector(3 downto 0);

setm2a: buffer std_logic_vector(3 downto 0);

hou1b:buffer std_logic_vector(3 downto 0); ---每1秒自动加1的时钟数据

hou2b:buffer std_logic_vector(3 downto 0);

min1b:buffer std_logic_vector(3 downto 0);

min2b:buffer std_logic_vector(3 downto 0);

sec1b:buffer std_logic_vector(3 downto 0);

sec2b:buffer std_logic_vector(3 downto 0);

hou1ain:in std_logic_vector(3 downto 0); --若之前为手动修改时间模式的数据,

hou2ain:in std_logic_vector(3 downto 0); --要把修改后的时钟数据赋值给“b”代表显示模式的数据(即刷新)

min1ain:in std_logic_vector(3 downto 0);

min2ain:in std_logic_vector(3 downto 0);

hou1bin:in std_logic_vector(3 downto 0); ----用于更新a的值

hou2bin:in std_logic_vector(3 downto 0);

min1bin:in std_logic_vector(3 downto 0);

min2bin:in std_logic_vector(3 downto 0)

);

end entity shijian2;

architecture one of shijian2 is

begin

--hou1ain<=hou1a;-----已在电路图上连线

--hou2ain<=hou2a;

--min1ain<=min1a;

--min2ain<=min2a;

--hou1bin<=hou1b;

--hou2bin<=hou2b;

--min1bin<=min1b;

--min2bin<=min2b;

shoudong:process(key1out,key2out,key3out,key4out) ----手动修改

begin

if key3out='0' then

hou1a<=hou1bin; ----更新a的值

hou2a<=hou2bin;

min1a<=min1bin;

min2a<=min2bin;

elsif(key4out'event and key4out='1') then

if(key3out='1'AND key2out='0' AND key1out='0')then ----校时钟小时位,手动加1脉冲

if hou2a="0011" and hou1a="0010" then ----检查进位,“a"代表手动修改模式的数据

hou2a<="0000";

hou1a<="0000";

elsif hou2a="1001" then

hou1a<=hou1a+1;

hou2a<="0000";

else hou2a<=hou2a+1;

end if;

elsif (key3out='1'AND key2out='1' AND key1out='0')then-----校时钟分钟位,手动加1脉冲

if min2a="1001" and min1a="0101" then ----检查进位

min2a<="0000";

min1a<="0000";

elsif min2a="1001" then

min2a<="0000";

min1a<=min1a+1;

else min2a<=min2a+1;

end if;

elsif (key3out='1'AND key2out='0' AND key1out='1')then ------校闹钟小时位,手动加1脉冲if seth2a="0011" and seth1a="0010" then ----检查进位

seth2a<="0000";

seth1a<="0000";

elsif seth2a="1001" then

seth1a<=seth1a+1;

seth2a<="0000";

else seth2a<=seth2a+1;

end if;

elsif (key3out='1'AND key2out='1' AND key1out='1')then ------校闹钟分钟位,手动加1脉冲if setm2a="1001" and setm1a="0101" then ----检查进位

setm2a<="0000";

setm1a<="0000";

elsif setm2a="1001" then

setm2a<="0000";

setm1a<=setm1a+1;

else setm2a<=setm2a+1;

end if;

end if;

end if;

end process;

zidong:process(key1out,key3out,key4out,clk) ----每1秒自动加1

if( key3out='1' and key1out='0') then ---若之前为手动修改时间模式,要把修改后的时钟数据赋给“b”(即刷新)

---key3out的“1”代表修改,key1out的“0”代表时钟而不是闹钟

hou1b<=hou1ain; --“b”代表显示模式的数据

hou2b<=hou2ain;

min1b<=min1ain;

min2b<=min2ain;

elsif key4out='0' then ----key4没有按下

if( clk'event and clk='1') then

if sec2b="1001" then

sec2b<="0000";

sec1b<=sec1b+1;

if sec1b="0101" then

sec1b<="0000";

min2b<=min2b+1;

if min2b="1001" then

min2b<="0000";

min1b<=min1b+1;

if min1b="0101" then

min1b<="0000";

if hou1b="0010" and hou2b="0011" then

hou1b<="0000";

hou2b<="0000";

elsif hou2b="1001" then

hou2b<="0000";

hou1b<=hou1b+1;

else hou2b<=hou2b+1;

end if;

end if;

end if;

end if;

ELSE sec2b<=sec2b+1;

end if;

END IF;

END IF;

end process;

仿真:(由于仿真限制,仿真用了clk代替clk1)

1)手动增值

2)自动增值

(4)按键显示发光LED模块:

此模块主要功能是帮助确认按键所处的状态,从而确定数字钟显示的内容。这个模块利用发光LED与按键消抖后的输出相连,当输出为低电平时,即按键按下时,点亮LED,而输出为高电平时,即没有按下按键时,LED熄灭。

仿真结果:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

---------按键显示模块,按键按下,相应的led则发光或熄

ENTITY ledkey IS

PORT( key1out:IN STD_LOGIC; architecture behave of ledkey is key2out:IN STD_LOGIC; begin

key3out:IN STD_LOGIC; process(key1out,key2out,key3out) key4out:IN STD_LOGIC; begin

led1out: out STD_LOGIC; if key1out='0' then led1out<='0';

led2out: out STD_LOGIC; else led1out<='1';

led3out: out STD_LOGIC; end if;

led4out: out STD_LOGIC); if key2out='0' then led2out<='0'; end entity; else led2out<='1';

end if;

if key3out='0' then led3out<='0';

else led3out<='1';

end if;

if key4out='0' then led4out<='0';

else led4out<='1';

end if;

end process;

end behave;

仿真结果:

(5)声音模块:

本模块只包括1个进程,进程分为3个判断的

部分。分别为闹钟时间到的发声和整点报时到的发

声。第一个部分判断是否处于时钟显示模式且key4

是否按下,如果都满足则赋高电平给蜂鸣器输出端

口beep,使其不发出声音。第二个部分判断时钟

时间是否与闹钟时间相等,若是,则把低电平信号

赋给蜂鸣器输出端口beep,直到手动按停。如果

期间按键4按下key4out='0'则停止发声。第三个部

分判断是否整点到了。到了59分,52秒,54秒,

56秒时把clk3赋给beep,使其发声,58秒时赋一

个高电平‘1’给beep,达到最后一个音的音调

变高的效果。其余的50,21,53,55,57,59秒赋低电平

给蜂beep高电平停止发声。

程序:

library ieee;

use ieee.std_logic_1164.all;

use IEEE.STD_LOGIC_ARITH.ALL;

use ieee.std_logic_unsigned.all;

entity alarm is

port(

key1out:in std_logic;

key2out:in std_logic;

key3out:in std_logic;

key4out:in std_logic;

seth1a:in std_logic_vector(3 downto 0);

seth2a:in std_logic_vector(3 downto 0);

setm1a:in std_logic_vector(3 downto 0);

setm2a:in std_logic_vector(3 downto 0);

hou1b:in std_logic_vector(3 downto 0);

hou2b:in std_logic_vector(3 downto 0);

min1b:in std_logic_vector(3 downto 0);

min2b:in std_logic_vector(3 downto 0);

sec1b:in std_logic_vector(3 downto 0);

sec2b:in std_logic_vector(3 downto 0);

clk3:in std_logic;--------用于整点报时的音调变化

beep:out std_logic

);

end entity alarm;

architecture one of alarm is

begin

process(key4out,seth1a,seth2a,setm1a,setm2a,hou1b,hou2b,min1b,min2b,sec1b,sec2b)

begin

if key4out'event and key4out='1' then--------手动按停声音

if(key3out='0' AND key2out='0' AND key1out='0') or

(key3out='0' AND key2out='1' AND key1out='0')then

beep<='1';

end if;

end if;

if(seth1a=hou1b and seth2a=hou2b and setm1a=min1b and setm2a=min2b and sec1b="0000" and sec2b="0000")then

----闹钟时间到

beep<='0';

end if;

if(min1b="0101" and min2b="1001") then--------整点时间到

if(sec1b="0101") then

if(sec2b="0010" or sec2b="0100" or sec2b="0110") then beep<=clk3;----从52,54,56秒响

elsif(sec2b="1000") then beep<='0';----58秒的音调变高

else beep<='1';----59秒自动停止声音

end if;

else beep<='1';

end if;

end if;

end process;

end one;

仿真:

以下18:00前后,先是整点闹钟响,接着整点报时响。

(6)译码显示以及闪烁模块:

思路:此模块包含4位数码管位选,段选,判断输出显示状态或者设置(修改)状态,判断是否闪烁等功能。通过判断key1~key3的状态来确定给4位数码管输出的内容。

程序分为两个进程,第一个进程用来决定位选与段选。位选部分使用累加器实现每进入一次程序依次循环选中每一位数码管。然后根据检测的情况(时间时--分,时间分—秒,闹钟时--分,闹钟分--秒)把要显示的内容从“中间量”以BCD码的形式赋值给“最终量”,再判断“最终量”代表的数字值,再把数字值相应的段选码送给段选。位选与段选的数据送至数码管就能实现译码显示功能。

第二个进程有两个用途:a.用来更新显示内容,通过不断把即时要显示的内容(时--分或分--秒或不显示)送至“中间量”,由第一个进程送出去输出。b.用来控制闪烁,由clk2(2Hz)判断数码管的亮灭,当clk2=1,把时—分或分—秒的BCD码赋值给“中间量”,即为数码管“亮”;当clk2=0,按情况把选择要闪烁的那两位用“1111”(在进程一内被判定为“灭”)代替BCD码赋值给“中间量”,这样进程一可表现为“灭”。

程序:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY display2 IS

PORT(

clk2:IN STD_LOGIC; --半秒的驱动

clk3:IN STD_LOGIC; --扫描数码管的驱动频率

dout:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); --段选

selout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --位选

hou1a:in std_logic_vector(3 downto 0); --修改模式的时钟数据

hou2a:in std_logic_vector(3 downto 0);

min1a:in std_logic_vector(3 downto 0);

min2a:in std_logic_vector(3 downto 0);

seth1a:in std_logic_vector(3 downto 0); --闹钟数据(只有一种模式)

seth2a:in std_logic_vector(3 downto 0);

setm1a:in std_logic_vector(3 downto 0);

setm2a:in std_logic_vector(3 downto 0);

hou1b:in std_logic_vector(3 downto 0); --显示模式的时钟数据

hou2b:in std_logic_vector(3 downto 0);

min1b:in std_logic_vector(3 downto 0);

min2b:in std_logic_vector(3 downto 0);

sec1b:in std_logic_vector(3 downto 0);

sec2b:in std_logic_vector(3 downto 0);

key1out:in std_logic;

key2out:in std_logic;

key3out:in std_logic);

END ENTITY display2 ;

ARCHITECTURE behave OF display2 IS

signal sel:std_logic_vector(2 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);

BEGIN--input time as BCD code for each digit

disp1:process(clk3,sel) --传输数据给数码管

begin

if (clk3'event AND clk3='1') then --循环改变位选

if sel="100" then

sel<="001";

else sel<=sel+1;

end if;

if sel="001" then

selout<="0111";

case h1 is --h1,h2,m1,m2是最后要显示的数据(第一级) when "0000"=>dout<="00001100";

when "0001"=>dout<="01101111";

when "0010"=>dout<="10101000";

when "0011"=>dout<="00101001";

when "0100"=>dout<="01001011";

when "0101"=>dout<="00011001";

when "0110"=>dout<="00011000";

when "0111"=>dout<="01101101";

when "1000"=>dout<="00001000";

when "1001"=>dout<="00001001";

when others=>dout<="11111111";

end case;

elsif sel="010" then

selout<="1011";

case h2 is

when "0000"=>dout<="00000100"; when "0001"=>dout<="01100111"; when "0010"=>dout<="10100000"; when "0011"=>dout<="00100001"; when "0100"=>dout<="01000011"; when "0101"=>dout<="00010001"; when "0110"=>dout<="00010000"; when "0111"=>dout<="01100101"; when "1000"=>dout<="00000000"; when "1001"=>dout<="00000001"; when others=>dout<="11110111"; end case;

elsif sel="011" then

selout<="1101";

case m1 is

when "0000"=>dout<="00001100"; when "0001"=>dout<="01101111"; when "0010"=>dout<="10101000"; when "0011"=>dout<="00101001"; when "0100"=>dout<="01001011"; when "0101"=>dout<="00011001"; when "0110"=>dout<="00011000"; when "0111"=>dout<="01101101"; when "1000"=>dout<="00001000"; when "1001"=>dout<="00001001"; when others=>dout<="11111111"; end case;

elsif sel="100" then

selout<="1110";

case m2 is

when "0000"=>dout<="00001100"; when "0001"=>dout<="01101111"; when "0010"=>dout<="10101000"; when "0011"=>dout<="00101001"; when "0100"=>dout<="01001011"; when "0101"=>dout<="00011001"; when "0110"=>dout<="00011000"; when "0111"=>dout<="01101101"; when "1000"=>dout<="00001000";

when "1001"=>dout<="00001001";

when others=>dout<="11111111";

end case;

end if;

end if;

end PROCESS disp1;

disp2:process(clk3)

begin

IF( clk3'event and clk3 = '1') THEN

--------------------------------------确定显示状态的数据

if (key3out='0'AND key2out='1' AND key1out='0')then --shijian模块的显示小时分钟数据h1<=hou1b;

h2<=hou2b;

m1<=min1b;

m2<=min2b;

elsif (key3out='0'AND key2out='0' AND key1out='0')then --显示分钟秒钟数据

h1<=min1b;

h2<=min2b;

m1<=sec1b;

m2<=sec2b;

elsif (key3out='0'AND key2out='0' AND key1out='1')then --闹钟小时分钟数据

h1<=seth1a;

h2<=seth2a;

m1<=setm1a;

m2<=setm2a;

elsif (key3out='0'AND key2out='1' AND key1out='1')then --闹钟分钟秒钟数据,默认秒钟为0 h1<=setm1a;

h2<=setm2a;

m1<="0000";

m2<="0000";

end if;

--------------------------------------确定修改状态的数据

if (key3out='1'AND key2out='0' AND key1out='0')then --修改时钟小时,令小时位闪亮

IF( clk2 = '1') THEN --每半秒亮灭交替

h1<=hou1a;

h2<=hou2a;

m1<=min1a;

用VHDL实现数字时钟的设计[1]

收稿日期:2007-06-04 第一作者 刘竹林 男 27岁 助教 用V HDL 实现数字时钟的设计 刘竹林 李晶骅 (十堰职业技术学院电子工程系,湖北十堰442000) 摘 要:以一款数字钟设计为例,较详细的介绍了如何用VHDL 语言设计数字电路,并给出了部分程序、仿真 波形图,并在MAX +plusII 中进行编译、仿真、下载。由此说明利用VHDL 开发数字电路的优点。 关键词:VHDL ;设计;数字钟;应用电路中图分类号:TN953 文献标识码:A 0 引言 VHDL 硬件描述语言在电子设计自动化(EDA )中扮演 着重要的角色,它的出现极大的改变了传统的设计方法、设 计过程乃至设计观念。由于采用了“自顶向下” (Top 2Down )的全新设计方法,使设计师们摆脱了大量的辅助设计工作, 而把精力集中于创造性的方案与概念构思上,用新的思路来发掘硬件设备的潜力,从而极大地提高了设计效率,缩短了产品的研制周期。 这种设计方法首先从系统设计入手,在顶层进行功能方框图的划分和结构设计。在方框图一级进行仿真、纠错,并用硬件描述语言对高层次的系统行为进行描述,在系统一级进行验证。然后用综合优化工具生成具体门电路的网表,其对应的物理实现级可以是印刷电路板或专用集成电路。由于设计的主要仿真和调试过程是在高层次上完成的,这不仅有利于早期发现结构设计上的错误,避免设计工作的浪费,而且也减少了逻辑功能仿真的工作量,提高了设计的一次成功率。 1 用V HDL 设计一款数字钟 我们设计的数字时钟原理框图如图1。其基本功能划 分为:计数模块(包括秒、分、时)、译码模块、扫描显示控制模块。计数模块由两个60进制计数器和一个24进制计数器组成,分别对秒、分、小时进行计数,当计数到23点59分59秒的时候,即一天结束,计数器清零, 新的一天重新开始计数。 图1 数字时钟原理框图 秒计数器的计数时钟信号为1Hz 的标准信号,可以由系 统板上提供的4MHz 信号通过222分频得到。秒计数器的进位输出信号作为分钟计数器的计数信号,分钟计数器的进位输出信号又作为小时计数器的计数信号。设计一个同时显示时、分、秒6个数字的数字钟,则需要6个七段显示器。若同时点亮这6个七段显示器,则电路中会产生一个比较大的电流,很容易造成电路烧坏,我们通过扫描电路来解决这一问题,通过产生一个扫描信号CS (0)-CS (5)来控制6个七段显示器,依次点亮6个七段显示器,也就是每次只点亮一个七段显示器。只要扫描信号CS (0)-CS (5)的频率超过人的眼睛视觉暂留频率24Hz 以上,就可以达到尽管每次点亮单个七段显示器,却能具有6个同时显示的视觉效果,而且显示也不致闪烁抖动。 其中6位扫描信号一方面控制七段显示器依次点亮,一方面控制6选1选择器输出相应显示数字。 2 模块设计 2.1 VHDL 语言的基本结构 一个独立的设计实体通常包括:实体(EN TIT Y )、结构体(ARCHITECTURE )、配置(CONFIGURA TION )、包集合(PACKGE )、和库(L IBRAR Y )5个部分。其中实体用于描述所设计的系统的外部接口信号;构造体用于描述系统内部的结构和行为;建立输入和输出之间的关系;配置语句安装具体元件到实体—结构体对,可以被看作是设计的零件清单;包集合存放各个设计模块共享的数据类型、常数和子程序等;库是专门存放预编译程序包的地方。VHDL 程序设计基本结构如图2 。 图2 VHDL 程序设计基本结构 2.2 各模块的实现 2.2.1 计数模块(建立VHDL 语言的工程文件) 计数模块由两个60进制计数器和一个24进制计数器组成,分别对秒、分、小时进行计数。其VHDL 源程序相差不大由于篇幅有限,这里我们以秒模块的实现为例。程序如下: library ieee ; use ieee.std -logic -1164.all ;entity counter -60-bcd is 山西电子技术 2008年第1期 应用实践

基于VHDL的电子计时器的设计

EDA技术及应用课程设计 题目:基于VHDL的数字计时器 班级:电气1202班 姓名:李玉靖 学号:20121131080 指导老师:汪媛 (课程设计时间:2015年1月5日——2015年1月9日) 华中科技大学武昌分校

目录 1引言 (1) 1.1 EDA简介 (1) 1.2 VHDL简介 (2) 1.3 VHDL的特点 (3) 1.4 VHDL的设计结构 (4) 1.5 VHDL的设计步骤 (4) 2设计主要内容 (5) 3内部各功能模块 (6) 3.1六十进制计数模块 (6) 3.2二十四进制计数模块 (8) 3.3分频器模块 (10) 3.4LED显示模块 (11) 4顶层系统联调 (15) 5结语 (21) 6参考文献 (22) 7附录 (23)

1.引言 随着科学技术的迅猛发展,电子工业界经历了巨大的飞跃。集成电路的设计正朝着速度快、性能高、容量大、体积小和微功耗的方向发展。基于这种情况,可编程逻辑器件的出现和发展大大改变了传统的系统设计方法。可编程逻辑器件和相应的设计技术体现在三个主要方面:一是可编程逻辑器件的芯片技术;二是适用于可逻辑编程器件的硬件编程技术,三是可编程逻辑器件设计的EDA开发工具,它主要用来进行可编程逻辑器件应用的具体实现。在本实验中采用了集成度较高的FPGA 可编程逻辑器件, 选用了VHDL硬件描述语言和MAX + p lusⅡ开发软件。VHDL硬件描述语言在电子设计自动化( EDA)中扮演着重要的角色。由于采用了具有多层次描述系统硬件功能的能力的“自顶向下”( Top - Down)和基于库(L ibrary - Based)的全新设计方法,它使设计师们摆脱了大量的辅助设计工作,而把精力集中于创造性的方案与概念构思上,用新的思路来发掘硬件设备的潜力,从而极大地提高了设计效率,缩短 了产品的研制周期。MAX + p lusⅡ是集成了编辑器、仿真工具、检查/分析工具和优化/综合工具的这些所有开发工具的一种集成的开发环境,通过该开发环境能够很方便的检验设计的仿真结果以及建立起与可编程逻辑器件的管脚之间对应的关系。 1.1 EDA简介 20世纪90年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成功。在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。 EDA是电子设计自动化(Electronic Design Automation)的缩写,在20世纪90年代初从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言HDL 完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射

基于VHDL的多功能数字钟设计报告

基于VHDL的多功能数字钟 设计报告 021215班 卫时章 02121451

一、设计要求 1、具有以二十四小时制计时、显示、整点报时、时间设置和闹钟的功能。 2、设计精度要求为1秒。 二、设计环境:Quartus II 三、系统功能描述 1、系统输入:时钟信号clk采用50MHz;系统状态及较时、定时转换的控制信号为k、set,校时复位信号为reset,均由按键信号产生。 2、系统输出:LED显示输出;蜂鸣器声音信号输出。 3、多功能数字电子钟系统功能的具体描述如下: (一)计时:正常工作状态下,每日按24h计时制计时并显示,蜂鸣器无声,逢整点报时。 (二)校时:在计时显示状态下,按下“k”键,进入“小时”待校准状态,若此时按下“set”键,小时开始校准;之后按下“k”键则进入“分”待校准状态;继续按下“k”键则进入“秒”待复零状态;再次按下“k”键数码管显示闹钟时间,并进入闹钟“小时”待校准状态;再次按下“k”键则进入闹钟“分”待校准状态;若再按下“k”键恢复到正常计时显示状态。若校时过程中按下“reset”键,则系统恢复到正常计数状态。 (1)“小时”校准状态:在“小时”校准状态下,显示“小时”的数码管以2Hz 闪烁,并按下“set”键时以2Hz的频率递增计数。 (2)“分”校准状态:在“分”校准状态下,显示“分”的数码管以2Hz闪烁,并按下“set”键时以2Hz的频率递增计数。 (3)“秒”校准状态:在“秒复零”状态下,显示“秒”的数码管以2Hz闪烁,并以1Hz的频率递增计数。 (4)闹钟“小时”校准状态:在闹钟“小时”校准状态下,显示“小时”的数码管以2Hz闪烁,并按下“set”键时以2Hz的频率递增计数。 (5)闹钟“分”校准状态:在闹钟“分”校准状态下,显示“分”的数码管以2Hz闪烁,并按下“set”键时以2Hz的频率递增计数。 (三)整点报时:蜂鸣器在“59”分钟的第“51”、“53”、“55”、“57”秒发频率为500Hz的低音,在“59”分钟的第“59”秒发频率为1000Hz的高音,结束时为整点。 (四)显示:采用扫描显示方式驱动4个LED数码管显示小时、分,秒由两组led灯以4位BCD 码显示。 (五)闹钟:闹钟定时时间到,蜂鸣器发出频率为1000Hz的高音,持续时间为60秒。 四、各个模块分析说明 1、分频器模块(freq.vhd) (1)模块说明:输入一个频率为50MHz的CLK,利用计数器分出 1KHz的q1KHz,500Hz的q500Hz,2Hz的q2Hz和1Hz的q1Hz。 (2)源程序: library ieee;

vhdl课程设计(电子钟+闹铃)

数字钟的设计 一、系统功能概述 (一)、系统实现的功能: 1、具有“时”、“分”、“秒”的十进制数字显示(小时从00 ~ 23)。 2、具有手动校时、校分、校秒的功能。 3、有定时和闹钟功能,能够在设定的时间发出闹铃声。 4、能进行整点报时。从59分50秒起,每隔2秒发一次低音“嘟”的信号,连续5次, 最后一次为高音“嘀”的信号。 (二)、各项设计指标: 1、显示部分采用的6个LED显示器,从高位至低位分别显示时、分、秒。 2、有一个设置调闹钟定时时间、正常时间的按钮,选择调的对象。 3、有三个按钮分别调时、分、秒的时间。 4、有一个按钮用作开启/关闭闹铃。 5、另外需要两个时钟信号来给系统提供脉冲信号,使时钟和闹钟正常工作,分别为1Hz、 1kHz的脉冲。 二、系统组成以及系统各部分的设计 1、系统结构描述//要求:系统(或顶层文件)结构描述,各个模块(或子程序)的功能描述;(一)系统的顶层文件: 1、顶层文件图:(见下页) 2、各模块的解释: (1)、7个输入量clk_1khz、clk_1hz、key_slt、key_alarm、sec_set、min_set、hour_set:其中clk_1khz为闹铃模块提供时钟,处理后能产生“嘟”、“嘀”和变化的闹铃声音;clk_1hz为计时模块提供时钟信号,每秒计数一次;key_slt选择设置对象:定时或正常时间;key_alarm能够开启和关闭闹铃;sec_set、min_set、hour_set用于设置时间或定时,与key_slt相关联。各按键输出为脉冲信号。 (2)、CNT60_A_SEC模块: 这个模块式将clk_1hz这个时钟信号进行60进制计数,并产生一个分钟的触发信号。该模块能将当前计数值实时按BCD码的格式输出。将该输出接到两位LED数码后能时时显示秒的状态。通过alarm_clk可以选择设置对象为时间还是定时值。在设置时间模式上,key上的一个输入脉冲可以将clk的输入信号加一。在设置定时模式上,key 上的脉冲只修改定时值,不影响时间脉冲clk的状态。 同时该模块具有两个输出口out_do、out_di来触发整点报时的“嘟”、“嘀”声音。 (3)、CNT60_A_MIN模块: 这个模块式将CNT60_A_SEC的输出信号进行60进制计数,并产生一个时位的触发信号。该模块能将当前计数值实时按BCD码的格式输出。将该输出接到两位LED数码后能时时显示分的状态。通过alarm_clk可以选择设置对象为时间还是定时值。在设置时间模式上,key上的一个输入脉冲可以将clk的输入信号加一。在设置定时模式上,key上的脉冲只修改定时值,不影响时间脉冲clk的状态。 同时该模块具有三个输出口out_do、out_di、out_alarm来触发整点报时的“嘟”、“嘀”、闹铃声音。

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进制。 终上所述,考虑到试验时的简单性,故我选择了方案二。 三、细化框图 根据自顶向下的方法以及各功能模块的的功能实现上述设计方案应系统细化框图:

vhdl数字电子钟的设计与实现

基于VHDL数字电子钟的设计与实现 摘要:本课程设计完成了数字电子钟的设计,数字电子钟是一种用数字显示秒、分、时的计时装置,由于数字集成电路技术的发展和采用了先进的石英技术,它使数字钟具有走时准确、性能稳定、携带方便等优点。数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活带来极大的方便。在这里我们将已学过的比较零散的数字电路的知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路的能力。 关键词:电子钟;门电路及单次按键;琴键开关

目录 第一章引言----------------------------------------------------------------1 1.1 课题的背景、目的------------------------------------------1 1.2 课程设计的内容------------------------------------------1 第二章EDA与VHDL简介--------------------------------------------------2 2.1 EDA的介绍---------------------------------------------2 2.2 VHDL的介绍--------------------------------------------3 2.2.1 VHDL的用途与优点-----------------------------------------------------------------3 2.2.2 VHDL的主要特点---------------------------------------------------------------------- 2.2.3 用VHDL语言开发的流程------------------------------------------------------------ 第三章数字电子钟的设计方案------------------------------------------6 3.1秒脉冲发生器--------------------------------------------7 3.2可调时钟模块--------------------------------------------8 3.3校正电路------------------------------------------------8 3.4闹铃功能------------------------------------------------10 3.5日历系统------------------------------------------------11 第四章结束语---------------------------------------------------------------13 4.1致谢----------------------------------------------------14 4.2参考文献------------------------------------------------15

数字时钟设计VHDL

实验十七数字时钟 实验目的 设计一个可以计时的数字时钟,其显示时间范围是00:00:00~23:59:59,且该时钟具有暂停计时、清零等功能。 实验器材 1、SOPC实验箱 2、计算机(装有Quartus II 7.0软件) 实验预习 1、了解时钟设计原理和各主要模块的设计方法。 2、提前预习,编写好主模块的VHDL程序。 实验原理 数字时钟框图如图17.1所示,一个完整的时钟应由4部分组成:秒脉冲发生电路、计数部分、译码显示部分和时钟调整部分。 1、秒脉冲发生:一个时钟的准确与否主要取决秒脉冲的精确度。可以设计分频电路对系统时钟50MHz进行50000000分频从而得到稳定的1Hz基准信号。定义一个50000000进制的计数器,将系统时钟作为时钟输入引脚clk,进位输出即为分频后的1Hz信号。 2、计数部分:应设计1个60进制秒计数器、1个60进制分计数器、1个24进制时计数器用于计时。秒计数器应定义clk(时钟输入)、rst(复位)两个输入引脚,Q3~Q0(秒位)、Q7~Q4(十秒位)、Co(进位位)9个输出引脚。分、时计数器类似。如需要设置时间可再增加置数控制引脚Set和置数输入引脚d0~d7。 3、译码显示部分:此模块应定义控制时钟输入、时分秒计数数据输入共25个输入引脚;8位显示码输出(XQ7~XQ0)、6位数码管选通信号(DIG0~DIG5)共14个输出引脚。在时钟信号的控制下轮流选择对十时、时、十分、分、十秒、秒输入信号进行译码输出至XQ7~XQ0,并通过DIG0~DIG5输出相应的选通信号选择数码管。每位显示时间控制在1ms 左右。时钟信号可由分频电路引出。 4、各模块连接方式如图17.1所示。 图17.1 数字时钟框图

基于VHDL语言实现数字电子钟的设计

基于VHDL语言实现数字电子钟的设计 一.设计要求: 1、设计内容 选用合适的可编程逻辑器件及外围电子元器件,设计一个数字电子钟,利用EDA软件(QUARTUS Ⅱ)进行编译及仿真,设计输入可采用VHDL硬件描述语言输入法)和原理图输入法,并下载到EDA实验开发系统,连接外围电路,完成实际测试。 2、设计要求 (1)具有时、分、秒计数显示功能。 (2)具有清零的功能,且能够对计时系统的小时、分钟进行调整。 (3)小时为十二小时制。 二.实验目的: 1.通过这次EDA设计中,提高手动能力。 2.深入了解时事时钟的工作原理,以及时事时钟外围硬件设备的组成。 3.掌握多位计数器相连的设计方法。 4.掌握十进制,六进制,二十四进制计数器的设计方法。 5.继续巩固多位共阴极扫描显示数码管的驱动,及编码。 6.掌握扬声器的驱动。 7.LED灯的花样显示。 8.掌握CPLD技术的层次化设计方法 三.实验方案: 数字系统的设计采用自顶向下、由粗到细, 逐步分解的设计方法, 最顶层电路是指系统的整体要求, 最下层是具体的逻辑电路的实现。自顶向下的设计方法将一个复杂的系统逐渐分解成若干功能模块, 从而进行设计描述, 并且应用EDA 软件平台自动完成各功能模块的逻辑综合与优化, 门级电路的布局, 再下载到硬件中实现设计。因此对于数字钟来说首先是时分秒的计数功能,然后能显示,附带功能是清零、调整时分。通过参考EDA 课程设计指导书,现有以下方案: 1.作为顶层文件有输入端口:时钟信号,清零按键,调时按键,调分按键;输出端口有:用于接数码管的八段码

输出口,扫描用于显示的六个数码管的输出口。 2.底层文件分为: (1)时间计数模块。分秒计数模块计数为60计数,时计数模块为12计数。 (2)显示模块。显示模块由一个六进制计数器模块和一个七段译码器组成。进制计数器为六选一选择器的选择判断端提供输入信号, 六选一选择器的选择输出端分别接秒个位、秒十位、分个位、分十位和时个位、时十位的选通位用来完成动态扫描显示,同时依次输出秒个位、秒十位、分个位、分十位和时个位、时十位数向给译码模块。 (3)报警模块当时间到整点时就报时。输入有时分秒计数,时钟脉冲。 (4)采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以不用此种作为显示.采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,但无法显示图形文字,在显示星期是也只能用数字表示,而且采用动态扫描法与单片机连接时,在编程时比较复杂。所以也不采用了LED数码管作为显示。采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示文字,图形,显示多样,清晰可见,所以在此设计中采用LCD液晶显示屏。 四.实验原理: 1. 实验主控系统原理图: 模块设计原理图:

VHDL电子钟实验报告

期末大作业课程设计实验报告设计题目:基于VHDL电子钟的设计

目录 一、概述 (3) 1.1目的 (3) 1.2课程设计的要求和功能 (3) 二、总结 (3) 2.1课程设计进行过程及步骤 (3) 2.2所遇到的问题,如何解决问题 (15) 2.3体会收获以及建议 (15) 3.4参考资料(书,网络资料) (15) 三、教师评语 (16) 四、成绩 (16)

一、概述 1.1目的 1. 基于CPLD系统模块板,设计一个电子钟。来熟悉CPLD的工作原理以及 对VHDL的使用。 2. 通过设计出一个电子钟具有校时功能,来巩固分频,键盘扫描,计数,动 态扫描等知识内容。 1.2课程设计的要求和功能 设计一个电子钟,能进行正常的时分秒计时功能,分别有六个数码管显示24小时,60分钟,60秒的计数器显示。 利用实验箱系统上的按键实现“校时”、“校分”功能: (1)按下“SA”键时,计时器快速递增,按24小时循环,进行时校正; (2)按下“SB”键时,计分器快速递增,按60分循环,进行分校正 (3)按下“SC”键时,秒清零,进行秒校正; 二、总结 2.1课程设计进行及步骤 1.设计提示 系统框图见下

2.系统结构设计描述(1)系统顶层文件 1.顶层原理图见下

2.各个模块的解释 (1)五个输入量clk50MHz,SA,SB,SC,reset: 其中clk50MHz为总体系统提供时钟,并且经过分频来分别对电子 钟模块提供时钟,产生一秒一秒的进位信号,对显示模块的计数器 提供时钟实现显示模块的扫描功能,对按键去抖动提供时钟,实现 键盘扫描的功能。SA,SB,SC用来控制按键,实现按键控制,SA是 实现“时”加一,SB是实现“分”加一,SC是实现“秒”清零。 Reset是来控制按键功能的使能。 (2)按键功能模块 三个输入chos ,date0,date1的功能是:chos接受来自按键的信号, 若按键按下,则将date0的内容,也就是通过按键产生的脉冲来控 制电子钟进行加一,若按键没有按下,则将“秒”分频信号接入电 子钟的clk计数输入端,通过时钟脉冲来控制电子钟。 (3)电子钟计数模块 有5个输入ci,nreset,load,clk,d[7..0],作用分别是ci是使能端,直 接接高电位,nreset是复位,load和d[7..0]是用来置数的,clk提供 计数时钟,也就是一秒一个脉冲。 输出端有三个,co是进位功能,只有“秒”和“分”模块有效, qh[3..0],ql[3..0]是分位的数字输出端,一个是十位,一个是个位。

VHDL数字钟设计报告

VHDL数字钟设计报告 一. 数字钟总体设计方案: 1.1设计目的 ①正确显示时、分、秒; ②可手动校时,能分别进行时、分的校正; ③整点报时功能; 1.2设计思路 数字钟的设计模块包括:分频器、去抖动电路、校时电路、“时、分、秒”计数器、校时闪烁电路、 整点报时和译码显示电路。 每一个功能模块作为一个实体单独进行设计,最后再用VHDL的例化语句将各个模块进行整合,生成 顶层实体top。 该数字钟可以实现3个功能:计时功能、设置时间功能和报时功能。 二.数字钟模块细节 2.1 分频器(fenpin) 本系统共需3种频率时钟信号(1024Hz、512Hz、1Hz)。为减少输入引脚,本系统采用分频模块,只需由外部提供1024Hz基准时钟信号,其余三种频率时钟信号由分频模块得到。 分频原理:为以1024Hz基准时钟经1024分频得到512Hz,1Hz频率时钟信号。 分频器管脚 代码:

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity fenpin is port(clk1024:in std_logic; clk1,clk512:out std_logic ); end fenpin ; architecture cml of fenpin is begin process (clk1024) variable count1: integer range 0 to 512; variable q1: std_logic; begin if clk1024' event and clk1024='1' then if count1=512 then q1:=not q1; count1:=0; else count1:=count1+1; end if; end if; clk1<=q1; end process; process(clk1024) variable count512: integer range 0 to 1; variable q512: std_logic; begin if clk1024' event and clk1024='1' then if count512=1 then q512:=not q512; count512:=0; else count512:=count512+1; end if; end if; clk512<=q512; end process; end cml; 2.2 校时电路(jiaoshi)

基于VHDL语言的简易电子钟课程设计

设计题目:简易数字电子钟 专业班级: 电子信息工程二班 学号:201323040344 201362040040 姓名:王雪巩军霞 指导教师:张玉茹赵明

引言

目录 第一章数字电子钟计内容及要求·······································1.1设计内容····························································1.2功能说明····························································第二章数字电子钟系统框图及工作原理································· 2.1 系统框图··················································· 2.2 电子钟总体工作原理与设计·····································第三章各功能模块的设计 3.1正常计时模块 3.2分频模块产生电路 3.3分时模块产生电路 3.4秒模块产生电路 3.5分模块产生电路 3.6时模块产生电路 3.7扫描模块产生电路 第四章系统调试与分析··············································4.1 系统调试····················································· 4.1.1 调试方法·················································4.1.2 调试故障及解决方法········································4.2 结果分析······················································第五章课程设计感想·············································

基于VHDL数字时钟的设计与实现

1 引言 随着科学技术的不断发展,人们对时间计量的精度要求越来越高。相对机械钟而言,数字钟能实现准确计时,并显示时,分,秒,而且可以方便,准确的对时间进行调节。在此基础上,还可以实现整点报时的功能。因此,数字钟的应用十分广泛。所谓数字时钟,是指利用电子电路构成的计时器。 1.1课题的背景、目的 电子技术是一门应用很广,发展极为迅速的科学技术,尤其由于数字电子技术具有高抗干扰能力、更高的可靠性和便于计算机处理等特点,近年来得到更加迅速的发展,数字通讯设备、数字电视、数字照相机、数字摄象机等数字化产品近年如雨后春笋般大量涌现,数字电子技术已经成为今后电子技术发展的主要方向。现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。 通过数字时钟的设计,巩固计算机组成原理课程,理论联系实际,提高分析、解决计算机技术的实际问题的独立工作能力;掌握用VHDL语言编制简单的小型模块,学会数字钟的设计方法,熟悉集成电路的使用方法,初步掌握电子钟的设计方法并实现时间的显示和校对,以及报时的功能,并能对数字电子钟进行扩展。数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。 1.2 课程设计的内容 本课程设计实现一个数字时钟,具有按秒走时功能,能够分别显示小时(2位24小时)、分钟(2位)、秒(2位)。具有整点报时、时间调整功能,且能够对计时系统的小时、分钟进行调整。也可设计成十二小时计时方案(AM,PM)。具有美观、清晰、人性化的显示界面设计,走时精度不劣于±3秒/月。本课程设计采用VHDL语言,以MAXPLUSII 开发工具。根据系统设计的要求,系统设计采用自顶向下的设计方法,可以将该系统中的

VHDL多功能数字钟

基于VHDL语言 数 字 钟 设 计 学院:信息工程学院 专业: 姓名: 学号: 2010年6月15日

一、设计要求 1、具有以二十四小时制计时、显示、整点报时、时间设置和闹钟的功能。 2、设计精度要求为1秒。 二、设计目的 1.掌握各类计数器以及计数器的级联方式; 2.掌握数码管动态显示的原理与方法; 3.掌握用FPGA技术的层次化设计方法; 4.理解数字逻辑硬件和软件的设计思想; 三、设计环境:Quartus II CPLD-5型试验箱 四、系统功能描述 1、系统输入:系统状态及较时、定时转换的控制信号为enset、k、set; 时钟信号clk采用50MHz;校时复位信号为reset,输入信号均由按键信号产生。 2、系统输出:LED显示输出;蜂鸣器声音信号输出。 3、多功能数字电子钟系统功能的具体描述如下: (一)计时:正常工作状态下,每日按24h计时制计时并显示,蜂鸣器无声,逢整点报时。 (二)校时:在计时显示状态下,按下“enset”键,接着按下“k”键,进入“小时”待校准状态,若此时按下“set”键,小时开始校准;之后按上“k”键则进入“分”待校准状态;继续按下“k”键则进入“秒”待复零状态;再次按上“k”键数码管显示闹钟时间,并进入闹钟“小时”待校准状态;再次按下“k”键则进入闹钟“分”待校准状态;若再按上“k”键恢复到正常计时显示状态。若校时过程中按下“reset”键,则系统恢复到正常计数状态。 (1)“小时”校准状态:在“小时”校准状态下,显示“小时”的数码管以2Hz 闪烁,并以2Hz的频率递增计数。 (2)“分”校准状态:在“分”校准状态下,显示“分”的数码管以2Hz闪烁,并以2Hz的频率递增计数。 (3)“秒”校准状态:在“秒复零”状态下,显示“秒”的数码管以2Hz闪烁,并以1Hz的频率递增计数。 (4)闹钟“小时”校准状态:在闹钟“小时”校准状态下,显示“小时”的数码管以2Hz闪烁,并以2Hz的频率递增计数。 (5)闹钟“分”校准状态:在闹钟“分”校准状态下,显示“分”的数码管以2Hz闪烁,并以2Hz的频率递增计数。 (三)整点报时:蜂鸣器在“59”分钟的第“51”、“53”、“55”、“57”秒发频率为500Hz的低音,在“59”分钟的第“59”秒发频率为1000Hz的高音,结束时为整点。 (四)显示:要求采用扫描显示方式驱动6个LED数码管显示小时、分、秒。(五)闹钟:闹钟定时时间到,蜂鸣器发出频率为1000Hz的高音,持续时间为60秒。

基于VHDL语言的数字时钟设计

课程:CPLD与FPGA设计及应用 实验:基于VHDL语言的数字时钟设计 学号:092030030 姓名:朱峰 专业:信号与信息处理 学院:电子与信息学院 2011年12月

基于VHDL语言的数字时钟设计一:主要功能 1:具有时、分、秒计数显示功能,以24小时循环计时。 2:具有日期和星期显示功能。 3:具有秒表功能 4:具有调节日期,星期,小时,分钟,清零的功能。 5:具有定时和闹铃的功能。 二:结构框图 三:RTL图

四:功能实现 4.1分频模块设计 本设计使用的输入时钟信号为50Mhz,经过分频产生两路时钟信号,其中一路为微秒计数时钟信号,一路为动态扫描时钟信号。同时模块有一输入控制信号,其功能是停止微秒计数时钟信号,以实现定时的功能。 输入:clk_in 为50Mhz,setstop为微秒计数时能信号 输出:clk_out1为1/60hz clk_out2为1khz 源代码如下: library ieee; use ieee.std_logic_1164.all; entity div is port(clk_in,setstop: in std_logic; clk_out1,clk_out2: out std_logic); end entity div; architecture fun of div is constant a:integer:=8333333; constant b:integer:=49999; signal c:integer range 0 to a; signal d:integer range 0 to b; begin process(clk_in,setstop) begin if(clk_in 'event and clk_in='1') then if(( c+7500000)

多功能数字电子钟_VHDL

《VHDL课程设计》实验报告 多功能数字电子钟 姓名: 班级: 学号: 指导老师: 成绩: 完成时间:2008年1月4日星期五 完成地点:502机房 一、实验目的 1.学习数字系统设计的自顶向下设计法及控制器的设计。 2.加深利用EDA技术实现数字系统的体会。 二、实验仪器及器件 1.EDA 开发软件(1套) 2.微机(1台) 3.实验开发系统(1台) 4.其他器件和材料(若干) 三、实验要求及设计方案 1.设计一个具有24进制计时、显示、整点报时、时间设置和闹钟功能的数字钟,要求时钟的最小分辨率时间为1s。 2.数字钟的设计方案如下: 系统输入:mode为计时显示和闹钟定时显示转换输入;set为校时和定时设置的时、分、秒转换输入;k为校时和定时设置的时、分、秒手动加1输入;clk为时钟信号;reset为系统复位信号。输入信号均由按键产生。 系统输出:LED显示输出;蜂鸣器(bell)声音信号输出。 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的高音,结束时为整点。 显示:采用8个LED数码管分别显示时、分、秒并且他们之间用“—”隔开。 闹钟:闹钟定时时间到,蜂鸣器发出周期为1s的滴、滴声,持续时间为10秒;闹钟定时显示。 闹钟定时设置:在闹钟显示状态下,按下“set键”,进入“小时”校时状态,再次按下“set键”,进入“分”校时状态,继续按下“set键”,进入“秒”校时状态,第四次按下“set键”又回复到闹钟显示状态。 闹钟的时、分、秒设置过程和计时设置相同。 计时显示和闹钟显示之间的转换:按动“mode”键,数字钟将在计时显示和闹钟定时显示之间转换。 4)多功能数字钟系统结构逻辑框图如下:

VHDL编写的数字钟

FPGA课程设计实验报告 题目:VHDL编写的数字钟设计 学院:电子信息学院 专业:电子与通讯工程 姓名:朱振军

基于FPGA的VHDL数字钟设计 一、功能介绍 1.在七段数码管上具有时--分--秒的依次显示。 2.时、分、秒的个位记满十向高位进一,分、秒的十位记满五向高位进一,小时按24进制计数,分、秒按60进制计数。 3.整点报时,当计数到整点时扬声器发出响声。 4.时间设置:可以通过按键手动调节秒和分的数值。此功能中可通过按键实现整体清零和暂停的功能。 5.LED灯循环显示:在时钟正常计数下,LED灯被依次循环点亮。 待增加功能: 1.实现手动调节闹铃时间,在制定时间使扬声器发声。 2.实现微妙的快速计数功能,可实现暂停、保存当前时间、继续计数的功能。 二、设计方案 本文数字钟的设计采用了自顶向下分模块的设计。底层是实现各功能的模块,各模块由vhdl语言编程实现:顶层采用原理图形式调用。其中底层模块包括秒、分、时三个计数器模块、按键去抖动模块、按键控制模块、时钟分频模块、数码管显示模块共7个模块。 设计框图如下: 图一数字钟系统设计框图 由图1可以清晰的看到数字钟系统设计中各功能模块间连接关系。系统时钟50MHZ经过分频后产生1秒的时钟信号,1秒的时钟信号作为秒计数模块的输入信号,秒计数模块产生的进位信号作为分计数模块的输入信号,分计数模块的进位信号作为时计数模块的输入信号。秒计数模块、分计数模块、时计数模块的计数输出分别送到显示模块。由于设计中要使用按键进行调节时间,而按键的动作过程中存在产生得脉冲的不稳定问题,所以就牵扯到按键去抖动的问题,对此系统中设置了按键去抖动模块,按键去抖动模块产生稳定的脉冲信号

vhdl课程设计电子钟+闹铃

v h d l课程设计电子钟+闹 铃 This manuscript was revised by the office on December 10, 2020.

数字钟的设计 一、系统功能概述 (一)、系统实现的功能: 1、具有“时”、“分”、“秒”的十进制数字显示(小时从00 ~ 23)。 2、具有手动校时、校分、校秒的功能。 3、有定时和闹钟功能,能够在设定的时间发出闹铃声。 4、能进行整点报时。从59分50秒起,每隔2秒发一次低音“嘟”的信号,连续5 次,最后一次为高音“嘀”的信号。 (二)、各项设计指标: 1、显示部分采用的6个LED显示器,从高位至低位分别显示时、分、秒。 2、有一个设置调闹钟定时时间、正常时间的按钮,选择调的对象。 3、有三个按钮分别调时、分、秒的时间。 4、有一个按钮用作开启/关闭闹铃。 5、另外需要两个时钟信号来给系统提供脉冲信号,使时钟和闹钟正常工作,分别为 1Hz、1kHz的脉冲。 二、系统组成以及系统各部分的设计 主要是在“调整时间”和“调整定时”的上面遇到非常大的困难。与开始想象的不一样,一个进程中不能加入时钟信号,没能够将按键脉冲直接与时钟脉冲进行累加。同时,在对VHDL的语法的熟悉上也花费了大量的时间。

最后的解决方法是,通过另一个进程,先将这两个信号进行处理后,分别产生aclk 和tclk分别为定时调整部分、和时间调整部分提供时钟信号。调整按键的脉冲信号和正常的时钟信号不是按照简单的或运算来处理的。 1)、如果要调整时间: 1、当时钟信号是高电平,按键信号也是高电平时,则给tclk赋值0。 2、当时钟信号是高电平,按键信号是低电平时,则给tclk赋值1。 3、当时钟信号是低电平,按键信号是高电平时,则给tclk赋值1。 4、当时钟信号是低电平,按键信号是低电平是,则给tclk赋值0。 这样无论按键脉冲是在高电平还是低电平,或者是在高低电平两种状态下出现,其最终结果都是会多产生一个脉冲信号,导致计数值变化,达到修改时间的目的。期间,aclk始终不变。 2)、如果要调整定时: 1、时钟输入信号赋值给tclk 2、按键输入信号赋值给aclk 这样,当按键脉冲结束时,定时调整信号会出现一个脉冲。而时钟信号不受影响。 另外,在闹铃产生上也遇到了一些小问题,最后,通过在产生周期较长的信号,切换输出值的内容“嘟”还有“嘀”,最后的效果就是“嘟”、“嘀”声音交替发出。 在仿真时,大多数模块会出现毛刺,会导致最后的总仿真结果不是很乐观,会把脉冲的几个干扰加上去。这方面,我试图调了很久也没解决。不过由于在实际下载后还是相对比较正常的,仿真中的毛刺最后没有消除掉。

相关文档