基于FPGA的数字时钟的设计1.(精选)
数字时钟设计方案

数字时钟设计方案数字时钟是一种以数字形式显示时间的钟表。
它主要由时钟芯片、显示模块和控制电路等组成。
下面将介绍一种数字时钟的设计方案。
首先,时钟芯片是数字时钟的核心部件,其主要功能是实时计时,并提供时间信号给显示模块。
在设计中,可以选用一款精度较高的实时时钟芯片,如DS1302或DS3231,并通过SPI 或I2C等接口与其他器件进行通信。
其次,显示模块是数字时钟的输出设备,它将时钟芯片提供的时间信号转换成数字形式显示。
常见的数字时钟显示模块有七段数码管、液晶显示屏等。
在此方案中,我们选用四位共阳极的七段数码管。
然后,控制电路是数字时钟的逻辑控制部分,它通过控制模块将时钟芯片的时间信号经逻辑处理后发送给显示模块,并实现其他功能。
在此方案中,控制电路可以采用单片机或FPGA等器件实现。
以STM32单片机为例,通过编程控制GPIO口的电平改变,可以实现对七段数码管的动态显示。
具体实现方案如下:1. 硬件设计:选择合适的时钟芯片和显示模块,并完成其与控制电路的连接。
时钟芯片与控制电路的连接方式主要是通过SPI或I2C接口,而显示模块与控制电路的连接方式主要是通过GPIO口。
2. 软件设计:使用C语言或汇编语言编写控制电路的程序。
程序的主要任务是读取时钟芯片的时间信号,进行逻辑处理后控制七段数码管的显示。
3. 功能扩展:除了基本的时分秒显示外,还可以添加其他附加功能,如日期显示、闹钟设置、温度显示等。
这些功能可以通过增加相应的硬件模块和对应的软件控制实现。
4. 调试和测试:完成硬件和软件的设计后,需要进行调试和测试。
可以通过调试工具实时查看七段数码管的显示结果,并对代码进行正确性和稳定性测试。
5. PCB设计和制作:完成电路设计后,需要进行PCB的设计和制作。
在设计PCB时,要考虑电路的布局、信号线的走向和层间连接等因素,保证电路的稳定性和可靠性。
6. 组装和调试:完成PCB制作后,进行组装和调试。
将制作好的电路板和其他组件进行连接,进行最后的调试和测试。
FPGA可调数字时钟实验报告

一、实验要求1、用vhdl编程,实现10进制计数器2、用vhdl编程,实现60进制计数器3、用vhdl编程,实现数字时钟,时、分、秒、毫秒分别显示在数码管上。
4、实现可调数字时钟的程序设计,用按键实现时、分、秒、毫秒的调整。
二、实验原理用VHDL,行为级描述语言实现实验要求。
思路如下:1、分频部分:由50MHZ分频实现1ms的技术,需要对50MHZ采取500000分频。
2、计数部分:采用低级影响高级的想法,类似进位加1的思路。
对8个寄存器进行计数,同步数码管输出。
3、数码管输出部分:用一个拨码开关控制显示,当sw0=0时,四位数码管显示秒、毫秒的计数。
当sw0=1时,四位数码管显示时、分得计数。
4、调整部分:分别用四个按键控制时、分、秒、毫秒的数值。
先由一个开关控制计数暂停,然后,当按键按下一次,对应的数码管相对之前的数值加1,,通过按键实现时间控制,最后开关控制恢复计数,完成时间调整。
5、整个实现过程由一个文件实现。
三、实验过程各个引脚说明:Clk:50MHZSW:数码管切换,SW=’0’时,数码管显示为秒,毫秒。
SW=’1’时,数码管显示为时,分。
SW1:暂停与启动。
SW1=’0’时,时钟启动,SW=’1’时,时钟暂停。
SW2:时钟调整接通按钮,当SW2=’0’时,不进行调整,当SW=’1’时,通过按键调整时间。
KEY0:毫秒调整,按一次实现+1功能KEY1:秒调整,按一次实现+1功能KEY2:分调整,按一次实现+1功能KEY3:时调整,按一次实现+1功能Q0;第一个数码管Q1; 第二个数码管Q2: 第三个数码管Q3: 第四个数码管1、源代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity paobiao isport(clk,sw,key0,key1,key2,key3,sw1,sw2:in std_logic;q0:out std_logic_vector(6 downto 0);q1:out std_logic_vector(6 downto 0);q2:out std_logic_vector(6 downto 0);q3:out std_logic_vector(6 downto 0));end paobiao;architecture behave of paobiao issignal cntt1 :integer range 0 to 10;signal cntt2 :integer range 0 to 10;signal cntt3 :integer range 0 to 10;signal cntt4 :integer range 0 to 6;signal cntt5 :integer range 0 to 10;signal cntt6 :integer range 0 to 10;signal cntt7 :integer range 0 to 10;signal cntt8 :integer range 0 to 6;signal cntttt1 :integer range 0 to 10;signal cntttt2 :integer range 0 to 10;signal cntttt3 :integer range 0 to 10;signal cntttt4 :integer range 0 to 6;signal cntttt5 :integer range 0 to 10;signal cntttt6 :integer range 0 to 10;signal cntttt7 :integer range 0 to 10;signal cntttt8 :integer range 0 to 6;beginprocess (clk)--,key0,key1,key2,key3)variable cnt :integer range 0 to 500000;--variable cnt9 :integer range 0 to 3000000000;variable cnt1 :integer range 0 to 10;variable cnt2 :integer range 0 to 10;variable cnt3 :integer range 0 to 10;variable cnt4 :integer range 0 to 6;variable cnt5 :integer range 0 to 10;variable cnt6 :integer range 0 to 10;variable cnt7 :integer range 0 to 10;variable cnt8:integer range 0 to 6;beginif(clk'event and clk='1') thenif(sw1='0') thenif(cnt>=2) thencnt:=0;cnt1:=cnt1+1;if (cnt1=10) thencnt1:=0;cnt2:=cnt2+1;if(cnt2=10) thencnt1:=0;cnt2:=0;cnt3:=cnt3+1;if(cnt3=10) thencnt1:=0;cnt2:=0;cnt3:=0;cnt4:=cnt4+1;if(cnt4=6) thencnt1:=0;cnt2:=0;cnt3:=0;cnt4:=0;cnt5:=cnt5+1; if (cnt5=10) thencnt5:=0;cnt6:=cnt6+1;if(cnt6=6) thencnt5:=0;cnt6:=0;cnt7:=cnt7+1;if(cnt7=4) thencnt5:=0;cnt6:=0;cnt7:=0;cnt8:=cnt8+1;if(cnt8=3) thencnt5:=0;cnt6:=0;cnt7:=0;cnt8:=0;end if;end if;end if;end if;end if;end if;end if;end if;else cnt:=cnt+1;end if;if(sw2='0') thencntt1<=cnt1;cntt2<=cnt2;cntt3<=cnt3;cntt4<=cnt4;cntt5<=cnt5;cntt6<=cnt6;cntt7<=cnt7;cntt8<=cnt8;elsecnt1:=cntttt1;cnt2:=cntttt2;cnt3:=cntttt3;cnt4:=cntttt4;cnt5:=cntttt5;cnt6:=cntttt6;cnt7:=cntttt7;cnt8:=cntttt8;cntt1<=cnt1;cntt2<=cnt2;cntt3<=cnt3;cntt4<=cnt4;cntt5<=cnt5;cntt6<=cnt6;cntt7<=cnt7;cntt8<=cnt8;end if;end if;end if;end process;process (key0)variable cnttt1 :integer range 0 to 10; variable cnttt2 :integer range 0 to 10; beginif(key0'event and key0='0') thencnttt1:=cnttt1+1;if(cnttt1=10) thencnttt1:=0;cnttt2:=cnttt2+1;if(cnttt2=10) thencnttt2:=0;end if;end if;cntttt1<=cnttt1;cntttt2<=cnttt2;end if;end process;process (key1)variable cnttt3 :integer range 0 to 10; variable cnttt4 :integer range 0 to 10; beginif(key1'event and key1='0') thencnttt3:=cnttt3+1;if(cnttt3=10) thencnttt3:=0;cnttt4:=cnttt4+1;if(cnttt4=6) thencnttt4:=0;end if;end if;cntttt3<=cnttt3;cntttt4<=cnttt4;end if;end process;process(key2)variable cnttt5 :integer range 0 to 10; variable cnttt6 :integer range 0 to 10; beginif(key2'event and key2='0') thencnttt5:=cnttt5+1;if(cnttt5=10) thencnttt5:=0;cnttt6:=cnttt6+1;if(cnttt6=6) thencnttt6:=0;end if;end if;cntttt5<=cnttt5;cntttt6<=cnttt6;end if;end process;process(key3)variable cnttt7 :integer range 0 to 10; variable cnttt8 :integer range 0 to 10; beginif (key3'event and key3='0') thencnttt7:=cnttt7+1;if(cnttt7=4) thencnttt7:=0;cnttt8:=cnttt8+1;if(cnttt8=3) thencnttt8:=0;end if;end if;cntttt7<=cnttt7;cntttt8<=cnttt8;end if;end process;--end if;--end process;process(cntt1,cntt5)beginif(sw='0') thencase cntt1 iswhen 0=>q0<="1000000";when 1=>q0<="1111001";when 2=>q0<="0100100";when 3=>q0<="0110000";when 4=>q0<="0011001";when 5=>q0<="0010010";when 6=>q0<="0000010";when 7=>q0<="1011000";when 8=>q0<="0000000";when 9=>q0<="0010000";when others=>q0<=NULL;end case;elsecase cntt5 iswhen 0=>q0<="1000000";when 1=>q0<="1111001";when 2=>q0<="0100100";when 3=>q0<="0110000";when 4=>q0<="0011001";when 5=>q0<="0010010";when 6=>q0<="0000010";when 7=>q0<="1011000";when 8=>q0<="0000000";when 9=>q0<="0010000";when others=>q0<=NULL;end case;end if;end process;process(cntt2,cntt6)beginif(sw='0') thencase cntt2 iswhen 0=>q1<="1000000";when 1=>q1<="1111001";when 2=>q1<="0100100";when 3=>q1<="0110000";when 4=>q1<="0011001";when 5=>q1<="0010010";when 6=>q1<="0000010";when 7=>q1<="1011000";when 8=>q1<="0000000";when 9=>q1<="0010000";when others=>q1<=NULL;end case;elsecase cntt6 iswhen 0=>q1<="1000000";when 1=>q1<="1111001";when 2=>q1<="0100100";when 3=>q1<="0110000";when 4=>q1<="0011001";when 5=>q1<="0010010";when 6=>q1<="0000010";when 7=>q1<="1011000";when 8=>q1<="0000000";when 9=>q1<="0010000";when others=>q1<=NULL;end case;end if;end process;process(cntt3,cntt7)beginif(sw='0') thencase cntt3 iswhen 0=>q2<="1000000";when 1=>q2<="1111001";when 2=>q2<="0100100";when 3=>q2<="0110000";when 4=>q2<="0011001";when 5=>q2<="0010010";when 6=>q2<="0000010";when 7=>q2<="1011000";when 8=>q2<="0000000";when 9=>q2<="0010000";when others=>q2<=NULL;end case;elsecase cntt7 iswhen 0=>q2<="1000000";when 1=>q2<="1111001";when 2=>q2<="0100100";when 3=>q2<="0110000";when 4=>q2<="0011001";when 5=>q2<="0010010";when 6=>q2<="0000010";when 7=>q2<="1011000";when 8=>q2<="0000000";when 9=>q2<="0010000";when others=>q2<=NULL;end case;end if;end process;process(cntt4,cntt8)beginif(sw='0') thencase cntt4 iswhen 0=>q3<="1000000";when 1=>q3<="1111001";when 2=>q3<="0100100";when 3=>q3<="0110000";when 4=>q3<="0011001";when 5=>q3<="0010010";when others=>q3<=NULL;end case;elsecase cntt8 iswhen 0=>q3<="1000000";when 1=>q3<="1111001";when 2=>q3<="0100100";when 3=>q3<="0110000";when 4=>q3<="0011001";when 5=>q3<="0010010";when 6=>q3<="0000010";-- when 7=>q3<="1011000";-- when 8=>q3<="0000000";--when 9=>q3<="0010000";when others=>q3<=NULL;end case;end if;end process;end behave;2、原理图如下:3、功能仿真如下1、秒、毫秒计数仿真2、分、时计数仿真注释:由于仿真时间限制,小时不能显示。
根据QuartusII的数字时钟的设计

根据QuartusII的数字时钟的设计基于QuartusII的数字时钟的设计摘要QuartusII是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD 设计流程。
QuartusII使用户可以充分利用成熟的模块,简化了设计的复杂性,加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
数字钟是一种用数字电路实现时、分、秒计时的装置,与机械实施中相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,已得到了广泛的使用。
在对EDA的课程有了初步的了解并掌握Quartus II软件的初步应用之后,我们决定将课题设置为应用Quartus II软件,设计出一个时间可调,并可以通过LED七段共阴极数码管来显示时、分、秒的简易数字钟。
关键词:QuartusII;VHDL;EDA;数字钟SummaryQuartusII is Altera company comprehensive PLD/FPGA development software, support principle diagram, VHDL, VerilogHDL and AHDL design input in the form of embedded own comprehensive device simulators, and can be done from the design input to the hardware configuration of the complete PLD design process.QuartusII allow users to take full advantage of mature modules, simplifies the design complexity, speed up the design.Good support for third-party EDA tools also allow users to use in the different stages of the design process is familiar withthird-party EDA tools.Digital clock is a kind of when using a digital circuit implementation, minutes and seconds timing device, a higher accuracy compared with the implementation of the mechanical and intuitive, and no mechanical device, has a longer service life, has been widely used.In the course of EDA have a preliminary understanding and mastering the Quartus II software after the initial application, we decided to set the topic for the application of the Quartus II software, design a time is adjustable, and can be through the 7 common cathode LED digital tube display hours, minutes and seconds of simple digital clock.Keywords:QuartusII;VHDL;EDA;digital clock目录摘要 (1)绪论 (5)1.课程设计的目的与作用 (7)2.设计任务 (7)3.QuartusII软件介绍 (7)4.相关理论 (8)4.1 理论 (8)4.2 器件 (8)5. 系统设计 (8)5.1 总体 (8)5.2 各模块 (9)5.2.1 顶层模块 (9)5.2.2 十进制计数器模块 (9)5.2.3 六进制计数器模块 (10)5.2.4 二十四进制计数器模块 (10)5.2.5 7段LED显示驱动模块 (11)6. 硬件设计 (11)6.1 顶层实体图 (11)6.2 各模块实体图 (12)6.2.1 十进制计数器模块 (12)6.2.2 六进制计数器模块 (12)6.2.3 二十四进制计数器模块 (13)6.2.4 7段LED显示驱动模块 (13)6.3 总体实体图 (14)7. 流程图设计 (15)8.模块设计实现 (16)8.1建立顶层模块 (16)8.1.1新建dianzizhong.工程 (16)8.1.2建立VHDL源程序 (16)8.2建立十进制计数器模块 (18)8.2.1新建CNT10.工程 (18)8.2.2建立VHDL源程序 (18)8.3建立六进制计数器模块 (19)8.3.1新建CNT6.工程 (19)8.3.2建立VHDL源程序 (19)8.4建立二十四进制计数器模块 (20)8.4.1新建CNT24.工程 (20)8.4.2建立VHDL源程序 (20)8.5建立7段LED显示驱动模块 (21)8.5.1新建LED_DRIV.工程 (21)8.5.2建立VHDL源程序 (22)9.仿真调试结果分析 (22)9.1顶层模块的编译与波形仿真 (22)9.2十进制计数器模块的编译与波形仿真 (23) 9.3六进制计数器模块的编译与波形仿真 (24) 9.4二十四进制计数器模块的编译与波形仿真 (25)9.5 7段LED显示驱动模块的编译与波形仿真 (26)10. 结论 (27)11.设计总结和体会 (27)12. 致谢 (28)13. 参考文献 (29)绪论1.研究的意义在快速发展的年代,时间对于人们来说越来越宝贵,在快节奏的生活中,人们往往会忘记了时间,一旦在一些重要的场合忘记了时间,将会带来重大的损失。
数电课程设计报告数字钟的设计

数电课程设计报告第一章设计背景与要求设计要求第二章系统概述设计思想与方案选择各功能块的组成工作原理第三章单元电路设计与分析各单元电路的选择设计及工作原理分析第四章电路的组构与调试遇到的主要问题现象记录及原因分析解决措施及效果功能的测试方法,步骤,记录的数据第五章结束语对设计题目的结论性意见及进一步改进的意向说明总结设计的收获与体会附图电路总图及各个模块详图参考文献第一章设计背景与要求一.设计背景与要求在公共场所,例如车站、码头,准确的时间显得特别重要,否则很有可能给外出办事即旅行袋来麻烦;数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确度和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用;数字钟是一种典型的数字电路,包括了组合逻辑电路和时序电路;设计一个简易数字钟,具有整点报时和校时功能;1以四位LED数码管显示时、分,时为二十四进制;2时、分显示数字之间以小数点间隔,小数点以1Hz频率、50%占空比的亮、灭规律表示秒计时;3整点报时采用蜂鸣器实现;每当整点前控制蜂鸣器以低频鸣响4次,响1s、停1s,直到整点前一秒以高频响1s,整点时结束;4才用两个按键分别控制“校时”或“校分”;按下校时键时,是显示值以0~23循环变化;按下“校分”键时,分显示值以0~59循环变化,但时显示值不能变化;二.设计要求电子技术是一门实践性很强的课程,加强工程训练,特别是技能的培养,对于培养学生的素质和能力具有十分重要的作用;在电子信息类本科教学中,课程设计是一个重要的实践环节,它包括选择课题、电子电路设计、组装、调试和编写总结报告等实践内容;通过本次简易数字钟的设计,初步掌握电子线路的设计、组装及调试方法;即根据设计要求,查阅文献资料,收集、分析类似电路的性能,并通过组装调试等实践活动,使电路达到性能要求;第二章系统概述设计思想与方案选择方案一 ,利用数字电路中学习的六十进制和二十四进制计数器和三八译码器来实现数字中的时间显示;方案二,利用AT89S51单片机和74HC573八位锁存器以及利用C语言对AT89S51进行编程来实现数字钟的时间显示;由于方案一通过数电的学习我们都比较熟悉,而方案二比较复杂,涉及到比较多我们没学过的内容,所以选择方案一来实施;简易数字钟电路主体部分是三个计数器,秒、分计数器采用六十进制计数器,而时计数器采用二十四进制计数器,其中分、时计数器的计数脉冲由校正按键控制选择秒、分计数器的溢出信号或校正10Hz计数信号;计数器的输出通过七段译码后显示,同时通过数值判断电路控制蜂鸣器报时;各功能块的组成分频模块,60进制计数器模块,24进制计数器模块,4位显示译码模块,正点报时电路模块,脉冲按键消抖动处理模块工作原理一.简易数字钟的基本工作原理是对1Hz标准频率秒脉冲进行计数;当秒脉冲个数累计满60后产生一个分计数脉冲,而分计数脉冲累计满60后产生一个时计数脉冲,电路主要由3个计数器构成,秒计数和分计数为六十进制,时计数为二十四进制;将FPGA开发装置上的基准时钟OSC作为输入信号通过设计好的分频器分成1Hz~10MHz8个10倍频脉冲信号;1Hz的脉冲作为秒计数器的输入,这样实现了一个基本的计时装置;通过4位显示译码模块,可以显示出时间;时间的显示范围为00时00分~23时59分;二.当需要调整时间时,可使用数字钟的时校正和分校正进行调整,数字钟中时、分计数器都有两个计数脉冲信号源,正常工作状态时分别为时脉冲和分脉冲;校正状态时都为5~10Hz的校正脉冲;这两种状态的切换由脉冲按键控制选择器的S 端来实现;为了更准确的设定时间,需要对脉冲按键进消抖动处理;三.电路在整点前10 秒钟内开始控制蜂鸣器报时,可采用数字比较器或逻辑门判断分、秒计数器的状态码值,以不同频率的脉冲控制蜂鸣器的鸣响;第三章单元电路设计与分析各单元电路的选择1分频模块,设计一个8级倍率为10 的分频电路,输出频率分别为1Hz 、10Hz、100 Hz、1k Hz、10k Hz、100k Hz、1 MHz、10MHz8组占空比为50%的脉冲信号;260进制计数器模块,采用两片74161级联;324进制计数器模块,采用两片74161级联;44位显示译码模块,由分频器,计数器,数据选择器,七段显示译码,3-8线译码器构成一个4位LED数码显示动态扫描控制电路;其中4位计数器用74161,数据选择器用74153,七段显示译码器部分采用AHDL硬件描述语言设计;5正点报时电路模块,该模块采用与门和数据选择器74153构成6脉冲按键消抖动处理模块,采用D触发器实现消抖动,从而能够比较精确地设定时间;设计及工作原理分析1分频模块要输出8级频率差为10倍的分频电路,可采用十进制计数器级联实现;集成十进制计数器的类型很多,比较常用的有74160、74162、74190、74192和7490等;这里采用7490来实现分频,7490是二-五-十进制加计数器,片上有一个二进制计数器和一个异步五进制计数器;QA是二进制加计数器的输出,QB、QC、QD是五进制加计数器的输出,位序从告到低依次为D,C,B;该分频器一共用到7片7490,初始信号输入到第一片7490的CLKB 端口,QD输出端连接到CLKA端,作为输入,从QA引出1MHz的output端口,并引线到第二片7490的CLKB端口,依此类推,直到第七片7490连接完成如附图所示;每片7490相当于一个五进制计数器和一个二进制计数器级联实现了十进制加计数,从而实现分频;分频模块图如图所示分频模块内部结构图如下图所示260进制计数器模块采用两片74161级联,如图,下面一片74161做成十进制的,初始脉冲从CLK输入,ENT和ENP都接高电平,而QD与QA用作为与非门的两个输入,与非门输出分别连接到自身的LDN端与上面一片74161的CLK端;上面一片74161的QC和QA端作为与非门的两个输入通过输出连接到自身的LDN,ENT 和ENP接高电平;下面一片实现从0000到1001即0~9十个状态码的计数,当下面一片为1001状态时,自身的LDN为低电平,此时QD,QC,QB,QA的状态恢复到0000,即从0开始从新计数,而上面一片74161的CLK电平改变,上面一片74161开始计数为0001,实现从0000~到0101即0到5六个状态码的计数,当上面一片状态为0101时,LDN为低电平,此时计数器为0000;这样子通过两片74161就实现了一个六十进制计数器;下图为六十进制计数器模块的示意图由六十进制计数模块构成的秒分计数如下图,下面那块六十进制技术模块表示为妙,上面那块六十进制计数模块表示为分;当妙计数模块的状态为0101 1001时,向分计数模块进位, 即通过74153M的输入C1,此时74153M输出接到分计数模块的输入端 ,通过74153M作为选择器,实现进位控制;324进制计数器模块采用两片74161级联,如图,下面一片74161做成十进制的,初始脉冲从CLK输入,ENT和ENP都接高电平,而QD与QA用作为与非门的两个输入分别连接到自身的LDN端与上面一片74161的CLK端;上面一片74161的QB非门的一个输入通过输出连接到自身的LDN,ENT 和ENP接高电平,并且上面74161的QB端和下面一块74161的QC端通过与非门输出接到两片74161的清零端CLRN;下面一片实现从0000到1001即0~9十个状态码的计数,当下面一片为1001状态时,自身的LDN为低电平,此时QD,QC,QB,QA的状态恢复到0000,即从0开始从新计数,而上面一片74161的CLK电平改变,上面一片74161开始计数为0001,实现从0000~到0010即0到2三个状态码的计数,当上面一片状态为0010即2时,下面一片状态为0100即4时,两块74161的CLRN为低电平,此时两块74161的状态都为0000,即实现了23时过后显示00时;这样子通过两片74161就实现了一个24进制计数器;下图为24进制计数器模块示意图由二十四进制计数模块构成的时计数模块如图,下面那块六十进制技术模块表示为分,上面那块24进制计数模块表示为时;当分计数模块的状态为0101 1001时,向时计数模块进位, 即通过74153M的输入C1,此时74153M输出接到时计数模块的输入端 ,通过74153M作为选择器,实现进位控制;二十四进制计数模块构成的时计数模块44位显示译码模块由分频器,计数器,数据选择器,七段显示译码,3-8线译码器构成一个4位LED数码显示动态扫描控制电路;4位计数器由74161构成;如下图所示74161构成的4位计数器数据选择器采用两片74153 和一片74153M两片74153实现连在一起实现对四个数字的选择,而一片74153M实现对小数点的选择;如下图所示74153M构成的数据选择器两片74153构成的数据选择器七段显示译码器部分采用AHDL硬件描述语言设计,语句如下:subdesign ymqdata_in3..0 :input;a,b,c,d,e,f,g :output;begintabledata_in3..0 =>a,b,c,d,e,f,g;b"0000" =>1,1,1,1,1,1,0;b"0001" =>0,1,1,0,0,0,0;b"0010" =>1,1,0,1,1,0,1;b"0011" =>1,1,1,1,0,0,1;b"0100" =>0,1,1,0,0,1,1;b"0101" =>1,0,1,1,0,1,1;b"0110" =>0,0,1,1,1,1,1;b"0111" =>1,1,1,0,0,0,0;b"1000" =>1,1,1,1,1,1,1;b"1001" =>1,1,1,0,0,1,1;b"1010" =>1,1,1,0,1,1,1;b"1011" =>0,0,1,1,1,1,1;b"1100" =>1,0,0,0,1,1,0;b"1101" =>0,1,1,1,1,0,1;b"1110" =>1,0,0,1,1,1,1;b"1111" =>1,0,0,0,1,1,1;end table;end;整个四位显示译码模块如图所示5正点报时电路模块该模块采用与门和数据选择器74153构成,如下图所示;7个输入端口的与门控制A,当时间在59分51s,53s,55s,57s,59s的时候,A为高电平1,当秒的个位数为9时,B为高电平1,A为1,B为0时,输出C1低频率信号,A为1,B为1时输出C3高频率信号,实现整点的不同频率的报时电路;整点报时电路模块6脉冲按键消抖动处理模块采用D触发器实现消抖动,从而能够精确地设定时间;校正状态为5HZ的校正脉冲,分频器输出的10HZ通过T触发器得到5HZ的校正脉冲;如图脉冲按键消抖动处理模块通过T触发器得到的5HZ校正脉冲第四章电路的组构与调试遇到的主要问题1在用74161做二十四进制计数器时,没有深入考虑,打算采用第一片六进制,第二片四进制级联而成,结果出现问题;2时、分调整按键没有安装消抖动装置;3在设置简易数字钟的分时,时计数器也会进;现象记录及原因分析1虽然也能够计数实现二十四进制,但是不能与七段显示译码器配合使用,不能显示直观的数值,这样给用户带来不便;2在下载调试的时候,我要进行时分调整,但是有时按一下子脉冲键会进两个数值,这样子给时分的设置带来了麻烦,原因是按键没有采用消抖动装置;3在调试的时候,打算通过按键调整分,但是发现时计数器也会进位,这就不符合要求了,原因是调整分时,各计数器都按正常状况在计数,所以会按正常情况产生进位;解决措施及效果1仍然采用两片74161,第一片可以从0~9,第二片只能从0~2,而且当第二片为2的时候,第一片到4的话就都清零复位,这样不仅实现了二十四进制计数器,而且能与七段显示译码器配合使用,直观的显示数字;2在脉冲控制按键上加上了D触发器,这样子可以达到消抖动的效果;3加上选择器,把两路信号分开,当调整分的时候,不对时计数器产生进位,这样子就不会产生十进位了,解决了这个问题;功能的测试方法、步骤,记录的数据1简易数字钟的测试,将电路图连好后,分析与综合,仿真,编译,下载到仪器上,表示秒的小数点按1Hz,占空比50%跳动,分从0~59计数,分过了59后,向时计数器进1;2整点点报时功能的测试,到了整点,即59分51s,53s,55s,57s时蜂鸣器低频率间断性鸣响,59分59秒时,蜂鸣器高频率鸣响一次;3时、分调整功能的测试,按分调整键,分按一定的频率逐次加一,但是时显示不变;按时调整键,时按一定的频率逐次加一,但是分显示不变;第五章结束语对设计题目的结论性意见及进一步改进的意向说明简易数字钟的设计中,主要运用了分频器,六十进制计数器,二十四进制计数器,动态扫描显示电路,选择器,按键消抖以及门电路等数字电路方面的知识;可以在简易数字钟的基础上加上24小时和12小时转换功能,秒表功能,闹钟功能,这样更能满足人们的使用需求;总结设计的收获与体会简易数字钟的设计及实验当中,我坚持了下来,上学期的数电我学的并不好,而且对软件应用的接受能力不强,刚开始的时候做的很慢,看到别人都做好了,心里比较着急,于是,我找出了数电课本,复习所涉及的知识点,并练习所学软件,终于有了进步,可以更上同学们的进度,但数字钟的设计一直困扰我,看到别人拓展功能都做好了,自己基本的都还没做好,心里很急;在设计的过程中,碰到了很多的困难,遇到了很多问题,不断地思考与尝试,以及向同学和老师请教,但还是没能完全设计好,以后有时间还得多去实验室尝试,争取做好一些拓展功能;通过这次设计,对上学期学习的数字电路的相关知识得到了复习和巩固,也查阅了一些相关的资料,也加深了我对数字电路应用的理解,总之这次的电子技术课程设计受益匪浅;参考文献:基于FPGA的数字电路系统设计西安电子科技大学出版社数字电子技术基础电子工业出版社数字电路与逻辑设计实验及应用人民邮电出版社附图1.分频模块分频器仿真波形下图为分频器线路图2.60进制计数器模块60进制计数器仿真波形3.24进制计数器模块24进制计数器仿真波形4. 4位显示译码模块七段显示译码器模块七段显示译码器部分采用AHDL硬件描述语言设计,语句如下:subdesign ymqdata_in3..0 :input;a,b,c,d,e,f,g :output;begintabledata_in3..0 =>a,b,c,d,e,f,g;b"0000" =>1,1,1,1,1,1,0;b"0001" =>0,1,1,0,0,0,0;b"0010" =>1,1,0,1,1,0,1;b"0011" =>1,1,1,1,0,0,1;b"0100" =>0,1,1,0,0,1,1;b"0101" =>1,0,1,1,0,1,1;b"0110" =>0,0,1,1,1,1,1;b"0111" =>1,1,1,0,0,0,0;b"1000" =>1,1,1,1,1,1,1;b"1001" =>1,1,1,0,0,1,1;b"1010" =>1,1,1,0,1,1,1;b"1011" =>0,0,1,1,1,1,1;b"1100" =>1,0,0,0,1,1,0;b"1101" =>0,1,1,1,1,0,1;b"1110" =>1,0,0,1,1,1,1;b"1111" =>1,0,0,0,1,1,1;end table;end;整个4位显示译码模块四位显示译码模块。
基于FPGA的数字跑表设计

0 引言在科技高度发展的今天,随着大规模集成电路和计算机的发展,现代电子设计的方法与技术也在不断发生变化。
目前,比较有效的电子设计方法是将板卡设计、可编程逻辑设计和软件开发融合在一起。
而且,计算机的应用与发展已经在人们的日常生活中逐渐崭露头角。
大多数电子产品多是由计算机电路组成,本次设计的课题就是基于计算机电路的时钟脉冲信号、状态控制等原理设计出的数字跑表。
跑表是体育比赛中常用的计时仪器,所以对时间的精确度很高。
1 系统设计1.1 总体设计基于前面的分析,课题数字跑表设计由FPGA器件完成按键控制、数字的显示等核心数字电路的功能。
设计数字跑表,令它通过两个按键来控制计时的开始和结束,一个是清0控制按键,用于设置跑表为初始零状态;另一个是开始/停止控制按键,在清0控制按键无效的时候,按一下开始/停止键则计时器开始计时,再按一下则暂停计时,再按一下则继续计时。
数字跑表总体设计框图如图1所示。
1.2 各部分模块设计根据此设计流程,我们可以将数字跑表的设计分为三个主要部分:(1)分频首先根据FPGA器件的基础时钟,进行时钟的设计,将器件自带的时钟频率进行分频,分频成为课题数字跑表所需的时钟信号,课题要求输入时钟频率为100Hz,100Hz=0.01s,使其满足数字跑表计时精度为10ms的要求,我们已知的FPGA器件上自带的时钟信号为50MHz。
图1 数字跑表的流程框图(2)控制根据要求数字跑表要具有控制功能,通过两个按键控制,一个为清零控制按键,控制异步清零,和启动功能,用于设置跑表为初始零状态,另一个按键为开始/停止按键,控制数字跑表的启动和停止,按一下开始/停止键则计时器开始计时,再按一下则暂停计时,再按一下则继续计时。
(3)显示最后一步,对所得的数据进行处理,并将其显示。
由显示的时分秒用7段数码管显示出来。
将三个部分整合起来放在index, design idea, design scheme, circuit design of the system, design of the corresponding module of the system, system hardware implementation and test results.Keywords: digital stopwatch;FPGA;Verilog HDL language始/暂停按键)输出信号:MSH,MSL,SH,SL,MH,ML(7段数码管)分频部分器件图如图4所示。
基于FPGA的高速时钟数据恢复电路的实现

基于FPGA的高速时钟数据恢复电路的实现0 引言时钟数据恢复电路是高速收发器的核心模块,而高速收发器是通信系统中的关键部分。
随着光纤在通信中的应用,信道可以承载的通信速率已经可以达到GHz,从而使得接收端的接收速率成为限制通信速率的主要瓶颈。
因此高速时钟数据恢复电路的研究是目前通信领域的研究热点。
目前时钟数据恢复电路主要是模拟IC 和数字IC,其频率已经可以达到几十GHz。
而由于FPGA 器件的可编程性、低成本、短的设计周期以及越来越大的容量和速度,在数字领域的应用逐渐有替代数字IC 的趋势,已经广泛作为数字系统的控制核心。
但利用中低端FPGA 还没有可以达到100MHz 以上的时钟数据恢复电路。
由于上面的原因,许多利用FPGA 实现的高速通信系统中必须使用额外的专用时钟数据恢复IC,这样不仅增加了成本,而且裸露在外的高速PCB 布线使还会带来串扰、信号完整性等非常严重的问题。
如果可以在中低端FPGA 上实现高速时钟数据恢复电路,则可降低成本且提高整个电路系统的性能。
目前利用FPGA 实现时钟恢复电路的方法,基本都是首先利用FPGA 内部的锁相环产生N*f 的高频时钟,然后再根据输入信号控制对高速时钟的分频,从而产生与输入信号同步的时钟信号[1~3],其中N 决定了恢复时钟信号的相位精度,通常N 等于8。
因此如果输入信号的频率为100MHz,则系统的工作频率就必须达到800MHz,对于中低端FPGA,如此高的工作频率显然无法承受。
虽然高端FPGA 可以达到GHz 的工作频率,但其高昂的价格不适合用于普通用户。
而其它基于中低端FPGA 实现高速时钟恢复电路的方法,要么需要外部VCO 模块[4],要么只能恢复数据而无法得到同步的时钟信号[5]。
针对这种情况,本文提出了一种利用Altera FPGA 中的锁相环及Logiclock 等技术,实。
基于FPGA的数字跑表设计

摘要:本设计以Xilinx公司的XC3S200A芯片为核心,通过VHDL语言进行编程实现。
在48MHz时钟源输入下,通过分频、计数实现精度为百分之一秒的计时,最终用六位LED数码管显示,并可以通过两个按键控制跑表的复位、停止和启动。
一.引言大多数数字系统使用了两种不同的设计方法。
从硬件的角度来看,发展的动力是提高性能:更快、更小、功耗更低、价格更便宜。
这种方式需要巨额的费用,花费的时间也很长。
但是,从软件的角度看,更倾向于使用一个标准的处理器架构,这样只要开发出应用软件然后下载到这些平台即可。
但是由于对操作系统的需求、编译器的低效率等原因,也会造成大的开销。
结果,作为一种折中的方式,可编程器件就被开发出来了。
它拥有众多的优点:在高性能的平台上进行硬件设计,拥有最优化的资源,不需要操作系统,可重新配置等。
现场可编程门阵列(Field Programmable Gate Array,FPGA)是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物,不但有较高的性能,同时又具备可编程逻辑的灵活性和可重用性。
二.项目任务与设计思路跑表设计指标:1、跑表精度为0.01秒2、跑表计时范围为:1小时3、设置开始计时/停止计时、复位两个按钮4、显示工作方式:用六位BCD八段数码管显示读数。
显示格式:分秒0.01秒设计思路简述:1、按键:两个按键均采用边缘触发,其中复位键按下后将强制归零并屏蔽启停键作用,启停键每次生效将使计数器的开关状态翻转一次。
2、计数:由于原始时钟频率为48MHz,故先对源时钟进行480000进制计数,以产生间隔为1ms的进位信号,对该信号进行计数并进位,可得到百分秒的计数值,以此类推,可得到十分秒、秒、十秒、分、十分的计数值,需要注意的是,对十秒和十分的计数应是六进制的。
3、LED显示:由于LED采用动态显示,位选与段选使用同一个1KHz的时钟信号进行同步。
其中位选信号从低位到高位一次点亮各位数码管,当某位数码管被点亮时,相应的段选信号就会被送至数码管,控制其显示字符。
基于FPGA的设计 正文

引言随着经济和科学技术的发展,电梯在高层建筑物的作用越来越凸出。
目前电梯主要分为机械系统与控制系统两大部份,而电梯的控制系统主要有三种控制方式分别是:继电路控制系统(“早期安装的电梯多位继电器控制系统)、基于FPGA控制系统、微机控制系统。
实现继电路控制系统方法很多,可以用标准逻辑器件、可编程序控制器PLC、单片机等方案来实现。
但是这些方法的功能修改及调试都需要硬件电路的支持,在一定程度上增加了功能修改及系统调试的困难,且该系统由于故障率高、可靠性差、控制方式不灵活以及消耗功率大等缺点,已渐渐被人民淘汰。
微机控制系统虽在智能控制方面有较强的功能,但也存在抗扰性差,系统设计复杂,一般维修人员难以掌握其维修技术等缺陷,没能广泛应用电梯中。
而基于FPGA的电梯控制系统由于可靠性高,使用维修方便,抗干扰性强,设计和调试周期较短等优点,在电梯控制中得到广泛应用,从而使电梯由传统的继电器控制方式发展为计算机控制的一个重要方向,成为当前电梯控制和技术改造的热点之一。
本文给出一个基于FPGA的6层自动升降电梯控制系统的设计方案。
它的设计是采用通俗易懂的Verilog HDL硬件描述语言使用EDA技术在Quartus II软件平台上设计完成,程序设计、编译以及时序仿真通过后再下载到开发板配合外围电路(模拟电梯的电路)来验证该系统的可行性。
这个系统分主要有6个模块,分别是键盘响应寄存处理模块、上升/下降请求寄存处理模块、电梯运行和停止处理模块、开门/关门与延时处理模块、电梯运行方向判断模块和电梯运行状态显示模块。
通过模块化设计不仅提高了程序编程错误的排查能力还提高了系统的可靠性。
1 概论1.1 电梯国内外现状1.1.1国内现状电梯作为中国对外最早的行业经过多年的发展,电梯产品无论在数量和质量都有了显著的提高,和国外产品差距越来越小。
考虑到经济性,现有国内的电梯控制系统,通常采用微机或可编程逻辑控制器对变频器进行多段速控制。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于FPGA的数字时钟的设计课题:基于FPGA的数字时钟的设计学院:电气信息工程学院专业:测量控制与仪器班级: 08测控(2)班**:***学号: ********合作者姓名:颜志林2010 年12 月12 日综述近年来随着数字技术的迅速发展,各种中、大规模集成电路在数字系统、控制系统、信号处理等方面都得到了广泛的应用。
这就迫切要求理工科大学生熟悉和掌握常用中、大规模集成电路功能及其在实际中的应用方法,除通过实验教学培养数字电路的基本实验方法、分析问题和故障检查方法以及双踪示波器等常用仪器使用方法等基本电路的基本实验技能外,还必须培养大学生工程设计和组织实验能力。
本次课程设计的目的在于培养学生对基本电路的应用和掌握,使学生在实验原理的指导下,初步具备基本电路的分析和设计能力,并掌握其应用方法;自行拟定实验步骤,检查和排除故障、分析和处理实验结果及撰写实验报告的能力。
综合实验的设计目的是培养学生初步掌握小型数字系统的设计能力,包括选择设计方案,进行电路设计、安装、调试等环节,运用所学知识进行工程设计、提高实验技能的实践。
数字电子钟是一种计时装置,它具有时、分、秒计时功能和显示时间功能;具有整点报时功能。
本次设计我查阅了大量的文献资料,学到了很多关于数字电路方面的知识,并且更加巩固和掌握了课堂上所学的课本知识,使自己对数字电子技术有了更进一步的认识和了解。
1、课题要求1.1课程设计的性质与任务本课程是电子与信息类专业的专业的专业基础必修课——“数字电路”的配套实验课程。
目的在于培养学生的理论联系实际,分析和解决问题的能力。
通过本课程设计,使学生在理论设计、计算机仿真、指标调测、故障排除等方面得到进一步的训练,加强学生的实践能力。
学生通过设计、仿真、调试、撰写设计报告等过程,培养学生的动手能力和严谨的工作作风。
1.2课程设计的基本技术要求1)根据课题要求,复习巩固数字电路有关专业基础知识;2)掌握数字电路的设计方法,特别是熟悉模块化的设计思想;3) 掌握QUARTUS-2软件的使用方法;4) 熟练掌握EDA工具的使用,特别是原理图输入,波形仿真,能对仿真波形进行分析;5) 具备EDA技术基础,能够熟练使用VHDL语言进行编程,掌握层次化设计方法;6) 掌握多功能数字钟的工作原理,学会不同进制计数器及时钟控制电路的设计方法;7) 能根据设计要求对设计电路进行仿真和测试;8) 掌握将所设计软件下载到FPGA芯片的下载步骤等等。
9) 将硬件与软件连接起来,调试电路的功能。
1.3课程设计的功能要求基本功能:能进行正常的时、分、秒计时功能,分别由6个数码管显示24小时,60分钟,60秒钟的计数器显示。
附加功能:1)能利用硬件部分按键实现“校时”“校分”“清零”功能;2)能利用蜂鸣器做整点报时:当计时到达59’59’’时开始报时,鸣叫时间1秒钟;3)定时闹铃:本设计中设置的是在七点时进行闹钟功能,鸣叫过程中,能够进行中断闹铃工作。
本人工作:负责软件的编程与波形的仿真分析。
2、方案设计与分析1.1设计方案1、时钟功能,具有显示时、分、秒的功能;2、具有整点报时功能,在整点时使用蜂鸣器进行报时,具有闹钟功能,鸣叫过程中,具有中断闹铃功能。
1.2设计要点数字钟一般是由振荡器、分频器、计数器、译码器、显示器等几部分组成。
这些都是数字电路中应用最广泛的基本电路,本设计分模块设计实现各部分功能,采用软件编程控制FPGA芯片内部产生振动周期为1s的脉冲。
并将信号送入计数器进行计算,并把累加的结果以“时”、“分”、“秒”的数字显示出来。
“秒”的显示由两级计数器和译码器组成的六十进制计数电路实现;“分”的显示电路“秒”相同,“时”的显示由两级计数器和译码器组成的二十四进制电路来实现。
所有计时结果由六位数码管显示。
1.3工作原理数字电子钟由振荡器、分频器计数器、译码显示、报时等电路组成。
振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。
秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24翻1”规律计数。
计满后各计数器清零,重新计数。
计数器的输出分别经译码器送数码管显示,计时出现误差时,可以用校时电路“校时”“校分”“清零”。
秒脉冲可以通过分频电路得到。
通过报时设计模块可以实现整点报时及定时闹铃,译码显示由七段译码器完成,显示由数码管构成,采用的是动态显示方式。
数码管动态显示:动态扫描电路将计数器输出的8421BGD码转换为数码管需要的逻辑状态,并且输出数码管的片选信号和为选信号。
所谓动态扫描显示方式是在显示某一位LED 显示块的数据的时候,让其它位不显示,然后再显示下一位的数据。
只要保证每一位显示的时间间隔不要太大,利用人眼的视觉暂留的现象,就可以造成各位数据同时显示的假象。
一般每一位的显示时间为1~10ms。
3、单元电路的设计,仿真与分析(1)分频模块(fenpin)1)程序:library ieee;use ieee.std_logic_1164.all;entity fenpin isport(clk6:in std_logic;q1000,q5,q1:out std_logic);end fenpin;architecture ccc_arc of fenpin issignal x:std_logic;beginprocess(clk6)variable cnt:integer range 0 to 24999; beginif clk6'event and clk6='1' thenif cnt<24999 thencnt:=cnt+1;elsecnt:=0;x<=not x;end if;end if;end process;q1000<=x;process(x)variable cnt2:integer range 0 to 999; variable y:std_logic;beginif x'event and x='1' thenif cnt2<999 thencnt2:=cnt2+1;q1<='0';elsecnt2:=0;q1<='1';end if;end if;if x'event and x='1' theny:=not y;end if;q5<=y;end process;end ccc_arc;2)仿真波形:3)仿真结果分析:产生用于计时,扫描输入,扫描显示,以及蜂鸣器所需的各个频率的信号。
(2)秒模块(second)1)程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity second isport (clk1,en1:in std_logic;qa:out std_logic_vector(3 downto 0);co1:out std_logic;qb:out std_logic_vector(3 downto 0));end second;architecture cc of second issignal cout2,cout1:std_logic_vector(3 downto 0);signal mm: std_logic;beginprocess(clk1,en1)beginif en1='1' thencout2<="0000";cout1<="0000";elsif (clk1'event and clk1='1')thenif (cout2=1 and cout1=8) then cout2<=cout2;cout1<=cout1+1;mm<='1'; elsif (cout2=1 and cout1=9) then cout2<="0000";cout1<="0000";mm<='0'; else if (cout1=9) then cout2<=cout2+1;cout1<="0000";mm<='0';else cout2<=cout2;cout1<=cout1+1;mm<='0';end if;end if;end if;end process;co1<=mm;qa<=cout2;qb<=cout1;end cc;2)仿真波形:3)仿真结果分析:该模块实际是一个六十进制计数器,而六十秒为一分钟,故用此模块可以作为秒部分设计,通过观察可知,仿真波形是正确可行的。
(3)分模块(minute)1)程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity minute isport (clk2,en2:in std_logic;qc:out std_logic_vector(3 downto 0);co2:out std_logic;qd:out std_logic_vector(3 downto 0));end minute;architecture bb of minute issignal cout2,cout1:std_logic_vector(3 downto 0);signal cc:std_logic;beginprocess(clk2,en2)beginif en2='1' thenif (clk2'event and clk2='1')thenif (cout2=1 and cout1=8) then cout2<=cout2;cout1<=cout1+1;cc<='1'; elsif (cout2=1 and cout1=9) then cout2<="0000";cout1<="0000";cc<='0'; else if (cout1=9) then cout2<=cout2+1;cout1<="0000";cc<='0';else cout2<=cout2;cout1<=cout1+1;cc<='0';end if;end if;end if;end if;end process;co2<=cc;qc<=cout2;qd<=cout1;end bb2)仿真波形:3)仿真结果分析:此模块实际也是一个六十进制的计数器模块,六十分钟即为一个小时,用此模块就成功解决了分设计模块这个难题。