《数字电路实训课程设计基于CPLD实验板的多功能数字钟设计1.doc》由会员分享,可在线阅读,更多相关《数字电路实训课程设计基于CPLD实验板的多功能数字钟设计1.doc(16页珍藏版)》请在三一办公上搜索。
1、数字电路实训基于CPLD实验板的多功能数字钟设计姓 名 学 号 班 级: 指导教师: 基于CPLD实验板的多功能数字钟设计实训报告一、实训目的: 1、掌握数字电路系统的设计方法和技巧; 2、掌握数字电子钟的分频器、计时器等的设计及应用; 3、掌握VHDL源程序的设计、编译和错误修改; 4、掌握的测试向量文件建立,仿真; 5、掌握硬件测试的方法和步骤; 6、掌握器件适配的方法,设计的下载,功能测试。 7、掌握团队协作和分工的技巧。二、实训要求1、 能进行正常的时、分、秒计时功能,分别由6个数码管显示24小时、60分钟、60秒钟的计数器显示;2、能利用实验系统上的按键实现计时状态下的“校时”与“校
2、分”功能;3、能利用蜂鸣器做整点报时;4、完成电路设计后,用实验系统下载验证。附加功能:1、 能进行闹钟的时、分的设置,分别由6个数码管显示24小时、60分钟、60秒钟的闹钟显示;2、 能用实验系统上的按键实现闹钟下的“校时”与“校分”功能;3、能利用蜂鸣器做闹钟报时。三、实训过程1、数字时钟系统的设计思路利用VHDL语言编程设计数字时钟,要实现计时、调时、定时和显示功能,应首先设计一个分频器,将实验板上所提供的50MHZ分成1HZ和10000HZ两个不同的频率,其中1HZ用来驱动计数器计时,调时和定时器的定时,10000HZ用来驱动动态扫描器。然后分别设计控制器,计时器,定时器,动态显示器和
3、报时器。(在此次实训中,李祖均主要负责的是动态显示器和控制器的设计并对整个实验进行编译、仿真验证、修改错误;徐接勋负责的定时器和报时器的设计并对整个实验硬件测试;徐国健负责的是分频器和计数器的设计,还有编写实训报告。)2、各个模块的设计原理(VHDL语言)(1)分频器设计思路:利用翻转将实验板上所提供的50MHZ频率分成占空比为50%,分别为1HZ和10000HZ两个不同的频率,其中1HZ用来驱动计数器计时,调时和定时器的定时,10000HZ用来驱动动态扫描器。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY clk_div ISPORT(CLK:
4、IN STD_LOGIC; F10000,F1:OUT STD_LOGIC);END clk_div;ARCHITECTURE ONE OF clk_div IS SIGNAL Q0:INTEGER RANGE 0 TO 2500; SIGNAL A0:STD_LOGIC:=0; SIGNAL Q3:INTEGER RANGE 0 TO 25000000; SIGNAL A3:STD_LOGIC:=0;BEGIN PROCESS(CLK,Q0) BEGIN IF(CLKEVENT AND CLK=1) THEN IF(Q0=2499) THEN Q0=0; A0=NOT ;A0; F10000
5、=A0; ELSE Q0=Q0+1;F10000=A0; END IF; END IF; END PROCESS; PROCESS(CLK,Q3) BEGIN IF(CLKEVENT AND CLK=1) THEN IF(Q3=24999999) THEN Q3=0; A3=NOT A3; F1=A3; ELSE Q3=Q3+1;F1clkclknull; end case; end process m2to1h; m24:process(clk) begin if (rising_edge(clk) then if (en=0 or (q0=3 and q1=2) then q0=0; q1
6、=0; elsif(q0=9) then q0=0; q1=q1+1; else q0=q0+1; end if; end if; h2= conv_std_logic_vector(q0,4); h1clk1clk1null; end case; end process m2to1m;m60m:process(clk1) begin if (rising_edge(clk1) then if (en=0 or (q2=9 and q3=5) then q2=0; q3=0; xm=1; elsif(q2=9) then q2=0; q3=q3+1; else q2=q2+1;xm=0; en
7、d if; end if; m2= conv_std_logic_vector(q2,4); m1= conv_std_logic_vector(q3,4); end process m60m;m60s:process(f1clk) begin if (rising_edge(f1clk) then if (en=0 or (q4=9 and q5=5) then q4=0; q5=0; xs=1; elsif(q4=9) then q4=0; q5=q5+1; else q4=q4+1;xs=0; end if; end if; s2= conv_std_logic_vector(q4,4)
8、; s1= conv_std_logic_vector(q5,4); end process m60s;end one; 计时器有4个输入端和6个输出端,各个端口的作用为: 输入端:(cht:调时间的时,高电平有效; ,cmt:调时间的分,高电平有效; f1clk:1HZ的频率输入,驱动计时; en:计数器清零端,低电频有效; 输出端 h1:小时的十位; h2:小时的个位; m1:分钟的十位; m2:分钟的个位; s1:秒钟的十位; s2:秒钟的个位;(3)报时器设计思路:报时器有整点报时和闹钟功能。对于整点报时,我们要对分和秒进行比对,当分钟59m时,蜂鸣器从51s开始每隔两秒报一次时,一共
9、报五次时;对于闹钟,则需要对设定的时和分与正常计时进行比对,相同时蜂鸣器则以每秒一次的频率报时,共60s。library ieee;use ieee.std_logic_1164.all;entity bijiao isport(bell:out std_logic; f1:in std_logic; th1,th2,tm1,tm2,h1,h2,m1,m2,s1,s2:in std_logic_vector(3 downto 0); bh1,bh2,bm1,bm2:out std_logic_vector(3 downto 0);end bijiao;architecture one of b
10、ijiao is signal comput:std_logic; signal m:std_logic_vector(15 downto 0);begin m=m2&m1&s2&s1;bijiao:process(th1,th2,tm1,tm2,h1,h2,m1,m2) begin if(th1=h1 and th2=h2 and tm1=m1 and m2=tm2)then comput=1; bh1= th1; bh2= th2; bm1= tm1; bm2= tm2; else comput=0; bh1= th1; bh2= th2; bm1= tm1; bm2bellbellbel
11、lbellbellnull; end case; case(comput)is when1=bellnull; end case; end process naozhong_baoshi;end one;报时器有11个输入端和5个输出端,各个端口的作用为: 输入端:f1:1HZ频率输入端,用来整点报时和闹铃; th1:定时器的小时的个位; th2:定时器的小时的十位; tm1:定时器的分钟的个位; tm2:定时器的分钟的十位; h1:计时器的小时的个位; h2:计时器的小时的十位; m1:计时器的分钟的个位; m2:计时器的分钟的十位;S1:计时器的秒钟的个位; S2:计时器的秒钟的十位; 输
12、出端:bh1:定时器的小时的个位; bh2:定时器的小时的十位; bm1:定时器的分钟的个位; bm2:定时器的分钟的十位; bell:蜂鸣器信号。(4)定时器设计思路:定时器是定闹钟的时和分,相当于一个分钟模60计数器和一个时钟模24计数器,它们由两个端口控制,且互不影响。library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;entity dingshiqi isport(f1,cha,cma: in std_logic; h2,h1:out std_logic_vector(3 downto 0); m2
13、,m1:out std_logic_vector(3 downto 0);end dingshiqi;architecture one of dingshiqi is signal q0,q1:integer range 0 to 15; signal q2,q3:integer range 0 to 15; signal clk:std_logic; signal clk1:std_logic;beginm24:process(cha) begin case(cha)is when0=clkclknull; end case; end process m24;m24a:process(clk
14、) begin if (rising_edge(clk) then if (q0=3 and q1=2) then q0=0; q1=0; elsif(q0=9) then q0=0; q1=q1+1; else q0=q0+1; end if; end if;h2= conv_std_logic_vector(q0,4); h1clk1clk1null; end case; end process m60m;m60ma:process(clk1) begin if (rising_edge(clk1) then if (q2=9 and q3=5) then q2=0; q3=0; elsi
15、f(q2=9) then q2=0; q3=q3+1; else q2=q2+1; end if; end if; m2= conv_std_logic_vector(q2,4); m1= conv_std_logic_vector(q3,4); end process m60ma;end one;定时器有3个输入端和4个输出端,各个端口的作用为: 输入端:f1:1HZ的频率输入,驱动定时; cha:定时间的时,高电平有效; cma:定时间的分,高电平有效; 输出端:h1:小时的十位; h2:小时的个位; m1:分钟的十位; m2:分钟的个位; (5)控制器设计思路:控制器是对校时、定时和显示
16、的控制,考虑到实验板的输入端口,用两个端口分别控制校时器的时和分,同时还控制显示器显示定时时间;另外再用两个端口控制计时器的校时、校分和控制显示器显示计时时间。library ieee;use ieee.std_logic_1164.all;entity kzq isport(k:in std_logic; set:in std_logic; k1:in std_logic; set1:in std_logic; cht,cmt:out std_logic; cha,cma:out std_logic; en:out std_logic; sel:out std_logic);end kzq;
17、architecture one of kzq is signal mi:std_logic_vector(1 downto 0); signal si:std_logic_vector(1 downto 0); signal sel_show:std_logic; signal sel_show1:std_logic; signal c:std_logic;begin mi=k&set; sisel_show=1;cht=0;cmt=0;ensel_show=1;cht=1;cmt=0;ensel_show=1;cmt=1;cht=0;ensel_show=1;cht=0;cmt=0;enn
18、ull; end case; end process ;dingshi:process (si) begin case si is when11=sel_show1=0;cha=0;cma=0;csel_show1=0;cha=1;cma=0;csel_show1=0;cma=1;cha=0;csel_show1=0;cma=0;cha=0;cnull; end case; end process ;m2to1:process(c) begin if(c=0)then sel=sel_show; else sel=sel_show1; end if; end process m2to1;end
19、 one;控制器有4个输入端和6个输出端,各个端口的作用为:输入端:k:控制校时的时;set:控制校时的分;k1:控制定时的时;set1:控制定时的分;输出端:cht:调时间的时,高电平有效;cmt:调时间的分,高电平有效;cha:定时间的时,高电平有效;cma:定时间的分,高电平有效;en:清零信号,低电平有效;sel:闹钟和计时时间的选择信号。(6)动态显示器设计思路:动态显示器是对计时时间和定时时间的动态显示,要对输进来的计时时间和定时时间进行选择,即需要一个二选一的数字选择器,动态显示器显示时需要对七段数码管进行段选和位选,则需要一个多路数字选择器和一个七段显示译码器,组合起来就是一个
20、动态显示器。library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;entity dtxs isport(clk:in std_logic; h1,h2,m1,m2,s1,s2,ah1,ah2,am1,am2,as1,as2:in std_logic_vector(3 downto 0); sel:in std_logic; weixuan:out std_logic_vector(7 downto 0); duanxuan:out std_logic_vector(7 downto 0);end dtxs;a
21、rchitecture one of dtxs is signal qq:std_logic_vector(3 downto 0); signal clk1: std_logic_vector(5 downto 0); signal q0:integer range 0 to 10; signal d0,d1,d2,d3,d4,d5,d6,d7: std_logic_vector(3 downto 0); signal xian:std_logic_vector( 3 downto 0);beginm8:process(clk) begin if (clkevent and clk=1) th
22、en if (q0=7) then q0=0; else q0=q0+1; end if; end if; clk1weixuanweixuanweixuanweixuanweixuanweixuanweixuanweixuan null; end case; end process weixuan38;duanxuanyima:process(qq) begin case qq is when0000=duanxuanduanxuanduanxuanduanxuanduanxuanduanxuanduanxuanduanxuanduanxuanduanxuanduanxuannull; en
23、d case; end process duanxuanyima;m8to1:process(clk1) begin case clk1 is when000000=qqqqqqqqqqqqqqqqnull; end case; end process m8to1;xianshi:process(h1,h2,m1,m2,s1,s2,ah1,ah2,am1,am2,as1,as2) begin if(sel=1 )then d0=s1; d1=s2; d3=m1; d4=m2; d6=h1; d7=h2; else d0=as1; d1=as2; d3=am1; d4=am2; d6=ah1;
24、d7=ah2; end if; xian=1110; d2=xian; d5=xian; end process xianshi; end one; 动态显示器有14个输入端和2个输出端,各个端口的作用为: 输入端:clk:10000HZ输入端,用来驱动动态显示器; h1:计时器的小时的个位; h2:计时器的小时的十位; m1:计时器的分钟的个位; m2:计时器的分钟的十位; s1:计时器的秒钟的个位; s2:计时器的秒钟的十位; ah1:报时器的bh1输端; ah2:报时器的bh2输出端; am1:报时器的bm1输出端; am2:报时器的bm2输出端; as1:计时器的秒钟的个位; as2:
25、计时器的秒钟的十位; sel控制器的sel输出端; 输出端:duanxuan:驱动七段显示数码管; weixuan:驱动8个数码管;3、下载测试(1)、编辑电路并进行全程编译(2)、引脚锁定编译;(3)、下载于CPLD实验板进行功能测试;4、数字钟设计的改进我们在实验板进行数字钟功能测试时,发现在校时和定时时很难设定自己想要设置的时间,几乎每一次在控制端口闭合和断开时,时间就会发生剧烈的跳变,这对于我们的校时和定时是非常不利的;开始时我们认为这是程序的问题,但当我们分别对各模块的程序进行排查后,我们发现程序并没有问题,因此,我们暂时放下了这个问题。后来我们从网上看到相关的论文才了解到这是开关在
26、闭合和断开时产生的干扰信号,所以我们决定在控制器的输入端口分别加入一个消抖电路,如下图所示: 转化为元件和改进后的总图如下图所示: 改进555、实训的心得体会XXX实训心得体会:我觉得这次实训对我来说,就是对我在过去一个学期里所学知识的一个总的考核。一个数字钟的设计是一个系统的设计,它需要我们从系统出发进行设计,需要一定的逻辑思维;因为这次实训我们是以分组的形式进行,所以组员之间如何协作也是我们必须要考虑的问题。刚开始的时候,我和我的组员一样,都会有一种无从下手的感觉,但慢慢的通过指导书和一些常识,我对数字钟的设计有了一个大概轮廓,对数字钟所需要的一些功能也进行了大概的归纳和分类;我们通过讨论
27、决定以分模块的形式来实现数字钟的功能,这样不仅可以使数字钟的设计简单化,还可以方便我们组员的分工,我主要是负责控制器和动态显示器的设计。在对控制器和动态显示器的设计中,我觉得自己的收获是很大的,它不仅使我对VHDL语言有了进一步的认识,还使我对书本知识有了更深的掌握,也学到了很多没学过的知识,所以我觉得这一次的实训是非常有意义的。XXX的实训心得体会: 这次的实训对于我来说是一次挑战,同时也让我对数电产生了兴趣,这次的实训不但需要用到学习了的知识,而且需要许多的扩展的知识;需要我不断的利用学习的知识不断的容纳与吸收。 刚开始我们是根据指导书的内容,了解设计理念及思路。由于老师没有告诉我们方法,
28、所以刚开始的时候我们是无从下手的,经过在网上查找几种不同的数字时钟的程序,寻找他们的理念,在与所学的知识进行比对,因为所学有限,所以进度比较慢,需要不断的进行程序的修改与测试,这个过程对于我来说是非常困难的,一个程序有可能只是小小的;就可能使程序失败,一个程序的功能弄错就让我们的整个的功能得不到表达、或错误。而且程序还有许多没有学习的语句,只能一点点慢慢的理解或请教。这让我学会了很多不懂得知识 本次的实训,让我了解了很多,从简单的到复杂的过程,让我学会了很多不懂得知识,也让我知道了做事要细心,要不然很难做成功一件事情,这可能让我以后可以少走许多的弯路,细心、坚持是我本次实训的最大的收获。 基于本次实训是合作制的,故我们是进行分工合作的,我负责的是定时器和报时器主要是调试报时的时间差,即根据程序的理想时间与下载的后的时间差进行对比,然后再进行修改、调节。XXX的实训心得体会:本次实训,我主要负责是分频器和计时器的设计。通过这次数字时钟的设计,我加深了对VHDL语言的理解和应用,同时也深深感受到,除了理论知识的学习之外,还必须掌握更深一步的动手能力,这样才能把知识真正的知识掌握在手中。所以,这次实训的真正让我把知识运用到实践中去,远比死记硬背的理论知识更有意义。