vhdl数字时钟设计 下载本文

六、结论

通过本次课程设计,我学习到了很多,也收获了很多。总结如下: 一、我对单片机的理论知识有了进一步的掌握,对单片机的原理和实际应用有了更多地理解和掌握。

二、我对单片机的C语言编程有了更深刻的认识和更扎实的掌握,我们不断修改,不断尝试,对源代码各个模块的函数都有了一个非常深入的掌握。

三、理论与实践相结合才能更好的理解和掌握所学的知识。

七、课程总结

通过本次设计,让我很好的锻炼了理论联系实际,与具体项目、课题相结合开发、设计产品的能力。既让我们懂得了怎样把理论应用于实际,又让我们懂得了在实践中遇到的问题怎样用理论去解决。 在本次设计中,我们还需要大量的以前没有学到过的知识,于是图书馆和INTERNET成了我们很好的助手。在查阅资料的过程中,我们

6

要判断优劣、取舍相关知识,不知不觉中我们查阅资料的能力也得到了很好的锻炼。我们学习的知识是有限的,在以后的工作中我们肯定会遇到许多未知的领域,这方面的能力便会使我们受益非浅。 在设计过程中,总是遇到这样或那样的问题。有时发现一个问题的时候,需要做大量的工作,花大量的时间才能解决。自然而然,我的耐心便在其中建立起来了。为以后的工作积累了经验,增强了信心

八、附录(源程序)

1、小时计数器VHDL语言源程序(底层文件) LIBRARY IEEE;

use IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY hour IS

PORT(clk,reset:IN STD_LOGIC;

daout:out STD_LOGIC_VECTOR(5 DOWNTO 0)); END ENTITY hour;

ARCHITECTURE fun OF hour IS

SIGNAL count:STD_LOGIC_VECTOR(5 DOWNTO 0); BEGIN

daout<=count; PROCESS(clk,reset) BEGIN

IF(reset='0')THEN count<=\——若reset=0,则异步清零

ELSIF(clk'event and clk='1')THEN ——否则,若clk上升沿到 IF(count(3 DOWNTO 0)=\——若个位计时恰好到“1001”即9 IF(count<16#23#)THEN ——23进制

count<=count+7; ——若到23D则 else

count<=\——复0 END IF;

ELSIF (count<16#23#)THEN ——若未到23D,则count进1 count<=count+1;

ELSE ——否则清零 count<=\

END IF; ——END IF(count(3 DOWNTO 0)=“1001”) END IF; ——END IF(reset=‘0’)

7

END PROCESS; END fun;

2、分钟计数器VHDL语言源程序(底层文件) LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY minute IS

PORT(clk,clk1,reset,sethour:IN STD_LOGIC; enhour:OUT STD_LOGIC;

daout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END ENTITY minute ;

ARCHITECTURE fun OF minute IS

SIGNAL count :STD_LOGIC_VECTOR (6 DOWNTO 0);

SIGNAL enhour_1, enhour_2: STD_LOGIC; ——enmin_1为59分时的进位信号

BEGIN ——enmin_2由clk调制后的手动调时脉冲信号串 daout<=count;

enhour_2<= (sethour and clk1); ——sethour为手动调时控制信号,高电平有效 enhour<= (enhour_1 or enhour_2); PROCESS(clk,reset,sethour) BEGIN

IF(reset='0') THEN ——若reset为0,则异步清零 count<=\

ELSIF(clk'event and clk='1')THEN ——否则,若clk上升沿到

IF(count (3 DOWNTO 0) =\——若个位计时恰好到“1001”即9 IF(count <16#60#) THEN ——又若count小于16#60#,即60 IF(count=\——又若已到59D enhour_1<='1'; ——则置进位为1 count<=\——count复0 ELSE

count<=count+7; ——若count未到59D,则加7,即作“加6校正” END IF; ——使前面的16#60#的个位转变为8421BCD的容量 ELSE

count<=\——count复0(有此句,则对无效状态电路可自启动) END IF; ——END IF(count<16#60#) ELSIF (count <16#60#) THEN

count<=count+1; ——若count<16#60#则count加1 enhour_1<='0' after 100 ns; ——没有发生进位 ELSE

count<=\——否则,若count不小于16#60# count复0 END IF; ——END IF(count(3 DOWNTO 0)=“1001”) END IF; ——END IF(reset=‘0’) END process; END fun;

8

3、秒钟计数器VHDL语言源程序(底层文件) LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY second IS

PORT( clk,reset,setmin:STD_LOGIC; enmin:OUT STD_LOGIC;

daout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END ENTITY second;

ARCHITECTURE fun OF second IS

SIGNAL count:STD_LOGIC_VECTOR(6 DOWNTO 0);

SIGNAL enmin_1,enmin_2:STD_LOGIC; ——enmin_1为59秒时的进位信号

BEGIN ——enmin_2由clk调制后的手动调分脉冲信号串 daout<=count;

enmin_2<=(setmin and clk); ——setmin为手动调分控制信号,高电平有效 enmin<=(enmin_1 or enmin_2); ——enmin为向分进位信号 PROCESS(clk,reset,setmin) BEGIN

IF(reset='0')THEN count<=\——若reset为0,则异步清零 ELSIF(clk 'event and clk='1')then ——否则,若clk上升沿到

IF(count(3 downto 0)=\——若个位计时恰好到“1001”即9 IF(count<16#60#)then ——又若count小于16#60#,即60H IF(count=\——又若已到59D

enmin_1<='1';count<=\——则置进位为1及count复0 ELSE ——未到59D

count<=count+7; ——则加7,而+7=+1+6,即作“加6校正” END IF;

ELSE ——若count不小于16#60#(即count等于或大于16#60#) count<=\——count复0

END IF; ——END IF(count<16#60#)

ELSIF(count<16#60#)then ——若个位计数未到“1001”则转此句再判 count<=count+1; ——若count<16#60#则count加1 enmin_1<='0'after 100 ns; ——没有发生进位

ELSE ——否则,若count不小于16#60# count<=\——则count复0

END IF; ——END IF(count(3 DOWNTO 0)=“1001”) END IF; ——END IF(reset=‘0’) END PROCESS; END fun;

4、整点报时报警模块VHDL语言源程序(底层文件) LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

9

USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY alert IS

PORT(clk:IN STD_LOGIC;

dain:IN STD_LOGIC_VECTOR(6 DOWNTO 0); speak:OUT STD_LOGIC;

lamp:OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END alert;

ARCHITECTURE fun OF alert IS

SIGNAL count:STD_LOGIC_VECTOR(1 DOWNTO 0); SIGNAL count1:STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN

speaker:PROCESS(clk) BEGIN

speak<=count1(1);

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

IF(dain=\ IF(count1>=\

count1<=\——count1为三进制加法计数器 ELSE

count1<=count1+1; END IF ; END IF ; END IF ;

END PROCESS speaker; lamper:PROCESS(clk) BEGIN

IF(rising_edge(clk))THEN IF(count<=\ IF(count=\

lamp<=\——循环点亮三只灯 ELSIF(count=\ lamp<=\

ELSIF(count=\ lamp<=\ END IF;

count<=count+1; ELSE

count<=\ END IF; END IF; END PROCESS lamper; END fun;

10