最新《可编程逻辑器件及应用》课程设计报告完整.doc
Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date可编程逻辑器件及应用课程设计报告完整课程设计报告格式摘 要本课程设计给出了一种基于FPGA的多功能数字时钟方法,采用EDA作为开发工具,VHDL语言和图形输入为硬件描述语言,Quartus II 9.0作为运行程序的平台,编写的程序经过调试运行,波形仿真验证,下载到EDA实验箱的FPGA芯片,实现了设计目该系统主要由分频模块、控制模块、计时模块、显示模块组成。经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,能够在数码管上完成年、月、日和时、分、秒的分别显示,由按键输入进行数字时钟的校时、清零、暂停功能。关键词:EDA技术;FPGA;数码管AbstractThe course design gives a FPGA-based multifunctional digital clock using EDA as a development tool, VHDL language and graphical input hardware description language, the Quartus II 9.0 as a platform for running the program, written procedures debugging and running, the waveform simulation downloaded to the FPGA chip to achieve the design goals.The design for a multi-functional digital clock, with a year, month, day, hours, minutes and seconds count display to a 24-hour cycle count, with the pause time, clear function and the hours and minutes setting function.The main system is made up of frequency module, control module, time module, display module. After compiling the design and simulation procedures, the programmable logic device to download verification, the system can complete the year, month, day and the hours, minutes and seconds respectively, using keys to modify, clear , start and stop the digital clock.Key words:EDA technology; FPGA; digital clock; VHDL language; digital tube目 录1绪论.11.1 课程背景11.2 设计目的12总体设计流程说明22.1数字时钟的工作原理23 单元模块设计流程53.1分频模块53.2计数模块53.3控制模块74系统调试说明及分析105总结116附录12-1 绪论1.1课程背景如今电子产品正向功能多元化,体积最小化,功耗最低化的方向发展。它与传统的电子产品在设计上的显著区别师大量使用大规模可编程逻辑器件,使产品的性能提高,体积缩小,功耗降低.同时广泛运用现代计算机技术,提高产品的自动化程度和竞争力,缩短研发周期。EDA技术正是为了适应现代电子技术的要求,吸收众多学科最新科技成果而形成的一门新技术。EDA技术以大规模可编程逻辑器件为设计载体,以硬件描述语言为系统逻辑描述主要表达方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件的方式设计的电子系统到硬件系统的逻辑编译,逻辑化简,逻辑分割,逻辑映射,编程下载等工作。最终形成集成电子系统或专用集成芯片的一门新技术。这次课程设计利用VHDL硬件描述语言结合可编程逻辑器件进行的,并通过数码管动态显示计时结果。利用可编程逻辑器件具有其他方式没有的特点,它具有易学,方便,新颖,有趣,直观,设计与实验项目成功率高,理论与实践结合紧密,体积小,容量大,I/O口丰富,易编程等特点,应用非常方便。所以,本次设计采用可编程逻辑器件实现。1.2设计目的现在电子技术的应用无处不在,电子技术正在不断地改变我们的生活,改变着我们的世界。在这快速发展的年代,时间对人们来说是越来越宝贵,在快节奏的生活时,一旦遇到重要的事情而忘记了时间,这将会带来很大的损失。因此我们需要一个定时系统来提醒这些忙碌的人。数字化的钟表给人们带来了极大的方便。近些年,随着科技的发展和社会的进步,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。研究数字时钟及其应用,有着非常现实的意义。2. 总体设计流程说明2.1数字时钟的工作原理振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24翻1”规律计数。计满后各计数器清零,重新计数。日期部分由于日有28天、29天、30天、31天4种情况,故日由年和月共同判断其天数,日计满后向月进位,月满后向年进位。计数器的输出分别经译码器送数码管显示。计时出现误差时,可以用校时电路校时、校分、校秒和校年、校月和校日。在控制信号中除了一般的校时信号外,还有时钟使能信号、时钟清零信号。控制信号由4×4矩形键盘输入。时基电路可以由石英晶体振荡电路构成,如果晶振频率为1MHz,经过6次十分频就可以得到秒脉冲信号。译码显示电路由七段译码器完成,显示由数码管构成。3 单元模块设计流程3.1分频模块图6分频模块图6分频模块设计的原理主要是计数分频,用了两种分频,一种是50MHZ变成200HZ的分频,用于扫描按键输入的时钟脉冲,另外一种是将200HZ分频为1HZ用于时间信号的脉冲。如200HZ的脉冲经过200次计数后溢出的时钟就是1HZ。程序仿真波形如图7所示。图7 仿真波形因为50MHZ的仿真太大,仿真的时候等待的时间很长,而且毛刺很多,不容易观察实验的结果,所以软件仿真的时候将分频改成了1000分频方便观察现象,波形中NEWCLK变成1的时候,CLK计数刚好满1000次,说明运行成功。3.2计数模块计数模块用到计数器包括年、月、日、时、分、秒,图8和图9分别为秒和日的计数模块。 图8 秒的计数模块计数器是这次设计的基本组成部分,但几个计数器的原理都基本一样,LD是预置数使能端,低电平有效,当LD为0时,DATA的值送给NUM。正常运作时CLK来一个上升沿,NUM输出加1。图9日的计数模块LD是置数端、NIAN6.0和YUE3.0是当前的年月,DATA4.0是预置数,MAX_DAYS4.0是最大天数的输出端,连接到控制器的输入端,用于调节时间。仿真波形如图10所示。图10 仿真波形3.3控制模块图11控制模块控制模块是本设计的核心模块,主要实现时间的设置,KEY1是调节时间的总控制,KEY2、KEY3主要负责指定数值的增与减。当KEY1输入低电平时,时钟暂停,开始调节时钟的秒,再输入多一次时开始调节时间的分钟数值,RES是退出调节的按键,无论进行到哪一步,只要RES输入低电平,调节控制将跳出。SEC_EN、MIN_EN、HOUR_EN、DAY_EN、MON_EN、YEAR_EN是使能端,相应位为高电平时调节相应的目标。SEC5.0、MIN5.0、HOUR4.0、DAY4.0、MON3.0、YEAR6.0分别是秒、分、时、日、月、年的预置数,当调节按键KEY1按下时,这些置数将会送给对应的计数器进行显示。当SEC_EN为低电平时选择调节秒的数值。控制模块仿真如图12所示。图12 控制模块仿真时间设置按键KEY1第一次按下时对秒SEC进行设置,SEC_EN有效,KEY2按键输入一个低跳变时,SEC加1,并且SEC的数值0、1、2、3等将会送到计数器的预置数端,这是计数器的LD有效即可将预置数直接送到数码管去显示。当KEY1再次按下时对分MIN进行设置,MIN_EN有效,即连接MIN计数器的LD有效,预置数直接送给MIN计数器,无论计数器里面的值现在是多少,结果都会变成预置数的值,KEY2按键输入一个低跳变时,MIN加1。RES是退出设置,按下之后,计数器进入正常计时。另外还需要用到消抖模块,主要是用状态机去除毛刺,其原理和延时去毛刺的原理基本上一样,因为毛刺持续的时间比较短,一般只会存在5至10毫秒,所以如果想消去毛刺的话,只需要检测一个信号(低电平)可以持续5个毫秒的就可以认为是有按键按下去了。一共用了3个输入按键,分别是:时间设置选项、时间加1、时间减1,CLK的输入时钟是200HZ。消抖模块的原理图和仿真波形如图13和图14所示。 图13消抖模块图14仿真波形4 系统调试说明及分析本系统只有FPGA编程硬件设计电路。在系统调试中采用自底向上的调试方法,也就是先进行各个单元模块的软件编译,在各个单元模块调试好后再把单元模块原理图化,然后综合起来进行系统的整体编译和仿真。功能仿真无误后,通过下载数据线将设计文件加载到目标器件FPGA,通过控制按键观察LED显示是否达到数字钟的设计要求。经调试,可以完成数字钟功能如图17和18所示。总 结在这次的课程设计过程中,我更进一步地熟悉了有关数字电路的知识和具体应用。学会了利用QuarterII9.0软件进行原理图的绘制,硬件描述语言VHDL的编写,实际下载到实验箱上后会出现一系列的问题,因此仿真图和电路连接图还是有一定区别的。这次设计对于我以后的工作和学习都是一种巨大的帮助,我的专业知识水平也取得一定的进步,非常感谢老师在实验课上的帮助。同时这次设计是采用硬件描述语言和FPGA芯片相结合进行的数字钟的研究,从中可以看出EDA技术的发展在一定程度上实现了硬件设计的软件化。设计的过程变的相对简单,容易修改等优点,相信随着电子技术的发展,数字钟的功能会更加多样化,满足人们的各种需要。附录秒计数模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity miao isport(enl,res,clk,madd,mdec:in std_logic; a,b:out std_logic_vector(3 downto 0); ca:out std_logic);end miao;architecture SEC of miao isbeginprocess(enl,clk,res)variable m0,m1:std_logic_vector(3 downto 0);beginif res='1' then m0:="0000" m1:="0000" ca<='0' elsif clk'event and clk='1' then ca<='0' if madd='1' or enl='1' then if m0="1000" and m1="0101" then ca<='1' -实际是第59个-脉冲 end if; if m0<"1001" then m0:=m0+1; else m0:="0000" m1:=m1+1; if m1>"0101" then m0:="0000" m1:="0000" ca<='0' end if; end if; elsif mdec='1' then if m0="0000" and m1="0000" then m0:="1001" m1:="0101" elsif m0>"0000" then m0:=m0-1; else m0:="1001" m1:=m1-1; end if; end if; end if; a<=m0;b<=m1;end process;end SEC; -计数进程 if(sig2='1')then if(counter="11")then sig1<='0' counter<="00" else sig1<='1' counter<=counter+'1' end if; end if;end if;end process;process(clky) -列线逐位输出低电平variable jt :std_logic;beginif(clky'event and clky='1')then if(sig1='1')then jt:=sig_com(3); for i in 3 downto 1 loop sig_com(i)<=sig_com(i-1); end loop; sig_com(0)<=jt; else sig_com<="1110" end if;end if;end process;process(clky)beginif(clky'event and clky='1')then if(sig1='1')then com<=sig_com; else com<="0000" end if;end if;end process;process(clky) -键码信号赋值beginif(clky'event and clky='1')then if(sig1='1')then if(tmp='0')then scan_code<=row & sig_com; else scan_code<="11111111" end if; else scan_code<="11111111" end if;end if;end process;end behav;按键消抖模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity qudou is port(clk1:in std_logic; row:in std_logic_vector(3 downto 0); key_pre:out std_logic);end qudou;architecture behav of qudou is signal sig1,counter:std_logic_vector(3 downto 0); signal tmp1,sig2:std_logic;begin sig1<=row; tmp1<=sig1(0)and sig1(1)and sig1(2)and sig1(3); key_pre<=counter(0)and counter(1)and counter(2)and counter(3);process(clk1)begin if(clk1'event and clk1='1')then if(tmp1='0')then if(sig2='0')then sig2<='1' end if; end if;if(sig2='1')then if(counter="1111")then sig2<='0' counter<="0000" else counter<=counter+'1' end if; end if;end if;end process;end behav;扫描显示library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity seltime is port(disclk,conv:in std_logic; m0,m1,f0,f1,s0,s1,r0,r1,y0,y1,n0,n1,n2,n3:in std_logic_vector(3 downto 0); dataout:out std_logic_vector(3 downto 0); wsel:out std_logic_vector(3 downto 0);end seltime;architecture st of seltime issignal count:std_logic_vector(3 downto 0);beginwsel<=count;process(disclk,conv) beginif disclk'event and disclk='1' then if count>="1010" then count<="0000" else count<=count+1; end if; end if;if conv='1' then case count is when"1010"=>dataout<=s1; when"1001"=>dataout<=s0; when"0110"=>dataout<=f1; when"0101"=>dataout<=f0; when"0100"=>dataout<=m1; when"0011"=>dataout<=m0; when others =>dataout<="0000" end case;else case count is when"1010"=>dataout<=n3; when"1001"=>dataout<=n2; when"1000"=>dataout<=n1; when"0111"=>dataout<=n0; when"0110"=>dataout<=y1; when"0101"=>dataout<=y0; when"0100"=>dataout<=r1; when"0011"=>dataout<=r0; when others =>dataout<="0000" end case; end if;end process;end st;