数字电子钟逻辑电路设计《EDA技术》课程设计报告
序号 综合成绩 优秀()良好()
中等()及格()
不及格()
教师(签名)
批改日期 《EDA技术》课程设计报告 课题:
数字电子钟逻辑电路设计 院系 电子与电气工程学院 专业 电气工程及其自动化 班级 学号 姓名 指导教师 起止日期 2014-12-18至2014-12-19 2014年 X 月 目录 一、课程设计任务及要求 1 1.1实验目的 1 1.2功能设计 1 二、整体设计思想 1 2.1性能指标及功能设计 1 2.2总体方框 2 2.3FPGA芯片介绍 2 三、编译与调试 3 3.1数字钟的基本工作原理:
3 3.1.1调时、调分信号的产生 3 3.1.2计数显示电路 4 3.2设计思路 4 3.3设计步骤 5 3.3.1工程建立及存盘 5 3.3.2工程项目的编译 5 3.3.3时序仿真 6 3.3.4引脚锁定 6 3.3.5硬件测试 6 3.3.6实验结果 7 四、程序设计 8 五、实验电路图 16 5.1实验原理图 16 5.2 PCB图 16 六、心得体会 17 七、参考文献 18 一、课程设计任务及要求 1.1实验目的 1)掌握VHDL语言的基本运用 2)掌握QuartusII的简单操作并会使用EDA实验箱 3)掌握一个基本EDA课程设计的操作 1.2功能设计 要求显示格式为小时-分钟-秒钟,整点报时,报时时间为5 秒,即从整点前5 秒钟开始进行报时提示,LED 开始闪烁,过整点后,停止闪烁。调整时间的按键用按键模块的S1 和S2,S1 调节小时,每按下一次,小时增加一个小时,S2 调整分钟,每按下一次,分钟增加一分钟。另外用S8 按键作为系统时钟复位,复位后全部显示00-00-00。
二、整体设计思想 2.1性能指标及功能设计 1)时、分、秒计时器 时计时器为一个24进制计数器,分、秒计时器均为60进制计数器。当秒计时器接受到一个秒脉冲时,秒计数器开始从00计数到59,此时秒显示器将显示00、01、02、...、59、00;
每当秒计数器数到00时,就会产生一个脉冲输出送至分计时器,此时分计数器数值在原有基础上加1,其显示器将显示00、01、02、...、59、00;
每当分计数器数到00时,就会产生一个脉冲输出送至时计时器,此时时计数器数值在原有基础上加1,其显示器将显示00、01、02、...、23、00。
2)校时电路 当开关拨至校时档时,电子钟秒计时工作,通过时、分校时开关分别对时、分进行校对,开关每按1次,与开关对应的时或分计数器加1,当调至需要的时与分时,拨动reset开关,电子钟从设置的时间开始往后计时。
2.2总体方框 2.3FPGA芯片介绍 SOPC-NIOSII EDA/SOPC实验开发系统是根据现代电子发展的方向,集EDA和SOPC系统开发为一体的综合性实验开发系统,除了满足高校专、本科生和研究生的SOPC教学实验开发之外,也是电子设计和电子项目开发的理想工具。整个开发系统由核心板SOPC-NiosII-EP2C35、系统板和扩展板构成,根据用户不同的需求配置成不同的开发系统。
SOPC-NiosII-EP2C35开发板是在经过长期用户需求考察后,结合目前市面上以及实际应用需要,同时兼顾入门学生以及资深开发工程师的应用需求而研发的。就资源而言,它已经可以组成一个高性能的嵌入式系统,可以运行目前流行的RTOS,如uC/OS、uClinux等。系统主芯片采用672引脚、BGA封装的EP2C35 FPGA,它拥有33216个LE,105个M4K片上RAM(共计483840bits),35个18×18硬件乘法器、4个高性能PLL以及多达475个用户自定义IO。板上提供了大容量的SRAM、SDRAM和Flash ROM等以及常用的RS-232、USB2.0、RJ45接口和标准音频接口等,除去板上已经固定连接的IO,还有多达260个IO通过不同的接插件引出,供用户使用。所以,不管从性能上而言,还是从系统灵活性上而言,无论您是初学者,还是资深硬件工程师,它都会成为您的好帮手。如图2.3所示:
图2.3FPGA系统功能框图 三、编译与调试 3.1数字钟的基本工作原理:
3.1.1调时、调分信号的产生 由计数器的计数过程可知,正常计数时,当秒计数器(60进制)计数到59 时,再来一个脉冲,则秒计数器清零,重新开始新一轮的计数,而进位则作为分计数器的计数脉冲,使分计数器计数加1。现在我们把电路稍做变动:把秒计数器的进位脉冲和一个频率为2Hz的脉冲信号同时接到一个2选1数据选择器的两个数据输入端,而位选信号则接一个脉冲按键开关,当按键开关不按下去时(即为0),则数据选择器将秒计数器的进位脉冲送到分计数器,此时,数字钟正常工作;
当按键开关按下去时(即为1),则数据选择器将另外一个2Hz 的信号作为分计数器的计数脉冲,使其计数频率加快,当达到正确时间时,松开按键开关,从而达到调时的目的。调节小时的时间也一样的实现。
3.1.2计数显示电路 由计数部分、数据选择器、译码器组成,是时钟的关键部分。
1、计数部分:由两个60进制计数器和一个24 进制计数器组成,其中60 进制计数器可用6 进制计数器和10 进制计数器构成;
24 进制的小时计数同样可用6 进制计数器和10 进制计数器得到:当计数器计数到24 时,“2”和“4”同时进行清零,则可实现24 进制计数。
2、数据选择器:84 输入14 输出的多路数据选择器,因为本实验用到了8个数码管(有两个用来产生隔离符号‘—’)。
3、译码器:七段译码器。译码器必须能译出‘—’,由实验二中译码器真值表可得:字母F 的8421BCD 码为“1111”,译码后为“1000111”,现在如果只译出‘—’,即字母F的中间一横,则译码后应为“0000001”,这样,在数码管上显示的就为‘—’。
3.2设计思路 根据系统设计要求,系统设计采用自顶向下设计方法,由时钟分频部分、计时部分、按键部分调时部分和显示部分五个部分组成。这些模块都放在一个顶层文件中。
1)时钟计数:
首先下载程序进行复位清零操作,电子钟从00:00:00计时开始。setshi可以调整时钟的小时部分, setfen可以调整分钟,步进为1。
用6位数码管分别显示“时”、“分”、“秒”,通过OUTPUT(6 DOWNTO 0)上的信号来点亮指定的LED七段显示数码管。
2)
时间设置:
手动调节分钟、小时,可以对所设计的时钟任意调时间,这样使数字钟真正具有使用功能。我们可以通过实验板上的S2和S1进行任意的调整,因为我们用的时钟信号均是1HZ的,所以每LED灯变化一次就来一个脉冲,即计数一次。
3)清零功能:
S8为复位键,低电平时实现清零功能,高电平时正常计数。可以根据我们自己任意时间的复位。
3.3设计步骤 3.3.1工程建立及存盘 1.打开 QuartusⅡ,单击“File”菜单,选择 File→New Project Wizard,对话框如下:分别输入项目的工作路径、项目名和实体名,单击Finish。
2.单击“File”菜单,选择New,弹出小对话框,双击“VHDL File“,即选中了文本编辑方式。在出现的“Vhdl1.vhd”文本编辑窗中键入VHDL程序,输入完毕后,选择File→Save As,即出现“Save As”对话框。选择自己建立好的存放本文件的目录,然后在文件名框中键入文件名,按“Save”按钮。
3.建立工程项目,在保存VHDL文件时会弹出是否建立项目的小窗口,点击“Yes”确定。即出现建立工程项目的导航窗口,点击“Next”,最后在出现的屏幕中分别键入新项目的工作路径、项目名和实体名。注意,原理图输入设计方法中,存盘的原理图文件名可以是任意的,但VHDL程序文本存盘的文件名必须与文件的实体名一致,输入后,单击“Finish”按钮。
3.3.2工程项目的编译 单击工具条上的编译符号开始编译,并随着进度不断变化屏幕,编译完成后的屏幕如图所示:
3.3.3时序仿真 建立波形文件:选择 File→New,在New窗中选中“Other File”标签。在出现的屏幕中选择“Vector Waveform File”项出现一新的屏幕。在出现的新屏幕中,双击“Name”下方的空白处,弹出“Insert Nod or Bus”对话框,单击该对话框的“Node Finder……”。在屏幕中的 Filter 中选择 Pins,单击“List”。而后,单击“>>”,所有输入/输出都被拷贝到右边的一侧,这些正是我们希望的各个引脚,也可以只选其中的的一部分,根据实际情况决定。然后单击屏幕右上脚的 “OK”。在出现的小屏幕上单击“OK”。
设定仿真时间宽度。选择 Edit → End time…选项,在End time选择窗中选择适当的仿真时间域,以便有足够长的观察时间。
波形文件存盘。选择File→Save as 选项,直接存盘即可。
运行仿真器。在菜单中选择项,直到出现,仿真结束。
3.3.4引脚锁定 将设计编程下载进选定的目标器件中,如EPF10K10,作进一步的硬件测试,将设计的所有输入输出引脚分别与目标器件的EPF10K10的部分引脚相接,操作如下:
1.选择 Assignments → Assignments Editor ,即进入 Assignments Editor编辑器。在Category 栏选择 Pin,或直接单击右上侧的 Pin 按钮。
2.双击 TO 栏的《new》,在出现的的下拉栏中选择对应的端口信号名(如 D[0]);
然后双击对应的栏的《new》,在出现的下拉栏中选择对应的端口信号名的期间引脚号。
3.最后存储这些引脚锁定信息后,必须再编译(启动)一次,才能将引脚锁定信息编译进编程下载文件中。此后就可以准备将编译好的 SOF 文件下载到试验系统的FPGA中去了。
3.3.5硬件测试 1.首先将下载线把计算机的打印机口与目标板(如开发板或实验板)连接好,打开电源。
2.打开编辑窗和配置文件。选择,弹出一个编辑窗。在Mode栏中选择JTAG,并在选项下的小方框打勾。注意核对下载文件路径与文件名。如果文件没有出现或者出错,单击左Add file侧按钮,手动选择配置文件 clock.sof。
3.最后单击下载标符Start,即进入对目标器件 FPGA 的配置下载操作。当 Progress 显示100%,以及在底部的处理栏中出现 Configuration Succeeded 时,表示编程成功,如图所示。注意,如果必要时,可再次单击 Start,直至编程成功。
4.下载完成后,通过硬件测试进一步确定设计是否达到所有的技术指标,如未达到,可逐步检查,哪部分出现问题。如果是代码出现问题,须修改代码;
若是时序波形图有问题,须重新设置。
3.3.6实验结果 键s8为复位按键,键s1设置小时,键s2设置分钟。下载成功后,按下键s8,即使六个LED复位清零,显示数秒的自动计时。当秒数满59则进一位,分钟数满59进一位,当显示为xx:59:55时,外接的LED小灯开始闪烁,过整点以后停止闪烁。调试实物图如图3.3.6所示:
图3.3.6调试实物图 四、程序设计 1.(1)秒计数器(miao)VHDL 程序描述 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity miao is port(clk,reset,setfen:in std_logic;enfen:out std_logic;countmiao:out std_logic_vector(7 downto 0));end miao;architecture fun of miao is signal count:std_logic_vector(7 downto 0);signal enfen_1,enfen_2:std_logic;begin countmiao<=count;enfen_2<=(setfen and clk);enfen<=(enfen_1 or enfen_2);process(clk,reset,setfen)begin if(reset='0')then count<=“00000000“;enfen_1<='0';elsif(clk'event and clk='1')then if(count(3 downto 0)=“1001“)then if(count<16#60#)then if(count=“01011001“)then count<=“00000000“;enfen_1<='1';else count<=count+7;end if;else count<=“00000000“;enfen_1<='0';end if;elsif(count<16#60#)then count<=count+1;enfen_1<='0';else count<=“00000000“;enfen_1<='1';end if;end if;end process;end fun;(2)秒计数器(miao)仿真波形图(3)秒计数器(miao)仿真分析 1、随着 clk 脉冲信号的不断到来,countmiao 记录出 clk 的脉冲个数,计数 到 59 时,在下一个 clk 脉冲信号到来时,输出端 enfen 输出高定平,即向分进 位,同时 countmiao 清零。
2、reset 为清零端,reset 低电平时,当 countmiao 计数从零重新开始计数。
3、setfen 为分的手动进位端,当 setfen 高定平时且 clk 脉冲到来时,输出 enfen 高电平,向分进位。
2.(1)分计数器(fen)VHDL 程序描述 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fen is port(imiao,clk,reset,setshi:in std_logic;enshi:out std_logic;countfen:out std_logic_vector(7 downto 0));end fen;architecture fun of fen is signal enshi_1,enshi_2:std_logic;signal count:std_logic_vector(7 downto 0);begin countfen<=count;enshi_2<=(setshi and clk);enshi<=(enshi_1 or enshi_2);process(imiao,reset,setshi)begin if(reset='0')then count<=“00000000“;elsif(imiao'event and imiao='1')then if(count(3 downto 0)=“1001“)then if(count<16#60#)then if(count=“01011001“)then count<=“00000000“;enshi_1<='1';else count<=count+7;end if;else count<=“00000000“;end if;elsif(count<16#60#)then count<=count+1;enshi_1<='0';else count<=“00000000“;end if;end if;end process;end fun;(2)分计数器(fen)仿真波形图(3)分计数器(fen)仿真分析 1、imiao 为秒计数器的 enfen 进位输出端,当 enfen(imiao)高电平到来 时,clk 高电平时,且 countfen 开始计数。
countfen 计数到 59 时,下一个 enfen(imiao)、clk 到来时,enshi 高电平,即向时进位,同时 countfen 清零。
2、reset 为清零端,当 reset 低电平时,countfen 计数从零重新开始计数。
3、setshi 为时的手动进位端,当 setshi 高定平时且 clk 脉冲到来时,输出 en 时高电平,向时进位。
3.(1)时计数器(shi)VHDL 程序描述 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity shi is port(ifen,reset:in std_logic;countshi:out std_logic_vector(7 downto 0));end shi;architecture fun of shi is signal count:std_logic_vector(7 downto 0);begin countshi<=count;process(ifen,reset)begin if(reset='0')then count<=“00000000“;elsif(ifen'event and ifen='1')then if(count(3 downto 0)=“1001“)then if(count<16#23#)then count<=count+7;else count<=“00000000“;end if;elsif(count<16#23#)then count<=count+1;else count<=“00000000“;end if;end if;end process;end fun;(2)时计数器(shi)仿真扫描显示译码器(saomiao)仿真(3)时计数器(shi)仿真分析 1、ifen 为分计数器的 enshi 进位输出端,当 enshi(ifen)为高电平时,countshi 计数。countshi 计数到 23 时,当下一个 enshi(ifen)、clk 到来时,countshi 会自动清零。
2、reset 为清零端,当 reset 低电平时,countfen 计数从零重新开始计数。
4.整点报时(1)整点报时器(baoshi)VHDL 程序描述 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;Entity baoshi is port(clk:in std_logic;inputmiao,inputfen:in std_logic_vector(6 downto 0);output:out std_logic_vector(1 downto 0));end baoshi;architecture fun of baoshi is signal temp:std_logic_vector(1 downto 0);signal nummiao,numfen:std_logic_vector(7 downto 0);begin nummiao<=inputmiao;numfen<=inputfen;output<=temp;process(clk,temp)begin if(clk'event and clk='1')then if(numfen=“01011001“)then case nummiao is when“01011000“=>temp<=“01“;when“01011001“=>temp<=“10“;when others=>temp<=“00“;end case;end if;if(numfen=“00000000“)then case nummiao is when“00000000“=>temp<=“11“;when others=>temp<=“00“;end case;end if;end if;end process;end fun;11(2)整点报时器(baoshi)仿真波形图(3)整点报时器(baoshi)仿真分析 input 为分计数器的输出端,当输出 58、59 和 00(十六进制)时,整点报 时器(baoshi)的输出端 output 为高电平,点亮 LED 灯。当 intput 为 58、59 时,点亮一个 LED 灯,当 input 为 00 时,点亮两个 LED 灯。其他情况时,LED 灯均不发光。
4.(1)分频器(fenpin)设计 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpin is port(clk_5M:in std_logic;clk:out std_logic);end fenpin;architecture fun of fenpin is signal count:std_logic_vector(22 downto 0);begin process(clk_5M)begin if(clk_5M'event and clk_5M='1')then if(count=“***00111111“)then count<=“***00000000“;clk<='1';else count<= count+1;clk<='0';end if;end if;end process;end fun;5.(1)扫描显示译码器(saomiao))VHDL 程序描述 扫描显示译码器是用来显示时钟数值的装置,将数字时钟的高低电平信号用 数码管的数值显示出来。八个数码管中,用六个数码管显示时、分和秒,另外两 个可做为时和分、分和秒之间的间隔,始终不显示。
首先对八个数码管进行扫描,每一时刻都只有一个数码管处于扫描状态,并 将此时的数字时钟的高低电平通过十六进制的 BCD 码转换为数码管显示数值。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity saomiao is port(clk_smxs:in std_logic;shi:in std_logic_vector(7 downto 0);fen:in std_logic_vector(7 downto 0);miao:in std_logic_vector(7 downto 0);selout:out std_logic_vector(7 downto 0);segout:out std_logic_vector(6 downto 0));end saomiao;architecture fun of saomiao is signal temp:std_logic_vector(2 downto 0);signal seg:std_logic_vector(6 downto 0);signal sel:std_logic_vector(7 downto 0);begin selout<=sel;segout<=seg;process(clk_smxs)variable num:std_logic_vector(3 downto 0);begin if(clk_smxs'event and clk_smxs='1')then if temp>=“111“ then temp<=“000“;else temp<=temp+1;end if;case temp is when “111“ =>num:=shi(7 downto 4);sel<=“00000111“;when “110“ =>num:=shi(3 downto 0);sel<=“00000110“;when “100“ =>num:=fen(7 downto 4);sel<=“00000100“;when “011“ =>num:=fen(3 downto 0);sel<=“00000011“;when “001“ =>num:=miao(7 downto 4);sel<=“00000001“;when “000“ =>num:=miao(3 downto 0);sel<=“00000000“;when others=>sel<=“00000010“;end case;case num is when“0000“=>seg<=“0111111“;when“0001“=>seg<=“0000110“;when“0010“=>seg<=“1011011“;when“0011“=>seg<=“1001111“;when“0100“=>seg<=“1100110“;when“0101“=>seg<=“1101101“;when“0110“=>seg<=“1111101“;when“0111“=>seg<=“0000111“;when“1000“=>seg<=“1111111“;when“1001“=>seg<=“1101111“;when others=>seg<=“0000000“;end case;end if;end process;end fun;(2)扫描显示译码器(saomiao)仿真波形图 6.数字时钟整体设计、数字时钟整体设计:
(1)数字时钟的电路原理图:
(2)数字时钟的电路仿真波形 五、实验电路图 5.1实验原理图 5.2 PCB图 六、心得体会 七、参考文献 [1]蒋立平.数字电路.北京:兵器工业出版社,2008 [2]南京理工大学电子技术中心.EDA设计实验指导书.2010 [3] 侯伯亨,顾新.VHDL硬件描述语言与数字逻辑电路设计 西安:西安电子科技大学出版社,1999 [4]潘松,黄继业EDA技术实用教程北京:科学出版社,2002 [5]卢杰,赖毅VHDL与数字电路设计北京:科学出版社,2006
版权声明:
1.大文斗范文网的资料来自互联网以及用户的投稿,用于非商业性学习目的免费阅览。
2.《数字电子钟逻辑电路设计《EDA技术》课程设计报告》一文的著作权归原作者所有,仅供学习参考,转载或引用时请保留版权信息。
3.如果本网所转载内容不慎侵犯了您的权益,请联系我们,我们将会及时删除。
