基于VHDL语言的简易电子钟课程设计.doc
设计题目:简易数字电子钟 专业班级: 电子信息工程二班学号:姓名:指导教师: 引言 目录第一章 数字电子钟计内容及要求 ·······································1.1 设计内容 ···························································· 1.2功能说明 ····························································第二章数字电子钟系统框图及工作原理································· 2.1 系统框图 ··················································· 2.2 电子钟总体工作原理与设计 ····································· 第三章 各功能模块的设计 3.1正常计时模块 3.2分频模块产生电路 3.3分时模块产生电路 3.4秒模块产生电路 3.5分模块产生电路 3.6时模块产生电路 3.7扫描模块产生电路第四章系统调试与分析·············································· 4.1 系统调试····················································· 4.1.1 调试方法················································· 4.1.2 调试故障及解决方法········································ 4.2 结果分析······················································ 第五章 课程设计感想············································· 引言数字时钟是一种用数字电路技术实现时、分、秒计时的装置,数字时钟走时精度高,稳定性好,使用方便,不需要经常调校,数字式时钟用秒脉冲发生器的精度稳定保证了数字钟的质量电子设计自动化(EDA)技术发展越来越迅速,利用计算机辅助设计已成为发展趋势。VHDL语言具有强大的电路描述和建模能力,用VHDL开发的数字电路与开发平台以及硬件实现芯片无关,可移植性、可重用性好。VHDL语言能够在系统级、行为级、寄存器传输级、门级等各个层次对数字电路进行描述,并可以在不同层次进行不同级别的仿真,能极大得保证设计的正确性和设计指标的实现。Quartus 设计软件提供了一个完整的、多平台的设计环境,它可以轻易满足特定设计项目的要求。数字时钟是一种用数字电路技术实现时、分、秒计时的装置,数字时钟走时精度高,稳定性好,使用方便,不需要经常调校,数字式时钟用秒脉冲发生器的精度稳定保证了数字钟的质量第一章 数字电子钟计内容及要求1.1设计内容1学习ALTERA公司的FPGA/CPLD的结构、特点和性能。2学习集成开发软件MAX+plus II/Quartus II的使用及设计过程。3熟悉EDA工具设计数字电路设计方法,掌握VHDL硬件描述语言设计方法。4根据给定题目设计数字电路,来加深对可编程逻辑器件的理解和掌握。1.2功能要求说明1在所选择器件内完成简易时钟的设计,要求设计完成后芯片具有时、分、秒的计时;译码;输出七段码;最大计时23时59分59秒;秒闪功能。2简易时钟要求具有对时功能,具体对时的实现方式自行决定,要求设计合理,以操作简单为原则(根具具体的工作进度,可以考虑增加整点报时等附加功能)。3在相应的器件平台上完成设计的输入、编译、综合或适配通过。第二章 数字电子钟系统框图及工作原理2.1工作原理 系统主要由振荡器、分频器、计数器、译码显示电路和校时电路组成。振荡器产生稳定的分频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒计数器满60分向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照二十四进制计数。计数器的输出分别由译码器送显示器显示。2.2设计内容 数字电子钟由振荡器、分频器、计数器、译码显示电路和校时电路组成。振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24翻1”规律计数。计数器的输出分别经译码器送显示器显示。1)时钟产生电路。将开发板上的时钟信号经过分频得到不同频率的时钟,分别作用于定时计数、LED扫描。 2)控制逻辑电路。完成电子钟的系统逻辑控制。 3)计时电路。主要按照时钟模式完成计时功能。 4)译码电路。根据计时模块的状态输出值来确定对应位的数据,从而驱动显示电路。 5)显示控制电路。主要执行选择所对应位的数据功能,显示正确的时间。第三章各功能模块的设计 顶层电路设计library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity zong isport( cp,rst:in std_logic; out1: out std_logic_vector(7 downto 0); out2: out std_logic_vector(7 downto 0); end zong; architecture rtl of zong is component fenpin/调用分频电路port( clk1: in std_logic; clk:out std_logic );end component;component fenshi/调用分时电路port( clks,rst: in std_logic; sl,sh,ml,mh,hl,hh:in std_logic_vector(3 downto 0); num: out std_logic_vector(3 downto 0); outbit:out std_logic_vector(7 downto 0);end component;component second/调用秒电路port(clk,rst:in std_logic; enmin:out std_logic; sh:out std_logic_vector(3 downto 0); sl:out std_logic_vector(3 downto 0) );end component;component minute/调用分电路 port(clk1,rst:in std_logic; enhor:out std_logic; mh:out std_logic_vector(3 downto 0); ml:out std_logic_vector(3 downto 0) );end component;component hour/调用小时电路port(clk2,rst:in std_logic; hh:out std_logic_vector(3 downto 0); hl:out std_logic_vector(3 downto 0) ); end component; component clks/调用扫描脉冲电路port( clk1:in std_logic; clks:out std_logic); end component; component saomiao/调用扫描电路port( clk1: in std_logic; clks: out std_logic); end component; component saomiao2/调用翻译电路 port( clks:in std_logic; num:in std_logic_vector(3 downto 0); outled:out std_logic_vector(7 downto 0); end component; signal clk,clk2,enmin,enhor:std_logic; signal s0,s1,m0,m1,h0,h1,num:std_logic_vector(3 downto 0 ); begin u0:fenpin port map(cp,clk); u1:fenshi port map(clk2,rst,s0,s1,m0,m1,h0,h1,num,out1); u2:second port map(clk,rst,enmin,s1,s0); u3:minute port map(enmin,rst,enhor,m1,m0); u4:hour port map(enhor,rst,m1,m0); u5:clks port map(cp,clk2); u6:saomiao port map(cp,clk2); u7:saomiao2port map(clk2,num,out2); end rtl;3.1 正常扫描(分时复用脉冲)模块产生电路 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; entity clks is port( clk1: in std_logic; clks:out std_logic);end clks; Architecture a_counter of clks is signal hm: std_logic_vector(24 downto 0); signal fpb: std_logic; begin process(clk1) begin if (clk1'event and clk1='1') then if hm=50 then hm<="0000000000000000000000000" fpb<=not fpb; else hm<=hm+1; end if; end if; end process; end a_counter;3.2分频模块电路设计(产生秒脉冲)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; entity fenpin is port( clk1: in std_logic; clk:out std_logic );end fenpin; Architecture a_counter of fenpin is signal lm : std_logic_vector(24 downto 0); signal fpa: std_logic; begin process(clk1) begin if (clk1'event and clk1='1') then if lm=24999999 then lm<="0000000000000000000000000" fpa<=not fpa; else lm<=lm+1; end if; end if; end process; end a_counter; 3.2分时模块电路电路(分时复用)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; entity fenshi is port( clks,rst: in std_logic; sl,sh,ml,mh,hl,hh:in std_logic_vector(3 downto 0); num: out std_logic_vector(3 downto 0); outbit:out std_logic_vector(7 downto 0);end fenshi; Architecture a_counter of fenshi is signal st:std_logic_vector(2 downto 0); begin process (clks) begin if(clks'event and clks='1') then st<=st+1; end if; end process; process (st) begin case st is when "000" =>num<=sl; outbit<="00000010" when "001"=>num<=sh; outbit<="00100000" when "010"=>num<=ml; outbit<="00010000" when "011"=>num<=mh; outbit<="00001000" when "100"=>num<=hl; outbit<="00000100" when "101"=>num<=hh; outbit<="00000001" when others=>outbit<="00000000" end case; end process; end a_counter; 3.4秒模块生成电路设计library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity second is port(clk,rst:in std_logic; enmin:out std_logic; sh:buffer std_logic_vector(3 downto 0); sl:buffer std_logic_vector(3 downto 0) );end second;architecture arch_tcx of second isbegin process(clk,rst) begin if rst='0' then sl<="0000" sh<="0000" enmin<='0' elsif (clk'event and clk='1') then if sl=9 then sl<="0000" if sh=5 then enmin<='1' sh<="0000" else sh<=sh+1; end if; else sl<=sl+1; end if; end if; end process; end arch_tcx;3.5 分模块生成电路设计library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity minute is port(clk1,rst:in std_logic; enhor:out std_logic; mh:inout std_logic_vector(3 downto 0); ml:inout std_logic_vector(3 downto 0) );end minute;architecture arch_tcx of minute is signal en2: std_logic_vector(1 downto 0); signal sl,sh:std_logic_vector(3 downto 0); begin process(clk1,rst) begin if rst='0' then ml<="0000" mh<="0000" enhor<='0' elsif (clk1'event and clk1='1') then if ml=9 then ml<="0000" if sh=5 then enhor<='1' mh<="0000" else mh<=mh+1; end if; else ml<=ml+1; end if; end if; end process; end arch_tcx;3.6 时模块生成电路设计 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity hour is port(clk2,rst:in std_logic; hh:inout std_logic_vector(3 downto 0); hl:inout std_logic_vector(3 downto 0) );end hour;architecture arch_tcx of hour is begin process(clk2,rst) begin if rst='0' then hl<="0000" hh<="0000" elsif (clk2'event and clk2='1') then if hl=4 then hl<="0000" if hh=2 then hh<="0000" else hh<=hh+1; end if; else hl<=hl+1; end if; end if; end process; end arch_tcx;3.7 翻译模块生成电路设计library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; entity saomiao2 is port( clks:in std_logic; num:in std_logic_vector(3 downto 0); outled:out std_logic_vector(7 downto 0);end saomiao2; Architecture a_counter of saomiao2 isbegin process(clks)begin case num is when "0001"=>outled<="00000110" when "0010"=>outled<="01011011" when "0011"=>outled<="01001111" when "0100"=>outled<="01100110" when "0101"=>outled<="01101101" when "0110"=>outled<="01111101" when "0111"=>outled<="00000111" when "1000"=>outled<="01111111" when "1001"=>outled<="01101111" when "0000"=>outled<="00111111" when "1010"=>outled<="01110111" when "1011"=>outled<="01111100" when "1100"=>outled<="00111001" when "1101"=>outled<="01011110" when "1110"=>outled<="01111001" when "1111"=>outled<="01110001" when others=>outled<="00111111" end case; end process; end a_counter; 第四章 系统调试与分析4.1 系统调试4.1.1 调试方法实验运用的是VHDL语言与原理图混合设计的方法,因此有程序调试和原理图调试两部分。实验步骤如下:1、 新建工程、VHDL文档输入设计模块子程序2、 调试各个子程序是否存在语法错误的问题3、 对各子模块进行波形仿真,验证输出是否正确4、 各子模块生成图元文件5、 新建工程、原理图文档,将各个子模块文件夹下的文档拷贝到新建工程中6、 根据系统设计框图将各个模块图元文件连接成原理图7、 检验原理图是否正确8、 最后原理图仿真,检查波形图是否正确4.1.2 调试故障及解决方法 在整个实验调试过程中,最主要出现的问题是对VHDL语言的不熟悉,导致在程序编写的过程中出现了不少语法错误导致影响实验结果的问题。其次是软件运用不熟练使得影响实验进度,有时也会影响了实验调试。针对实验中出现了问题,总结了以下一些解决方案和注意事项:1、 程序书写的过程中要注意书写的层次,便于出错时对程序的查找;2、 程序输入时应仔细认真,以免个别字母的错误输入影响实验结果;3、 分模块设计分模块调试,便于对错误的纠正;4、 项目名必须与顶层文件名相同;5、 程序命名过程中,以一定的意义字母命名,便于之后读程序;6、 在原理图设计上,注意总线的书写。设计中主要用的是VHDL语言中的if语句和case语句,因此要对这两种语句的运用十分熟悉。并且其不区分大小写,所以在命名时应注意此问题。4.2 结果分析 4.2.1管脚配置及编译:第五章课程设计感想本次课程设计,我们学会了如何利用VHDL语言设计数字电子钟。本设计使用了基于Altera公司的开发软件工具Quartus II,本系统即实现了可以输出三电子波形的简易多功能波形发生器,仿真结果证明,该设计正确有效,可以作为制作实物的理论依据。本次实验不仅仅要求对程序进行正确的编写并进行编译,同时,将四种模块连接以后,还要对QSF文件进行正确的管脚配置。总电路图成功编译后,将接口插座J002与j102连接、J006与j103连接,J004与101连接。在每一次对程序进行编译之后,都要对新打开的文件进行顶层文件设置,否则会导致实验失败。在实验过程中,开始实验进行的很不顺利,由于一开始就连接了整个电路图,虽然经过多次调试也没有成功。所以我们就把各种波形单独进行调试,每个分模块都先用时序仿真图确认无误再继续进行。在配置管脚的时候 出现了一些问题并及时改正,。然后再将电路图进行连接,最终找出了一开始的错误之处,就是因为输出应该是buffersel。非常感谢张老师和赵老师以及各位同学在本次课程设计中对我们的帮助。这次设计无论实在专业知识还是实践能力方面我们都有了一定的提高。本设计是用VHDL语言编写编译建模设计成的。由于初学VHDL语言,设计初期遇到了很多困难,在经过一段时间的查阅资料以及老师的指导和同学之间的相互讨论后完成了设计,但程序即使编译成功仿真还是遇到了很多困难,比如不知道该如何进行模块例化调用。在经过一次次试验和修改后仿真终于正确,仿真无误后就根据元件引脚进行元器件之间的连线。 通过本次课程设计,让我对数字电子钟有了更深刻的理解,也对用VHDL语言设计实验有了更好的了解。进一步掌握了有关数字钟的工作原理及相关设计知识。特别是对其各工作模块的功能有了更深一步的了解。实验过程中熟悉了对Quartus 软件的操作及应用,提高了个人独立分析问题及解决问题的能力,掌握了VHDL硬件描述语言设计方法,也深刻体会到了VHDL在功能设计中所具有的优越性。 参考文献 1康华光 主编,电子技术基础-数字部分,高等教育出版社,1998。 2 郑亚民等 主编,可编程逻辑器件开发软件Quartus,国防工业出版社,2006 3 谭会生等 主编,EDA技术及应用,西安电子科技大学出版社,20014 潘松等 主编,EDA技术实用教程,科学出版社,2006 5 雷伏容 主编,VHDL电路设计,清华大学出版社,2006