eda数字秒表设计程序vhdl(eda课程设计数字钟)

程序设计 566
本篇文章给大家谈谈eda数字秒表设计程序vhdl,以及eda课程设计数字钟对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 本文目录一览: 1、

本篇文章给大家谈谈eda数字秒表设计程序vhdl,以及eda课程设计数字钟对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

基于VHDL的数字时钟设计 用VHDL设计EDA数字钟 能显示年月日 时分秒 能校时和整点报时

template

class TreeNode{

public:

T data;

int index;

int active;

TreeNode operator=(TreeNode treenode)

{

this-data=treenode.data;

this-index=treenode.index;

this-active=treenode.active;

return *this;

}

};

秒表的VHDL语言设计程序!

用vhdl设计秒表全功略!

根据要求, 秒表的设计要有三个输入端:runstop,rst和clk. runstop是开关, 按一下开始计时, 再按一下停止计时, 显示时间. 可以使用一个T触发器来实现. 当我们把T触发器的T端接高电平时, 它将实现翻转功能. 然后用输入端口runstop 来控制, 当runstop 被按一下, 一个时钟到来, T触发器就进行一次翻转. 我们也可以用D触发器来代替T触发器, 需要用一个反馈信号, 将输出的信号反馈到D端口. Rst 是复位, 当按下rst 时, 秒表的显示变为0. Clk是时钟, 实验中的时钟信号是250KHZ,为了实现秒表的正确计时功能, 需要进行2500分频. 所以clk首先就应该接到一个分频器, 然后再为其他模块提供时钟. 接着我们把秒表划分为以下几个模块:分频器, 计数器, T触发器, 扫描器, 八选一选择器, 七段译码器, 另外还有一个模块要在分, 秒和毫秒之间做一个划分(BAR). 计数器的功能是要实现毫秒,秒,分的计数,比较麻烦.我们再将它分成几个模块, 可以是六进制的计数器和十进制的计数器进行级联来实现.也可以是用100进制的计数器和60进制的计数器进行级联. 我两种方法都尝试了一下.发现后一种方法编程要复杂的多, 级联的时候可以稍微简单一些. 因为D触发器,八选一选择器是程序包里有的,所以可以不编. 把这些模块都编好了以后要做的就是把他们连在一起. 有两种方法. 一是用画图的方法, 二是用编程的方法, 用port map语句. 同样, 这两种方法我也都尝试了. 我觉得用画图的方法要简单一些.

1程序如下:分频器: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity df is port(clkin:in std_logic; dout:out std_logic);

end; architecture behavioral of df is begin process(clkin) variable df: std_logic_vector(7 downto 0):="00000000"; begin if (clkin'event and clkin='1')then if df/="11111010" then df:=df+1; else df:="00000001"; end if; end if; dout=df(7); end process; end behavioral; 扫描器: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;

entity scan is port(clk:in std_logic; s:out std_logic_vector(2 downto 0)); end scan;

architecture behavioral of scan is variable scan:std_logic_vector(2 downto 0); begin process(clk) begin if(clk'event and clk='1')then scan:=scan+1; end if; s=scan; end process; end behavioral; 七段译码器: library ieee; use ieee.std_logic_1164.all;

entity bcd is port(o:in std_logic_vector(3 downto 0); q:out std_logic_vector(6 downto 0)); end bcd ;

architecture behavioral of bcd is begin process(o) begin case o is when"0000"=q="0111111"; when"0001"=q="0000110"; when"0010"=q="1011011"; when"0011"=q="1001111"; when"0100"=q="1100110"; when"0101"=q="1101101"; when"0110"=q="1111101"; when"0111"=q="0100111"; when"1000"=q="1111111"; when"1001"=q="1101111"; when others=q="0000000"; end case; end process; end behavioral; 当然,以上的100进制和60进制计数器的设计过于复杂,可以由六进制和十进制的计数器级联代替,程序如下:六进制: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity c6 is port(count:out std_logic_vector(3 downto 0); cout:out std_logic; cin,rst,clk:in std_logic); end c6; architecture behavioral of c6 is signal counter:std_logic_vector(2 downto 0); begin process(clk,rst) begin if rst='1'then counter="000";cout='0'; elsif clk'event and clk='1' then if cin='1' then if counter="101"then counter="000";cout='1'; else counter=counter+"001"; cout='0'; end if; end if; end if; end process; count(2 downto 0)=counter; count(3)='0'; end behavioral;

十进制: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;

entity c10 is port(count:out std_logic_vector(3 downto 0); cout:out std_logic; cin,rst,clk:in std_logic); end c10;

architecture behavioral of c10 is signal counter:std_logic_vector(3 downto 0); begin process(clk,rst) begin if rst='1'then counter="0000";cout='0'; elsif clk'event and clk='1' then if cin='1' then if counter="1001"then counter="0000";cout='1'; else counter=counter+"0001"; cout='0'; end if; end if; end if; end process; count=counter; end behavioral;

最后用画图讲这些模块连接起来.

VHDL电子时钟设计

基于CPLD的VHDL语言数字钟(含秒表)设计

利用一块芯片完成除时钟源、按键、扬声器和显示器(数码管)之外的所有数字电路功能。所有数字逻辑功能都在CPLD器件上用VHDL语言实现。这样设计具有体积小、设计周期短(设计过程中即可实现时序仿真)、调试方便、故障率低、修改升级容易等特点。

本设计采用自顶向下、混合输入方式(原理图输入—顶层文件连接和VHDL语言输入—各模块程序设计)实现数字钟的设计、下载和调试。

一、 功能说明

已完成功能

1. 完成秒/分/时的依次显示并正确计数;

2. 秒/分/时各段个位满10正确进位,秒/分能做到满60向前进位;

3. 定时闹钟:实现整点报时,又扬声器发出报时声音;

4. 时间设置,也就是手动调时功能:当认为时钟不准确时,可以分别对分/时钟进行调整;

5. 利用多余两位数码管完成秒表显示:A、精度达10ms;B、可以清零;C、完成暂停

可以随时记时、暂停后记录数据。

待改进功能:

1. 闹钟只是整点报时,不能手动设置报时时间,遗憾之一;

2. 秒表不能向秒进位,也就是最多只能记时100ms;

3. 秒表暂停记录数据后不能在原有基础上继续计时,而是复位重新开始。

【注意】秒表为后来添加功能,所以有很多功能不成熟!

二、 设计方案

1. 数字钟顶层设计

外部输入要求:输入信号有1kHz/1Hz时钟信号、低电平有效的秒/微秒清零信号CLR、低电平有效的调分信号SETmin、低电平有效的调时信号SEThour;

外部输出要求:整点报时信号SOUND(59分51/3/5/7秒时未500Hz低频声,59分59秒时为1kHz高频声)、时十位显示信号h1(a,b,c,d,e,f,g)、时个位显示信号h0(a ,b,c,d,e,f,g)、分十位显示信号m1及分个位m0、秒十位s1及秒个位s0、微秒十位ms1及微秒个位ms0;数码管显示位选信号SEL0/1/2等三个信号。

2. 内部功能模块主要有:

Fenp分频模块:主要是整点报时用的1kH与500Hz的脉冲信号,这里的输入信号是1KHz信号,所以只要一个二分频即可;时间基准采用1Hz输入信号直接提供(当然也可以分频取得,这里先用的是分频取得的信号,后考虑到精度问题而采用硬件频率信号。

实现带有100进制进位和清零功能,暂定等功能的微秒模块MINSECONDB输入为1Hz脉冲和低电平的清零信号CLR与暂定信号STOP,输出微秒个位、十位及进位信号CO(虽然没有实现进位功能,但还是编写了这个端口,只是在连线时悬空)。

实现60进制带有进位和清零功能的秒计数模块SECOND,输入为1Hz脉冲和低电平有效的清零信号CLR,输出秒个位、时位及进位信号CO。

实现60进制带有进位和置数功能的分计数模块MINUTE,输入为1Hz脉冲和高电平有效的使能信号EN,输出分个位、时位及进位信号CO。

实现24进制的时计数模块HOUR,输入为1Hz脉冲和高电平有效的使能信号EN,输出分个位、时位。

实现分时复用功能模块SELTIME,输入为秒(含个/十位)、分、时、扫描时钟CLK1K,输出为D和显示控制信号SEL。

实现整点报时功能模块ALERT,输入为分/秒信号,输出为高频声控Q1K和Q500。

实现译码显示功能模块DISPLAY,输入为D,输出为Q

三、 设计框图

四、 模块说明(含程序代码)

1. 分频模块

采用原理图输入方式实现2分频与1000分频,但这里并没有用到1000分频,因为后来考虑到精度问题,将千分频用直接输入了。程序如图:利用三个7490进行硬

件分频!

2. 微秒模块

采用VHDL语言输入方式,以时钟clk,清零信号clr以及暂停信号STOP为进程敏感变量,程序如下:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity MINSECONDb is

port(clk,clrm,stop:in std_logic;----时钟/清零信号

secm1,secm0:out std_logic_vector(3 downto 0);----秒高位/低位

co:out std_logic);-------输出/进位信号

end MINSECONDb;

architecture SEC of MINSECONDb is

signal clk1,DOUT2:std_logic;

begin

process(clk,clrm)

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

VARIABLE COUNT2 :INTEGER RANGE 0 TO 10 ;

begin

IF CLK'EVENT AND CLK='1'THEN

IF COUNT2=0 AND COUNT210 THEN

COUNT2:=COUNT2+1;

ELSE COUNT2:=0;

DOUT2= NOT DOUT2;

END IF;

END IF;

if clrm='1' then----当clr为1时,高低位均为0

cnt1:="0000";

cnt0:="0000";

elsif clk'event and clk='1' then

if stop='1' then

cnt0:=cnt0;

cnt1:=cnt1;

end if;

if cnt1="1001" and cnt0="1000" then----当记数为98(实际是经过59个记时脉冲)

co='1';----进位

cnt0:="1001";----低位为9

elsif cnt0"1001" then----小于9时

cnt0:=cnt0+1;----计数

--elsif cnt0="1001" then

--clk1=not clk1;

else

cnt0:="0000";

if cnt1"1001" then----高位小于9时

cnt1:=cnt1+1;

else

cnt1:="0000";

co='0';

end if;

end if;

end if;

secm1=cnt1;

secm0=cnt0;

end process;

end SEC;

3. 秒模块程序清单

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity SECOND is

port(clk,clr:in std_logic;----时钟/清零信号

sec1,sec0:out std_logic_vector(3 downto 0);----秒高位/低位

co:out std_logic);-------输出/进位信号

end SECOND;

architecture SEC of SECOND is

begin

process(clk,clr)

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

begin

if clr='1' then----当ckr为1时,高低位均为0

cnt1:="0000";

cnt0:="0000";

elsif clk'event and clk='1' then

if cnt1="0101" and cnt0="1000" then----当记数为58(实际是经过59个记时脉冲)

co='1';----进位

cnt0:="1001";----低位为9

elsif cnt0"1001" then----小于9时

cnt0:=cnt0+1;----计数

else

cnt0:="0000";

if cnt1"0101" then----高位小于5时

cnt1:=cnt1+1;

else

cnt1:="0000";

co='0';

end if;

end if;

end if;

sec1=cnt1;

sec0=cnt0;

end process;

end SEC;

4. 分模块程序清单

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity MINUTE is

port(clk,en:in std_logic;

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

co:out std_logic);

end MINUTE;

architecture MIN of MINUTE 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 MIN;

5. 时模块程序清单

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity HOUR is

port(clk,en:in std_logic;----输入时钟/高电平有效的使能信号

h1,h0:out std_logic_vector(3 downto 0));----时高位/低位

end HOUR;

architecture hour_arc of HOUR 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---同时“使能”为1

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

cnt1:="0000";----高位/低位同时为0时

cnt0:="0000";

elsif cnt0"1001" then----低位小于9时,低位记数累加

cnt0:=cnt0+1;

else

cnt0:="0000";

cnt1:=cnt1+1;-----高位记数累加

end if;

end if;

end if;

h1=cnt1;

h0=cnt0;

end process;

end hour_arc;

6. 动态扫描模块

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;

entity SELTIME is

port(

clk:in std_logic;------扫描时钟

secm1,secm0,sec1,sec0,min1,min0,h1,h0:in std_logic_vector(3 downto 0);-----分别为秒个位/时位;分个位/

daout:out std_logic_vector(3 downto 0);----------------输出

sel:out std_logic_vector(2 downto 0));-----位选信号

end SELTIME;

architecture fun of SELTIME is

signal count:std_logic_vector(2 downto 0);----计数信号

begin

sel=count;

process(clk)

begin

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

if(count="111") then

count="000";

else

count=count+1;

end if;

end if;

case count is

when"111"=daout= secm0;----秒个位

when"110"=daout= secm1;----秒十位

when"101"=daout= sec0;----分个位

when"100"=daout= sec1;----分十位

when"011"=daout=min0; ----时个位

when"010"=daout=min1;----时十位

when"001"=daout=h0;

when others =daout=h1;

end case;

end process;

end fun;

7. 报时模块

library ieee;

use ieee.std_logic_1164.all;

entity ALERT is

port(m1,m0,s1,s0:in std_logic_vector(3 downto 0);------输入秒、分高/低位信号

clk:in std_logic;------高频声控制

q500,qlk:out std_logic);----低频声控制

end ALERT;

architecture sss_arc of ALERT is

begin

process(clk)

begin

if clk'event and clk='1' then

if m1="0101" and m0="1001" and s1="0101" then----当秒高位为5,低位为9时且分高位为5

if s0="0001" or s0="0011" or s0="0101" or s0="0111" then---当分的低位为1或3或5或7时

q500='1';----低频输出为1

else

q500='0';----否则输出为0

end if;

end if;

if m1="0101" and m0="1001" and s1="0101" and s0="1001" then---当秒高位为5,低位为9时且分高位为5,----分低位为9时,也就是“59分59秒”的时候“报时”

qlk='1';-----高频输出为1

else

qlk='0';

end if;

end if;

end process;

end sss_arc;

8. 显示模块

library ieee;

use ieee.std_logic_1164.all;

entity DISPLAY is

port(d:in std_logic_vector(3 downto 0);----连接seltime扫描部分d信号

q:out std_logic_vector(6 downto 0));----输出段选信号(电平)

end DISPLAY;

architecture disp_are of DISPLAY is

begin

process(d)

begin

case d is

when"0000" =q="0111111";--显示0

when"0001" =q="0000110";--显示1

when"0010" =q="1011011";--显示2

when"0011" =q="1001111";--显示3

when"0100" =q="1100110";--显示4

when"0101" =q="1101101";--显示5

when"0110" =q="1111101";--显示6

when"0111" =q="0100111";--显示7

when"1000" =q="1111111";--显示8

when others =q="1101111";--显示9

end case;

end process;

end disp_are;

9. 顶层文件(原理图输入)

10.波形仿真(时序图)

五、 结论与建议

1.主要是从网上下载,借鉴后自己再根据已学的知识做检查和补充,发挥部分尚不完善。

2.微秒进位还需要改进秒模块结构以及一部分逻辑电路组成。

3.模块化设计有思路清晰、检查方便、扩展功能容易等诸多优势,且部分已经在本设计过程中得以体现。

4.如果能与单片机相结合,相信会有更好的效果,但有些时候CPLD功能比单片机强大得多。

5.总体来讲,要独立开发系统为时尚早,还需要不断学习相关EDA设计知识与技能。

六、 参考文献

1.徐向民 数字系统设计及VHDL实践 北京 机械出版社 2007.10

2.谢自美. 电子线路设计 实验 测试(第二版) 武汉 华中科技大学出版社 2002

文件名说明:

Clock.gdf为不含秒表模块的顶层文件;

Clock02.gdf为含秒表模块的顶层文件;

因已经硬件上实现功能,故这里没有仿真文件;

各模块文件名相同,但目录不同。

eda秒表程序

1.

“分分:秒秒”计数器设计

我们要实现“分分:秒秒”显示的电子秒表,需要设计计数频率为1Hz

计数器。因为“分分:秒秒”的结构对应有4个十进制数字(个位的秒,十位的

秒,个位的分,十位的分),如果采用统一计数再分别求出“分分:秒秒”

对应

的4个十进制数字进行译码显示,则求解对应的4个十进制数字的过程难于用硬

件实现。在此,我们将每个显示的值分别进行计数,即分别针对个位的秒、十位

的秒、个位的分、十位的分设计对应的计数器,其中个位的秒计数频率为1Hz,

其从0到9计数,当从9回到0时,向前进一位,使得十位的秒进行计数加1。

35

十位的秒从0到5计数,当从5回到0时,向前进一位,使得个位的分进行计数

加1。个位的分从0到9计数,当从9回到0

时,向前进一位,使得十位的分进

行计数加1。十位的分则从0

到5计数,计数到5时,又回到0。

2.

扫描显示技术

因为4位数码管的段控制输入是复用的,要分别显示不同的计数数值,需要

使用动态扫描显示技术,其电路结构如图61

所示。首先,以扫描显示的频率进

行2比特宽的模4计数,然后由其值从4个数码管的待显示值输入中选择对应的

一个经译码后连接到公共的段控制输入端,同时将计数值经2到4译码后输出到

对应数码管位的公共端,点亮对应的数码管。虽然各数码管位是轮流显示,每个

数码管位上的数字是断续的显示,只要扫描的频率够快,由于人眼的视觉残余效

应,就可以看到各数码管位上稳定的数字显示值。这和我们使用的电视、显示器

的显示原理是一样的。参考液晶显示器的刷新频率,经验证,在每秒钟扫描60

帧的时候,各数码管位上即能得到稳定的数字显示,此时,对应计数时钟的等效

频率为240Hz。我们可以参考实验四的图47,再做一个等效分频计数器,通过

产生的后级时钟使能信号将20MHz的时钟等效分频到240Hz。

61

扫描显示电路结构

3.

冒号点的处理

数码管中间的时间分隔冒号点(对应为左边第2个数码管位的DP点)每秒

钟闪烁一次,其频率为1Hz,只需要输出1Hz,占空比为50%的周期信号即可。

其他数码管位的点号不需要显示,对应的DP

点输出低电平无效信号即可。这4

个信号

所示的显示切换计数值进行4

选1

选择后接到数码管上公共的

DP控制端。

在实验四中,我们为了得到1Hz的主功能计数频率,前面利用precnt

进行了等效分频计数,其一个完整的计数周期即为1s,对应产生的使能信号en

频率即为1Hz,但我们在此不能直接使用en

的信号,因为其占空比只有

1/20000000,肉眼无法看到其闪烁的效果。为得到占空比为50%的1Hz信号,我

们可以通过对precnt

的计数值进行比较得出,只需要在precnt

计数周期内一半的

时间输出1,一半的时间输出0

即可,例如,当precnt25'd9999999

时输出0,

否则输出1,此时即可得到占空比为50%的1Hz信号。

4.

总体设计

总体设计只需要将时钟电路、复位电路、按键电路、数码管电路等组合起来,

综合使用时钟使能的同步设计技术、按键处理技术、扫描显示技术、“分分:秒

秒”计数器设计技术及冒号点的处理技术即可。

VHDL数字时钟完整程序代码(要求要有元件例化,并且有按键消抖),谢谢啦啦啦啦

图11

程序如下:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity xuan21 is

Port ( alarm,a,b: in std_logic;

y:out std_logic);

end xuan21 ;

architecture one of xuan21 is

begin

process(alarm,a,b)

begin

if alarm='0' then y=a;else y=b;

end if;

end process;

end one;

仿真波形如下图12:

图12

(2)三位二选一:

模块图如图13。用以进行正常计时时间与闹铃时间显示的选择,alarm输入为按键。当alarm按键未曾按下时二选一选择器会选择输出显示正常的计时结果,否则当alarm按键按下时选择器将选择输出显示闹铃时间显示。

图13

程序如下:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity x213 is

Port ( alarm : in std_logic;

y:out std_logic_vector(3 downto 0);

a,b: in std_logic_vector(3 downto 0));

end x213;

architecture one of x213 is

begin

process(alarm,a,b)

begin

if alarm='0' then y=a;else y=b;

end if;

end process;

end one;

仿真结果如下图14:

图14

8、整点报时及闹时:

模块图如图15。在59分51秒、53秒、55秒、57秒给扬声器赋以低音512Hz信号,在59分59秒给扬声器赋以高音1024Hz信号,音响持续1秒钟,在1024Hz音响结束时刻为整点。当系统时间与闹铃时间相同时给扬声器赋以高音1024Hz信号。闹时时间为一分钟。

图15

程序如下:

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity voice is

Port ( hou1,huo0,min1,min0,sec1,sec0,hh,hl,mh,ml: std_logic_vector(3 downto 0);

in_1000,in_500:in std_logic;

q : out std_logic);

end voice;

architecture one of voice is

begin

process(min1,min0,sec1,sec0)

begin

if min1="0101" and min0="1001" and sec1="0101" then

if sec0="0001" or sec0="0011" or sec0="0101" or sec0="0111"

then q=in_500;

elsif sec1="0101" and sec0="1001" then q=in_1000;

else q='0';

end if;

else q='0';

end if;

if min1=mh and min0=ml and hou1=hh and huo0=hl then

q=in_1000;

end if;

end process;

end one;

仿真波形如下图16

图16

9、顶层原理图:

三、感想

通过这次设计,既复习了以前所学的知识,也进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在画顶层原理图时,遇到了不少问题,最大的问题就是根本没有把各个模块的VHD文件以及生成的器件都全部放在顶层文件的文件夹内,还有就是程序设计的时候考虑的不够全面,没有联系着各个模式以及实验板的情况来编写程序,以至于多考虑编写了译码电路而浪费了很多时间。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示

:在分频模块中,设定输入的时钟信号后,却只有二分频的结果,其余三个分频始终没反应。后来,在数十次的调试之后,才发现是因为规定的信号量范围太大且信号的初始值随机,从而不能得到所要的结果。还有的仿真图根本就不出波形,怎么调节都不管用,后来才知道原来是路径不正确,路径中不可以有汉字。真是细节决定成败啊!总的来说,这次设计的数字钟还是比较成功的,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。

四、参考资料:

1、潘松,王国栋,VHDL实用教程〔M〕.成都:电子科技大学出版社,2000.(1)

2、崔建明主编,电工电子EDA仿真技术北京:高等教育出版社,2004

3、李衍编著,EDA技术入门与提高王行西安:西安电子科技大学出版社,2005

4、侯继红,李向东主编,EDA实用技术教程北京:中国电力出版社,2004

5、沈明山编著,EDA技术及可编程器件应用实训北京:科学出版社,2004

6、侯伯亨等,VHDL硬件描述语言与数字逻辑电路设计西安: 西安电子科技大学出版社,1997

7、辛春艳编著,VHDL硬件描述语言北京:国防工业出版社,2002 就这些

数字钟设计 用VHDL语言实现 你怎么做的

源代码如下  自己把各个模块打好包  下面有个图   自己看看

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY TZKZQ IS

PORT(KEY: IN STD_LOGIC_VECTOR(1 DOWNTO 0);   --按键信号

CLK_KEY: IN STD_LOGIC;       --键盘扫描信号

MAX_DAYS:IN STD_LOGIC_VECTOR(4 DOWNTO 0);  --本月最大天数

SEC_EN,MIN_EN,HOUR_EN,DAY_EN,MON_EN,YEAR_EN,WEEK_EN:OUT STD_LOGIC; --异步并行置位使能

HOUR_CUR:IN STD_LOGIC_VECTOR(4 DOWNTO 0);

MIN_CUR,SEC_CUR:IN STD_LOGIC_VECTOR(5 DOWNTO 0);

YEAR_CUR:IN STD_LOGIC_VECTOR(6 DOWNTO 0);

MON_CUR :IN STD_LOGIC_VECTOR(3 DOWNTO 0);

DAY_CUR :IN STD_LOGIC_VECTOR(4 DOWNTO 0);

WEEK_CUR:IN STD_LOGIC_VECTOR(2 DOWNTO 0);

SEC,MIN:BUFFER STD_LOGIC_VECTOR(5 DOWNTO 0);

HOUR:BUFFER STD_LOGIC_VECTOR(4 DOWNTO 0);

DAY :BUFFER STD_LOGIC_VECTOR(4 DOWNTO 0);

MON :BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0);

YEAR:BUFFER STD_LOGIC_VECTOR(6 DOWNTO 0);

WEEK:BUFFER STD_LOGIC_VECTOR(2 DOWNTO 0));

END ENTITY TZKZQ;

ARCHITECTURE ART OF TZKZQ IS

TYPE STATETYPE IS (NORMAL,SEC_SET,MIN_SET,HOUR_SET,DAY_SET,MON_SET,

YEAR_SET,WEEK_SET);

SIGNAL MODE:STATETYPE;

BEGIN

PROCESS(KEY,CLK_KEY)

BEGIN

IF CLK_KEY'EVENT AND CLK_KEY='1' THEN

IF KEY="01" THEN

SEC_EN='1';MIN_EN='1';HOUR_EN='1';

DAY_EN='1';MON_EN='1';YEAR_EN='1';

WEEK_EN='1';

CASE MODE IS

WHEN NORMAL =  MODE=SEC_SET;SEC=SEC_CUR;SEC_EN='0';

WHEN SEC_SET = MODE=MIN_SET;MIN=MIN_CUR;SEC_EN='1';MIN_EN='0';

WHEN MIN_SET = MODE=HOUR_SET;HOUR=HOUR_CUR;MIN_EN='1';HOUR_EN='0';

WHEN HOUR_SET= MODE=DAY_SET;DAY=DAY_CUR;HOUR_EN='1';DAY_EN='0';

WHEN DAY_SET = MODE=MON_SET;MON=MON_CUR;DAY_EN='1';MON_EN='0';

WHEN MON_SET = MODE=YEAR_SET;YEAR=YEAR_CUR; MON_EN='1';

YEAR_EN='0';

WHEN YEAR_SET = MODE=WEEK_SET;WEEK=WEEK_CUR;YEAR_EN='1';WEEK_EN='0';

WHEN WEEK_SET = MODE=NORMAL;

END CASE;

ELSIF KEY="10" THEN  --如果按下调整键,则自加

CASE MODE IS

WHEN SEC_SET = SEC_EN='0';

--异步并行置位使能有效

IF SEC="111011" THEN SEC="000000";

--如果秒计数到59,返回到0重新计数

ELSE SEC=SEC+1; --否则继续计数

END IF;

WHEN MIN_SET = MIN_EN='0';

IF MIN="111011" THEN MIN="000000";

ELSE MIN=MIN+1;

END IF;

WHEN HOUR_SET= HOUR_EN='0';

IF HOUR="11000" THEN                      HOUR="00000";

ELSE HOUR=HOUR+1;

END IF;

WHEN DAY_SET = DAY_EN='0';

IF DAY=MAX_DAYS THEN DAY="00001";

ELSE DAY=DAY+1;

END IF;

WHEN WEEK_SET= WEEK_EN='0';

IF WEEK="111" THEN WEEK="001";

ELSE WEEK=WEEK+1;

END IF;

WHEN OTHERS=NULL;

END CASE;

END IF;

END IF;

END PROCESS;

END ARCHITECTURE ART;

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CNT60 IS

PORT(LD: IN STD_LOGIC;

CLK: IN STD_LOGIC;

DATA: IN STD_LOGIC_VECTOR(5 DOWNTO 0);

NUM: BUFFER STD_LOGIC_VECTOR(5 DOWNTO 0);

CO: OUT STD_LOGIC);

END ENTITY CNT60;

ARCHITECTURE ART OF CNT60 IS

BEGIN

PROCESS(CLK,LD) IS

BEGIN

IF(LD='0') THEN

NUM=DATA;

ELSIF CLK'EVENT AND CLK='1' THEN

IF NUM="111011" THEN --59

NUM="000000";CO='1';

ELSE

NUM=NUM+1;CO='0';

END IF;

END IF;

END PROCESS;

END ARCHITECTURE ART;

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CNT60 IS

PORT(LD: IN STD_LOGIC;

CLK: IN STD_LOGIC;

DATA: IN STD_LOGIC_VECTOR(5 DOWNTO 0);

NUM: BUFFER STD_LOGIC_VECTOR(5 DOWNTO 0);

CO: OUT STD_LOGIC);

END ENTITY CNT60;

ARCHITECTURE ART OF CNT60 IS

BEGIN

PROCESS(CLK,LD) IS

BEGIN

IF(LD='0') THEN

NUM=DATA;

ELSIF CLK'EVENT AND CLK='1' THEN

IF NUM="111011" THEN --59

NUM="000000";CO='1';

ELSE

NUM=NUM+1;CO='0';

END IF;

END IF;

END PROCESS;

END ARCHITECTURE ART;

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CNT24 IS

PORT(LD: IN STD_LOGIC;

CLK: IN STD_LOGIC;

DATA: IN STD_LOGIC_VECTOR(4 DOWNTO 0);

NUM: BUFFER STD_LOGIC_VECTOR(4 DOWNTO 0);

CO: OUT STD_LOGIC);

END ENTITY CNT24;

ARCHITECTURE ART OF CNT24 IS

BEGIN

PROCESS(CLK,LD) IS

BEGIN

IF(LD='0') THEN

NUM=DATA;

ELSIF CLK'EVENT AND CLK='1' THEN

IF NUM="11000" THEN --24

NUM="00000";CO='1';

ELSE

NUM=NUM+1;CO='0';

END IF;

END IF;

END PROCESS;

END ARCHITECTURE ART;

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CNT30 IS

PORT(LD:IN STD_LOGIC;

CLK:IN STD_LOGIC;

NIAN:IN STD_LOGIC_VECTOR(6 DOWNTO 0);

YUE :IN STD_LOGIC_VECTOR(3 DOWNTO 0);

DATA:IN STD_LOGIC_VECTOR(4 DOWNTO 0);

NUM:BUFFER STD_LOGIC_VECTOR(4 DOWNTO 0);

MAX_DAYS:OUT STD_LOGIC_VECTOR(4 DOWNTO 0);

CO:OUT STD_LOGIC);

END ENTITY CNT30;

ARCHITECTURE ART OF CNT30 IS

SIGNAL TOTAL_DAYS:STD_LOGIC_VECTOR(4 DOWNTO 0);

BEGIN

PROCESS(CLK,LD) IS

VARIABLE IS_RUNNIAN:STD_LOGIC;

BEGIN

CASE NIAN IS

WHEN "0000000" = IS_RUNNIAN:='1';     --0

WHEN "0000100" = IS_RUNNIAN:='1';  --4

WHEN "0001000" = IS_RUNNIAN:='1';  --8

WHEN "0001100" = IS_RUNNIAN:='1';  --12

WHEN "0010000" = IS_RUNNIAN:='1';  --16

WHEN "0010100" = IS_RUNNIAN:='1';  --20

WHEN "0011000" = IS_RUNNIAN:='1';  --24

WHEN "0011100" = IS_RUNNIAN:='1';  --28

WHEN "0100000" = IS_RUNNIAN:='1';  --32

WHEN "0100100" = IS_RUNNIAN:='1';  --36

WHEN "0101000" = IS_RUNNIAN:='1';  --40

WHEN "0101100" = IS_RUNNIAN:='1';  --44

WHEN "0110000" = IS_RUNNIAN:='1';  --48

WHEN "0110100" = IS_RUNNIAN:='1';  --52

WHEN "0111000" = IS_RUNNIAN:='1';  --56

WHEN "0111100" = IS_RUNNIAN:='1';  --60

WHEN "1000000" = IS_RUNNIAN:='1';  --64

WHEN "1000100" = IS_RUNNIAN:='1';  --68

WHEN "1001000" = IS_RUNNIAN:='1';  --72

WHEN "1001100" = IS_RUNNIAN:='1';  --76

WHEN "1010000" = IS_RUNNIAN:='1';  --80

WHEN "1010100" = IS_RUNNIAN:='1';  --84

WHEN "1011000" = IS_RUNNIAN:='1';  --88

WHEN "1011100" = IS_RUNNIAN:='1';  --92

WHEN "1100000" = IS_RUNNIAN:='1';  --96

WHEN OTHERS    = IS_RUNNIAN:='0';

END CASE;

CASE YUE IS

WHEN "0001"  = TOTAL_DAYS="11111"; --1

WHEN "0011"  = TOTAL_DAYS="11111";  --3

WHEN "0101"  = TOTAL_DAYS="11111";  --5

WHEN "0111"  = TOTAL_DAYS="11111";  --7

WHEN "1000"  = TOTAL_DAYS="11111";  --8

WHEN "1010"  = TOTAL_DAYS="11111";  --10

WHEN "1100"  = TOTAL_DAYS="11111";  --12

WHEN "0100"  = TOTAL_DAYS="11110";  --4

WHEN "0110"  = TOTAL_DAYS="11110";  --6

WHEN "1001"  = TOTAL_DAYS="11110";  --9

WHEN "1011"  = TOTAL_DAYS="11110";  --11

WHEN "0010"  =

IF (IS_RUNNIAN='1') THEN

TOTAL_DAYS="11101";

ELSE

TOTAL_DAYS="11100";

END IF;

WHEN OTHERS=NULL;

END CASE;

IF(LD='0') THEN

NUM=DATA;

ELSIF CLK'EVENT AND CLK='1' THEN

MAX_DAYS=TOTAL_DAYS;

IF NUM=TOTAL_DAYS THEN  --99

NUM="00001";CO='1';

ELSE

NUM=NUM+1;CO='0';

END IF;

END IF;

END PROCESS;

END ARCHITECTURE ART;

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CNT7 IS

PORT(LD: IN STD_LOGIC;

CLK: IN STD_LOGIC;

DATA: IN STD_LOGIC_VECTOR(2 DOWNTO 0);

NUM: BUFFER STD_LOGIC_VECTOR(2 DOWNTO 0));

END ENTITY CNT7;

ARCHITECTURE ART OF CNT7 IS

BEGIN

PROCESS(CLK,LD) IS

BEGIN

IF(LD='0') THEN

NUM=DATA;

ELSIF CLK'EVENT AND CLK='1' THEN

IF NUM="111" THEN --7

NUM="000";

ELSE

NUM=NUM+1;

END IF;

END IF;

END PROCESS;

END ARCHITECTURE ART;

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CNT12 IS

PORT(LD: IN STD_LOGIC;

CLK: IN STD_LOGIC;

DATA: IN STD_LOGIC_VECTOR(3 DOWNTO 0);

NUM: BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0);

CO: OUT STD_LOGIC);

END ENTITY CNT12;

ARCHITECTURE ART OF CNT12 IS

BEGIN

PROCESS(CLK,LD) IS

BEGIN

IF(LD='0') THEN

NUM=DATA;

ELSIF CLK'EVENT AND CLK='1' THEN

IF NUM="1100" THEN --12

NUM="0000";CO='1';

ELSE

NUM=NUM+1;CO='0';

END IF;

END IF;

END PROCESS;

END ARCHITECTURE ART;

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CNT99 IS

PORT(LD: IN STD_LOGIC;

CLK: IN STD_LOGIC;

DATA: IN STD_LOGIC_VECTOR(6 DOWNTO 0);

NUM: BUFFER STD_LOGIC_VECTOR(6 DOWNTO 0));

END ENTITY CNT99;

ARCHITECTURE ART OF CNT99 IS

BEGIN

PROCESS(CLK,LD) IS

BEGIN

IF(LD='0') THEN

NUM=DATA;

ELSIF CLK'EVENT AND CLK='1' THEN

IF NUM="1100011" THEN --12

NUM="0000000";

ELSE

NUM=NUM+1;

END IF;

END IF;

END PROCESS;

END ARCHITECTURE ART;

关于eda数字秒表设计程序vhdl和eda课程设计数字钟的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

扫码二维码