王超飞利用VHDL语言设计的数字钟

字钟

设计目的

掌握各类计数器和分频器以及它们相连的设计方法;

掌握多个数码管的原理与方法;

掌握CPLD技术的层次化设计的方法;

掌握使用VHDL语言的设计思想;

对整个系统的设计有一个了解。

设计系统环境

1)一台PC机;

2)一套GW48EDA实验开发系统硬件;

3QUARTUS Ⅱ集成化的开发系统硬件。

设计要求

(1) 能进行正常的时、分、秒计时功能,分别由6个数码管显示24h60min60s

(2) 按下sa键时,计时器迅速递增,并按24h循环,计时满23h后回00

(3) 按下sb键时,计时器迅速递增,并按60min循环,计时满59min后回00

4)每个整点都准时报时。

5)输入的时钟信号为3MHz

方案论证

该数字钟可以实现3个功能:计时功能、整点报时功能和重置时间功能,因此有3个子模块:计时、报时(alert)、设置时间(SaSb)。其中计时模块有3部分构成:秒计时器(s1)、分计时器(min1)时计时器(h1)

秒计时器是由一个60进制的计数器构成的, clk为驱动秒计时器的时钟信号s0s1为秒计时器的输出,co为秒计时器的进位信号,作为下一级的时钟输入信号。

分计时器是由一个60进制的计数器构成的, clk仍然为驱动分计时器工作的时钟信号,与co相连接;min0min1为分计时器的输出;co为分计时器的进位信号,作为下一级的使能信号。

时计时器是由一个24进制的计数器构成的, clk依旧为驱动时计时器工作的时钟信号,与en相连接;h为时计时器的输出.

报时模块(alert)的功能是当整点mins作为该模块的输入信号:当(s0[0…3]=0000,s1[0…1]=0000,min0[0…1]=1000,min1[0…1]=0101)时,alarm输出高电平,并且clk1的频率为闹铃持续8;当(s0[0…3]=0000,s1[0…1]=0000,min0[0…3]=0000,min1[0…3]=0000时,alert输出高电平,并且clk2的频率为闹铃持续1

设计思想

六、模块及模块功能

(1) 模块CNT60_2 该模块为60进制计数器,计时输出为秒的数值,在计时到59时送出进位信号CO,因为硬件有延时,所以模块CNT60_2在此模块变为00时加1,符合实际。

A、模块

B、程序

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity cnt60_2 is

port(clk:in std_logic;

s1,s0:out std_logic_vector(3 downto 0);

co:out std_logic);

end cnt60_2;

architecture behav of cnt60_2 is

begin

process(clk)

variable cnt1,cnt0:std_logic_vector(3 downto 0);

begin

if clk'event and clk='1' then

if cnt1="0101" and cnt0="1000" then

co<='1';

cnt0:="1001";

elsif cnt0<"1001" then

cnt0:=cnt0+1;

else cnt0:="0000";

if cnt1<"0101" then

cnt1:=cnt1+1;

else cnt1:="0000";

co<='0';

end if;

end if;

end if;

s1<=cnt1;

s0<=cnt0;

end process;

end behav;

C、流程图

D、波形仿真

2)模块CNT60_1 该模块为60进制计数器,计时输出为分的数值,在EN信号有效且时钟到来时,计数器加1。在sb按下时,EN信号有效,计数值以秒的速度增加,从而实现对分钟的设置。

A、 模块

B、程序

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity cnt60_1 is

port(en,clk:in std_logic;

min1,min0:out std_logic_vector(3 downto 0);

co:out std_logic);

end cnt60_1;

architecture behav of cnt60_1 is

begin

process(clk)

variable cnt1,cnt0:std_logic_vector(3 downto 0);

begin

if clk'event and clk='1' then

if en='1' then

if cnt1="0101" and cnt0="1000" then

co<='1';

cnt0:="1001";

elsif cnt0<"1001" then

cnt0:=cnt0+1;

else cnt0:="0000";

if cnt1<"0101" then

cnt1:=cnt1+1;

else cnt1:="0000";

co<='0';

end if;

end if;

end if;

end if;

min1<=cnt1;

min0<=cnt0;

end process;

end behav;

C、流程图

D、波形仿真

(2) 模块CNT24 该模块为24进制计数器,计时输出为小时的数值,在EN信号有效且时钟到来时,计数器加1。在sa按下时,EN信号有效,计数值以秒的速度增加,从而实现对时钟的设置。

A、模块

B、程序

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity cnt24 is

port(en,clk:in std_logic;

h1,h0:out std_logic_vector(3 downto 0));

end cnt24;

architecture behav of cnt24 is

begin

process(clk)

variable cnt1,cnt0:std_logic_vector(3 downto 0);

begin

if clk'event and clk='1' then

if en='1' then

if cnt1="0010" and cnt0="0011" then

cnt0:="0000";

cnt1:="0000";

elsif cnt0<"1001" then

cnt0:=cnt0+1;

else cnt0:="0000";

cnt1:=cnt1+1;

end if;

end if;

end if;

h1<=cnt1;

h0<=cnt0;

end process;

end behav;

C、流程图

D、波形仿真

(3) 模块ALERT报时模块当整点时就报时,mins作为该模块的输入信号

A、模块

B、程序

library ieee;

use ieee.std_logic_1164.all;

entity ALERT is

port(m1,m0,s1,s0:in std_logic_vector(3 downto 0);

clk1,clk2:in std_logic;

speaker:out std_logic);

end ALERT;

architecture sss_arc of ALERT is

begin

process(m1,m0,s1,s0)

begin

if s0="0000"and m1="0000" and m0="0000" and s1="0000"then speaker<=clk2;

elsif m1="0101" and m0="1001" and s1="0101" then

if s0="0010" or s0="0100" or s0="0110" or s0="1000" then

speaker<=clk1;

else speaker<='0';

end if;end if;

end process;

end sss_arc;

七、总体框图

D、波形仿真

八、调试使用说明

(1) 输入60进制计数器(秒)、60进制计数器(分)、24进制计数器、输入1Hz 频率,并编译、波形仿;然后生成器件。

(2) 画原理图:找到第一步生成的器件,并将它们调入原理图编辑窗中,然后完成数字钟的原理图设计。保存、调试。

(3) 分配管脚(模式7),下载到实验箱。

九、调试过程

1、秒计时器(s1s0

clk输入一个周期为1Hz的时钟信号;秒记时器就开始记数,s010进制)开始记时,当记到9时又返回0时,s15进制)记1。当s1记到5s0记到9时后将从新返回00开始下一轮的记数。

由上述波形可以清楚的看到:clk1hz的周期的信号秒记时器从00开始累加59秒时回到00,并且从co输出一个高电平给分记数器的en端。

 

2、分计时器(min1min0

clk输入一个周期为1Hz的时钟信号;当秒计数器的co给一个高电平时,min010进制)记1,当min0记到9时又返回0时,min15进制)记1。当min1记到5min0记到9时后将从新返回00开始下一轮的记数。

由上述波形可以清楚的看到:clk1hz的周期的信号分记时器从00开始累加59分后返回到00,并且从co输出一个高电平给时计数器enSb与秒模块给的co用一个或门与分模块的en相连,从而实现对分模块的调分。

 

3、时计时器

clk输入一个周期为1Hz的时钟信号;时记时器就开始记数,当分计数器的co给个高电平时,h010进制)记1,当记到9时又返回0时,h12进制)记1。当h1记到2h0记到3时后将从新返回00开始下一轮的记数。Sa与分模块给的co用一个或门与时模块的en相连,从而实现对时模块的调时。

由上述波形可以清楚的看到:clk1hz的周期的信号时记时器从00开始累加24后迅速返回到00

4、报时器

S02S15min09时,min15min09speakerclk1的频率闹铃。当S00S10min00时,min10时,speakerclk2的频率闹铃。

5、系统总调试

总体波形可以清楚的看到:秒计时器开始计时,当到达59秒后,秒计时器s又从0开始计时,秒模块的co同时给了个进为信号给分模块的en使分钟min加了1。分计时器开始计时,当到达59分后,分计时器min又从0开始计时,分模块co同时又给了个进位信号给时模块的en使小时h加了1当为24时,即时计时器h也又从0开始计时。当分计时器min59时,计时器s52ALERT输出一个高电平,持续直到5959秒,以clk1频率报时,当整点时以clk2频率报时

 

 

十、结论

能进行正常的时、分、秒计时功能,按下sb键(键8)时,计时器迅速递增,并按60min循环,计时满59min后回00。按下sa键(键5)时,计时器迅速递增,并按24h循环,计时满23h后回00。每到5952秒就开始以clk1的频率报时,当到整点时就以clk2的频率报时。

本次设计的遗憾是无法进行定时闹铃,只能整点闹铃。闹铃的声音也过于单调。

另外可能没有考虑到实际硬件会有一定的延时,从而造成走时上的一些误差。

十一、感想

通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示:在设定输入的时钟信号后,数字钟开始计数,但是始终看不到小时。后来,在数十次的调试之后,才发现是因为输入的时钟信号对于小时。经过屡次调试,终于找到了比较合适的输入数值:分钟的初始值可以设为00,小时的初始值可以设为00,这样,仿真之后,就能清楚的看出分钟、小时、的循环计数。另外,输入的时钟周期值要设置的短一点:1Hz

总的来说,这次设计的数字钟还是比较成功的,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。

十二、管脚分配(选择模式7

输入:clk ———— 84 输出:s00 ———— 27

sa ———— 16 s01 ———— 28

sb ———— 9 s02 ———— 29

s03 ———— 30

s10 ———— 35

s11 ———— 36

s12 ———— 37

s13 ———— 38

min00 ———— 39

min01 ———— 47

min02 ———— 48

min03 ———— 49

min10 ———— 50

min11 ———— 51

min12 ———— 52

min13 ———— 53

h00 ———— 54

h01 ———— 58

h02 ———— 59

h03 ———— 60

h10 ———— 61

h11 ———— 62

h12 ———— 64

h13 ———— 65

十、参考资料

PLD技术》讲义、《PLD技术》课程设计指导书。

《王超飞利用VHDL语言设计的数字钟.doc》
将本文的Word文档下载,方便收藏和打印
推荐:
下载文档
热门推荐
相关推荐