4.3 小时计数器电路仿真图
时计数器电路仿真图如图4.2:“时计数器”采用24进制计时器,可实现对一天24小时的累计。Reset为清零控制端,仿真结果正确。
图4.2 小时计数器电路仿真图
4.4译码驱动电路仿真图
译码驱动电路仿真图如图4.4:输入BCD码,输出为共阴极数码管显示码,仿真结果正确。
11
结束语
通过两星期的努力,最后完成了我的设计任务——数字钟的设计。通过 本次课程设计的学习,我深深的体会到设计课的重要性和目的性所在。本次设计课不仅仅培养了我们实际操作能力,也培养了我们灵活运用课本知识,理论联系实际,独立自主的进行设计的能力。它不仅仅是一个学习新知识新方法的好机会,同时也是对我所学知识的一次综合的检验和复习,使我明白了自己的缺陷所在,从而查漏补缺。希望学校以后多安排一些类似的实践环节,让同学们学以致用。
课程设计中要求要有耐心和毅力,还要细心,稍有不慎,一个小小的错误就会导致结果的不正确,而对错误的检查要求我要有足够的耐心,通过这次设计和设计中遇到的问题,也积累了一定的经验,对以后从事集成电路设计工作会有一定的帮助。在应用VHDL的过程中让我真正领会到了其并行运行与其他软件(C语言)顺序执行的差别及其在电路设计上的优越性。用VHDL硬件描述语言的形式来进行数字系统的设计方便灵活,利用EDA软件进行编译优化仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法必将在未来的数字系统设计中发挥越来越重要的作用。
致 谢
感谢谭敏老师在本学期EDA技术实用教程课程上的指导和帮助!
参考文献
[1] 黄继业 EDA技术实用教程 北京:科学出版社 2006
[2] 宋万杰 CPLD技术及其应用 西安:西安电子科技大学出版社 2000年 [3] 王金明 数字系统设计与Verilog HDL 北京:北京电子工业出版社 2002年
12
附 件
1.秒计数器模块的VHDL源程序: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY second IS
PORT( clk,reset,setmin:STD_LOGIC; cmin: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为手动调分控制信号,高电平有效 cmin<=(enmin_1 or enmin_2); --enmin为向分进位信号 PROCESS(clk,reset,setmin) BEGIN
IF(reset='1')THEN count<=\若reset为0,则异步清零 ELSIF(clk 'event and clk='1')then --否则,若clk上升沿到
IF(count(3 downto 0)=\ --若个位计时恰好到\即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#)
13
count<=\ --count复0
END IF; --END IF(count<16#60#)
ELSIF(count<16#60#)then --若个位计数未到\则转此句再判 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)=\) END IF; --END IF(reset='0') 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; chour: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为手动调时控制信号,高电平有效 chour<= (enhour_1 or enhour_2); PROCESS(clk,reset,sethour)
14
BEGIN
IF(reset='1') THEN --若reset为0,则异步清零 count<=\
ELSIF(clk'event and clk='1')THEN --否则,若clk上升沿到
IF(count (3 DOWNTO 0) =\若个位计时恰好到\即9 IF(count <16#60#) THEN --又若count小于16#60#,即60 IF(count=\又若已到59D enhour_1<='1'; --则置进位为1 count<=\复0 ELSE
count<=count+7; --若count未到59D,则加7,即作\加6校正\ END IF; --使前面的16#60#的个位转变为8421BCD的容量 ELSE
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)=\) END IF; --END IF(reset='0') END process; END fun;
3.小时计数器模块的VHDL源程序: LIBRARY IEEE;
use IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
15