数字时钟设计_第1页
数字时钟设计_第2页
数字时钟设计_第3页
数字时钟设计_第4页
数字时钟设计_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数字时钟设计第一页,共五十四页,编辑于2023年,星期三

本章给出了PLD器件在复杂数字系统的典型应用实例-数字时钟的设计。数字时钟的设计也是PLD在复杂数字系统的经典应用。该章首先介绍了数字时钟的功能要求和整体结构;随后具体介绍了数字时钟的模块设计,其中包括数字时钟控制信号和控制模块的具体结构。本章最后详细描述了设计的具体实现过程,具体包括数字时钟的计数模块设计、计数时钟及扫描时钟设计和显示控制模块设计。数字时钟设计-本章概要第11章第十一章第二页,共五十四页,编辑于2023年,星期三

数字钟时常见的一种计数装置,数字钟以1Hz的频率工作。该设计完成数字钟的运行和显示。其主要功能有:数字钟以1Hz的频率工作,其输入频率为1MHz。数字钟显示时、分、秒信息。这些显示信息在6个7段数码管上完成。通过按键设置时、分信息。并且具有对数字钟的复位功能。复位键将时、分、秒清零,并做好重新计数的准备。按键具有预置时、分的功能。分别对当前的时和分信息做递增设置和递减设置。第十一章数字时钟设计-数字时钟的功能要求●第三页,共五十四页,编辑于2023年,星期三第十一章数字时钟设计-数字时钟的结构●第四页,共五十四页,编辑于2023年,星期三第十一章数字时钟设计-数字时钟的结构

图11.1给出了该数字钟的结构图。从图中可以看到,数字钟由:复位按键(reset);小时递增按键(hour_inc);小时递减按键(hour_dec);分钟递增按键(min_inc);分钟递减按键(min_dec);时钟输入;

7段LED显示LED管选择信号线sel;

LED码控制信号线(segment)●第五页,共五十四页,编辑于2023年,星期三

该数字钟的控制部分由PLD芯片完成。该芯片的输入和输出接口由下面信号组成:输入信号:复位信号(reset)时钟输入信号(clk)小时递增信号(hour_inc)小时递减信号(hour_dec)分钟递增信号(min_inc)分钟递减信号(min_dec)数字时钟设计-数字时钟的信号第十一章●第六页,共五十四页,编辑于2023年,星期三输出信号:LED选择信号(sel)LED码显示控制信号(segment)数字时钟设计-数字时钟的信号第十一章●第七页,共五十四页,编辑于2023年,星期三

该设计分成下面四个模块:定时时钟模块、扫描时钟模块、按键处理模块、定时计数模块和显示控制模块。图11.2给出了这几个模块之间的信号连接关系。第十一章数字时钟设计-控制模块结构●第八页,共五十四页,编辑于2023年,星期三

1、按键处理模块由于VHDL语言的规则,将按键的处理和定时模块设计在一起。为了描述清楚,将对按键的处理进行说明。在该设计中,采用异步复位电路方式。当复位信号低有效时,计数器停止计数,时、分、秒清零。对于小时的递增、递减按键操作,通过一个1Hz的计数时钟采样。图11.3给出了递增、递减的操作时序。第十一章数字时钟设计-控制模块结构●第九页,共五十四页,编辑于2023年,星期三第十一章数字时钟设计-控制模块结构●第十页,共五十四页,编辑于2023年,星期三

当1Hz的div_clk信号的上升沿到来时,检测hour_inc和hour_dec按键,图中的虚线表示在时钟的上升沿对按键信号进行采样。当hour_inc或hour_dec按键低有效时,对小时进行递加或递减操作。对于分钟的递加、递减按键操作,也是通过一个1Hz的计数时钟采样。原理同图11.4。数字时钟设计-控制模块结构第十一章●第十一页,共五十四页,编辑于2023年,星期三

2、定时时钟模块

定时时钟模块其作用就是将外部提供的1MHz的时钟,通过分频器后向模块内的定时计数模块提供1Hz的定时计数时钟。在设计定时时钟模块时,采用同步计数电路。数字时钟设计-控制模块结构第十一章●第十二页,共五十四页,编辑于2023年,星期三

3、扫描时钟模块扫描时钟模块的作用就是通过对1MHz的分频处理后,向显示控制模块提供合适的显示扫描时钟,该时钟必须经过合理的设计,才能保证7段数码显示的稳定。在设计扫描时钟模块时,采用同步计数电路。数字时钟设计-控制模块结构第十一章●第十三页,共五十四页,编辑于2023年,星期三

4、定时计数模块

定时计数模块是该设计中最重要的一部分,在设计该模块时,为了便于后续显示控制模块的设计,将时、分、秒进行分离,即小时分成了小时的十位和个位分别处理,分钟分成了分钟的十位和个位分别处理。秒分成了秒的十位和个位分别处理。在该设计中,采用24小时计数模式。例如:13:28:57。13为小时的表示,1为小时的十位,3为小时的个位;28为分钟的表示,2为分钟的十位,8为分钟的个位;57为秒的表示,5为秒的十位,7为秒的个位。数字时钟设计-控制模块结构第十一章●第十四页,共五十四页,编辑于2023年,星期三

秒的个位计数从0-9,即十进制计数。当秒的个位计数到9后,准备向秒的十位进位。秒的十位计数从0-5,即六进制计数。当秒的十位计数到5后,准备向分的个位进位。分钟的个位计数从0-9,即十进制计数。当分钟的个位计数到9后,准备向分钟的十位进位。分钟的十位计数从0-5,即六进制计数。当分钟的十位计数到5后,准备向小时的个位进位。对于小时的处理比较复杂,小时的十位和个位之间存在下面的关系:当小时的十位为0或1时,小时的个位可以计数范围为0-9,即十进制计数;当小时的十位为2时,小时的各位可以计数的范围为0-3,即四进制计数;数字时钟设计-控制模块结构第十一章●第十五页,共五十四页,编辑于2023年,星期三数字时钟设计-控制模块结构第十一章●第十六页,共五十四页,编辑于2023年,星期三

5、显示控制模块

显示控制模块主要作用是在7段数码管上正确的显示0-9的数字。sel三位LED选择线和3-8译码器相连数字时钟设计-控制模块结构第十一章●第十七页,共五十四页,编辑于2023年,星期三整个工程窗口:含设计时钟源文件、仿真测试文件、用户约束文件第十一章数字时钟设计-控制模块结构●第十八页,共五十四页,编辑于2023年,星期三数字时钟设计-行为仿真结果第十一章●第十九页,共五十四页,编辑于2023年,星期三数字时钟设计-布局布线仿真结果第十一章●第二十页,共五十四页,编辑于2023年,星期三

选择“project->newsource”;设置实现约束文件类型ImplementationConstraintsFile,文件名clock;单击“下一步”,选中与“clock”关联;单击“下一步”,单击“完成”;选中“clcok.ucf”文件,在Processview窗口双击“Assignpackagepins”,出现XinlinxPACE窗口界面;数字时钟设计-用户约束文件设置第十一章●第二十一页,共五十四页,编辑于2023年,星期三数字时钟设计-XinlinxPACE窗口界面第十一章●第二十二页,共五十四页,编辑于2023年,星期三6.单击DesignObjectList-IOPins窗口中每一信号后的Loc,可以输入对应的FPGA引脚,形式如P78。设置完成,保存文件,退出XilinxPACE窗口,完成引脚分配。数字时钟设计-用户约束文件设置第十一章●第二十三页,共五十四页,编辑于2023年,星期三数字时钟设计-引脚分配文件第十一章●第二十四页,共五十四页,编辑于2023年,星期三1.首先选中“GenerateProgrammingFile”,右键单击,单击“Properties”;

2.选中“ProcessProperties”窗口下的“Startupoptions”标签,设置“FPGAstart-upclock”为JTAG,单击“确定”;数字时钟设计-编程下载验证第十一章●第二十五页,共五十四页,编辑于2023年,星期三数字时钟设计-编程下载验证第十一章●第二十六页,共五十四页,编辑于2023年,星期三

3.在如下图所示的“Processforsource:clock-behavioral”中,双击ConfigureDevice(iMPACT).数字时钟设计-编程下载验证第十一章●第二十七页,共五十四页,编辑于2023年,星期三

4.系统自动进行综合、实现过程,若没有错误,将出现如下窗口,单击“下一步”,单击“完成”;数字时钟设计-编程下载验证第十一章●第二十八页,共五十四页,编辑于2023年,星期三

5.出现一个确认窗口,告知检测到一个器件,单击“确定”按钮;

6.选择刚刚生成的bit文件,单击“打开”;

7.可能会出现警告,单击“确定”;

8.此时界面中JTAG链上只有一个器件,型号为XC3S400,单击鼠标右键,单击“Program…”,完成对器件编程,进行实际验证。数字时钟设计-编程下载验证第十一章●第二十九页,共五十四页,编辑于2023年,星期三libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;--实体定义部分entityclockisport( clk:instd_logic; rst:instd_logic; inc_min:instd_logic; sub_min:instd_logic; inc_hour:instd_logic; sub_hour:instd_logic; sel:outstd_logic_vector(2downto0); q:outstd_logic_vector(7downto0));endclock;数字时钟设计-主程序第十一章●第三十页,共五十四页,编辑于2023年,星期三--信号定义:

architectureBehavioralofclockissignalsec_counter1:std_logic_vector(3downto0);signalsec_counter2:std_logic_vector(3downto0);signalmin_counter1:std_logic_vector(3downto0);signalmin_counter2:std_logic_vector(3downto0);signalhour_counter1:std_logic_vector(3downto0);signalhour_counter2:std_logic_vector(3downto0);signaldivcounter:std_logic_vector(3downto0);signaldiv_clk:std_logic;signalscancounter:std_logic_vector(1downto0);signalscan_clk:std_logic;signalscan_out:std_logic_vector(2downto0);signalsecseg1,secseg2,minseg1,minseg2,hourseg1,hourseg2:std_logic_vector(7downto0);begin数字时钟设计-主程序第十一章●第三十一页,共五十四页,编辑于2023年,星期三--计数时钟,对外部输入时钟分频,此处只适用于仿真,实际进行时间计数时,分频后时钟应该满足1HZ。process(rst,clk)beginif(rst='0')then divcounter<="0000"; div_clk<='0'; elsif(rising_edge(clk)) then if(divcounter="1111")then divcounter<="0000"; div_clk<=notdiv_clk;else divcounter<=divcounter+'1';endif; endif;endprocess;数字时钟设计-主程序第十一章●第三十二页,共五十四页,编辑于2023年,星期三--仿真时数码管扫描时钟,实际中需根据具体情况进行调解时钟频率process(rst,clk)begin if(rst='0')then scancounter<="00"; scan_clk<='0';elsif(rising_edge(clk)) then if(scancounter="11")then scancounter<="00"; scan_clk<=notscan_clk;else scancounter<=scancounter+'1';endif;endif; endprocess;数字时钟设计-主程序第十一章●第三十三页,共五十四页,编辑于2023年,星期三--时钟计数部分主进程

--时钟复位clock:process(div_clk,rst)beginif(rst='0')then sec_counter1<=X"0"; sec_counter2<=X"0"; min_counter1<=X"0"; min_counter2<=X"0"; hour_counter1<=X"0"; hour_counter2<=X"0";

数字时钟设计-主程序第十一章●第三十四页,共五十四页,编辑于2023年,星期三

--手动调分,递增elsif(rising_edge(div_clk))thenif(inc_min='0')then if(min_counter1=X"9")then min_counter1<=X"0"; if(min_counter2>=X"5")then min_counter2<=X"0";elsemin_counter2<=min_counter2+1;endif;else min_counter1<=min_counter1+1;endif;数字时钟设计-主程序第十一章●第三十五页,共五十四页,编辑于2023年,星期三--手动调分,递减elsif(sub_min='0')then if(min_counter1=X"0")then min_counter1<=X"9";if(min_counter2=X"0")then min_counter2<=X"5";else min_counter2<=min_counter2-1;endif;else min_counter1<=min_counter1-1;

endif;数字时钟设计-主程序第十一章●第三十六页,共五十四页,编辑于2023年,星期三--手动调时,增时elsif(inc_hour='0')then if(hour_counter2=X"2")then if(hour_counter1=X"3")then hour_counter1<=X"0"; hour_counter2<=X"0"; else hour_counter1<=hour_counter1+1; endif;elseif(hour_counter1=X"9")then hour_counter1<=X"0"; hour_counter2<=hour_counter2+1;else hour_counter1<=hour_counter1+1;endif;endif;数字时钟设计-主程序第十一章●第三十七页,共五十四页,编辑于2023年,星期三--手动调时,减时elsif(sub_hour='0')thenif(hour_counter1=X"0")then if(hour_counter2=X"0")thenhour_counter1<=X"3"; hour_counter2<=X"2"; else hour_counter2<=hour_counter2-1; hour_counter1<=X"9";endif;else hour_counter1<=hour_counter1-1;endif;数字时钟设计-主程序第十一章●第三十八页,共五十四页,编辑于2023年,星期三--时分秒正常计数elseif(sec_counter1>=X"9")then sec_counter1<=X"0"; if(sec_counter2>=X"5")then sec_counter2<=X"0"; if(min_counter1>=X"9")then min_counter1<=X"0"; if(min_counter2>=X"5")thenmin_counter2<=X"0"; if(hour_counter2=X"2")then if(hour_counter1=X"3")thenhour_counter1<=X"0"; hour_counter2<=X"0";数字时钟设计-主程序第十一章●第三十九页,共五十四页,编辑于2023年,星期三else hour_counter1<=hour_counter1+1;endif;elseif(hour_counter1=X"9")then hour_counter1<=X"0"; hour_counter2<=hour_counter2+1;elsehour_counter1<=hour_counter1+1;endif;endif;elsemin_counter2<=min_counter2+1;endif;数字时钟设计-主程序第十一章●第四十页,共五十四页,编辑于2023年,星期三

elsemin_counter1<=min_counter1+1;endif;elsesec_counter2<=sec_counter2+1;endif;elsesec_counter1<=sec_counter1+1;endif;endif;endif;

endprocessclock;数字时钟设计-主程序第十一章●第四十一页,共五十四页,编辑于2023年,星期三--生成扫描时钟process(rst,scan_clk) begin if(rst='0')then scan_out<="000"; elsif(rising_edge(scan_clk))then if(scan_out="101")then scan_out<="000";else scan_out<=scan_out+1; endif; endif;endprocess;数字时钟设计-主程序第十一章●第四十二页,共五十四页,编辑于2023年,星期三--扫描输出进程process(scan_out)begincasescan_outiswhen"000"=>q<=secseg1;sel<="000"; when"001"=>q<=secseg2;sel<="001";when"010"=>q<=minseg1;sel<="010";when"011"=>q<=minseg2;sel<="011";when"100"=>q<=hourseg1; sel<="100"; when"101" =>q<=hourseg2;sel<="101";whenothers=>q<="11111111";sel<="111";endcase;endprocess;数字时钟设计-主程序第十一章●第四十三页,共五十四页,编辑于2023年,星期三--秒低位显示second_counter1:process(sec_counter1) begin casesec_counter1is when"0000"=>secseg1<="10111111"; when"0001"=>secseg1<="10000110"; when"0010"=>secseg1<="11011011"; when"0011"=>secseg1<="11001111"; when"0100"=>secseg1<="11100110"; when"0101"=>secseg1<="11101101"; when"0110"=>secseg1<="11111101"; when"0111"=>secseg1<="10000111"; when"1000"=>secseg1<="11111111"; when"1001"=>secseg1<="11101111"; whenothers=>secseg1<="11111111";endcase;endprocesssecond_counter1;数字时钟设计-主程序第十一章●第四十四页,共五十四页,编辑于2023年,星期三--秒高位显示second_counter2:process(sec_counter2) begin casesec_counter2is when"0000"=>secseg2<="00111111"; when"0001"=>secseg2<="00000110"; when"0010"=>secseg2<="01011011"; when"0011"=>secseg2<="01001111"; when"0100"=>secseg2<="01100110"; when"0101"=>secseg2<="01101101"; whenothers=>secseg2<="01111111";endcase;endprocesssecond_counter2;数字时钟设计-主程序第十一章●第四十五页,共五十四页,编辑于2023年,星期三--分低位显示minute_counter1:process(min_counter1) begin casemin_counter1is when"0000"=>minseg1<="10111111"; when"0001"=>minseg1<="10000110"; when"0010"=>minseg1<="11011011"; when"0011"=>minseg1<="11001111"; when"0100"=>minseg1<="11100110"; when"0101"=>minseg1<="11101101"; when"0110"=>minseg1<="11111101"; when"0111"=>minseg1<="10000111"; when"1000"=>minseg1<="11111111"; when"1001"=>minseg1<="11101111"; whenothers=>minseg1<="11111111";endcase;endprocessminute_counter1;数字时钟设计-主程序第十一章●第四十六页,共五十四页,编辑于2023年,星期三--分高位显示minute_counter2:process(min_counter2) begin casemin_counter2is when"0000"=>minseg2<="00111111"; when"0001"=>minseg2<="00000110"; when"0010"=>minseg2<="01011011"; when"0011"=>minseg2<="01001111"; when"0100"=>minseg2<="01100110"; when"0101"=>minseg2<="01101101"; whenothers=>minseg2<="01111111";endcase;endprocessminute_counter2;数字时钟设计-主程序第十一章●第四十七页,共五十四页,编辑于2023年,星期三--小时低位显示hor_counter1:process(hour_counter1) begin casehour_counter1is when"0000"=>hourseg1<="10111111"; when"0001"=>hourseg1<="10000110"; when"0010"=>hourseg1<="11011011"; when"0011"=>hourseg1<="11001111"; when"0100"=>hourseg1<="11100110"; when"0101"=>hourseg1<="11101101"; when"0110"=>hourseg1<="11111101"; when"0111"=>hourseg1<="10000111"; when"1000"=>hourseg1<="11111111"; when"1001"=>hourseg1<="11101111"; whenothers=>hourseg1<="11111111";endcase;endprocess;数字时钟设计-主程序第十一章●第四十八页,共五十四页,编辑于2023年,星期三--小时高位显示

hor_counter2:process(hour_counter2) begin casehour_counter2is when"0000"=>hourseg2<="00111111"; when"0001"=>hourseg2<="00000110"; when"0010"=>hourseg2<="01011011"; whenothers=>hourseg2<="01111111";endcase;endprocess;endBehavioral;数字时钟设计-主程序第十一章●第四十九页,共五十四页,编辑于2023年,星期三LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_unsigned.all;USEieee.numeric_std.ALL;ENTITYtest_clock_vhdISENDtest_clock_vhd;ARCHITECTUREbehaviorOFtest_clock_vhdIS --ComponentDeclarationfortheUnitUnderTest(UUT) COMPONENTclock PORT( clk:INstd_logic; rst:INstd_logic; inc_min:INstd_logic; sub_min:INstd_logic; inc_hour:INstd_logic; sub_hour:INstd_logic; sel:OUTstd_logic_vector(2downto0); q:OUTstd_logic_vector(7downto0) ); ENDCOMPONENT;数字时钟设计

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论