基于FPGA多功能数字钟设计.doc

上传人:仙人指路1688 文档编号:4148231 上传时间:2023-04-07 格式:DOC 页数:22 大小:316.50KB
返回 下载 相关 举报
基于FPGA多功能数字钟设计.doc_第1页
第1页 / 共22页
基于FPGA多功能数字钟设计.doc_第2页
第2页 / 共22页
基于FPGA多功能数字钟设计.doc_第3页
第3页 / 共22页
基于FPGA多功能数字钟设计.doc_第4页
第4页 / 共22页
基于FPGA多功能数字钟设计.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《基于FPGA多功能数字钟设计.doc》由会员分享,可在线阅读,更多相关《基于FPGA多功能数字钟设计.doc(22页珍藏版)》请在三一办公上搜索。

1、基于FPGA多功能数字钟设计摘 要EDA技术在电子系统设计领域越来越普及,本设计主要利用VHDL和C语言在FPGA实验板上设计一个电子数字钟,总的程序由几个各具不同功能的单元模块程序拼接而成,其中包括分频程序模块、时分秒计数模块、处理器及外设模块,并且使用QuartusII运用VHDL语言对分频和计数两个模块进行硬件电路设计和电路波形仿真,该设计采用自顶向下、在Quarnls开发平台下实现数字钟的设计、下载和调试。本设计采用的VHDL是一种全方位的硬件描述语言,具有极强的描述能力,能支持系统行为级、寄存器传输级和逻辑门级这三个不同层次的设计;支持结构、数据流、行为三种描述形式的混合描述,覆盖面

2、广,抽象能力强,因此在实际应用中越来越广泛。ASIC是专用的系统集成电路,是一种带有逻辑处理的加速处理器;而FPGA是特殊的ASIC芯片,与其它的ASIC芯片相比,它具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及可实时在线检测等优点。在控制系统中,键盘是常用的输入设备,系统应当根据键盘的输入来完成相应的功能。因此,按键信息输入是与软件结构密切相关的过程。根据键盘结构的不同,采用不同的编码方法,但无论有无编码以及采用什么样的编码,最后都要转换成为相应的键值,以实现按键功能程序的转移。1钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能

3、。诸如定时自动报警、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些都是以钟表数字化为基础的。因此研究数字钟以及扩大其应用有着非常现实的意义。目 录1 前 言12 总体方案设计 X2.1 项目设计要点2.2 方案论述2.3 软件介绍2.4 芯片介绍3 单元电路设计3.1 分频模块设计3.2 计时功能模块设计4 系统功能及功能仿真4.1 系统功能4.2功能仿真各个模块的仿真波形5 设计总结6 参考文献附录:完整实验程序1.前言现代社会的标志之一就是信息产品的广泛使用,而且是产品的性能越来越强,复杂程度越来越高,更新步伐越来越快。支撑信息电子产品高速发展的基础就是微

4、电子制造工艺水平的提高和电子产品设计开发技术的发展。前者以微细加工技术为代表,而后者的代表就是电子设计自动化(electronic design automatic, EDA)技术。EDA技术以大规模可编程逻辑器件为设计载体,以硬件描述语言为系统逻辑描述主要表达方式,以计算机和大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,自动完成用软件的方式设计的电子系统到硬件系统的逻辑编译、逻辑化简、逻辑分割、逻辑映射、编程下载等工作,最终形成集成电子系统或专用集成芯片的一门新技术。本设计是利用VHDL硬件描述语言结合可编程逻辑器件进行的,并通过数码管静态显示走时结果。数字钟可以由各种技术实现,如

5、单片机等。利用可编程逻辑器件具有其它方式没有的特点,它具有易学、方便、新颖、有趣、直观,设计与实验成功率高、理论与实践结合紧密、积小、量大、/O口丰富、编程和加密等特点,并且它还具有开放的界面、丰富的设计库、模块化的工具以及LPM定制等优良性能,应用非常方便。因此,本设计采用可编程逻辑器件实现。2.总体方案设计2.1数字钟的功能要点 (1)以数字形式显示时、分、秒; (2)小时记数为24小时进制 (3)分秒进制为60进制 (4)扩展功能:定时闹钟、整点报时2.2 方案框图 系统组成框图,如下图所示: 电路的两种工作状态:1.分为正常时钟模块2.设置时间模块控制按键用来选择是正常计数还是调整时间

6、并决定调整时、分、秒;置数按键按下时,表示相应的调整块要加一;基准时钟是1HZ;计数器是对1HZ的频率计数;动态显示模块是对计数器的计数进行译码,送到数码管进行显示 。2.3 软件介绍 本设计采用Quartus II软件编写所需程序。Quartus II 是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。 Quartus II可以在XP、Linux以及Unix上使用,除了可以使

7、用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。 Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。 此外,Quartus II 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于

8、一体,是一种综合性的开发平台。 Maxplus II 作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。目前Altera已经停止了对Maxplus II 的更新支持,Quartus II 与之相比不仅仅是支持器件类型的丰富和图形界面的改变。Altera在Quartus II 中包含了许多诸如SignalTap II、Chip Editor和RTL Viewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了Maxplus II 友好的图形界面及简便的使用方法。 Altera Quartus II 作为一种可编程逻辑的设计环境, 由于其强大的设计能

9、力和直观易用的接口,越来越受到数字系统设计者的欢迎。 Altera的Quartus II可编程逻辑软件属于第四代PLD开发平台。该平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。Quartus平台与Cadence、ExemplarLogic、 Mentor Graphics、Synopsis和Simplicity等EDA供应商的开发工具相兼容。改进了软件的LogicLock模块设计功能,增添 了FastFit编译选项,推进了网络编辑性能,而且提升了调试能力。支持MAX7000/MAX3000等乘积项器件2.4 芯片介绍 FPGA(FieldProgrammabl

10、e Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。 FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。 现场可编程门阵列(FPGA)是可编程器件。与传统逻辑电路和门阵列(如PAL,GA

11、L及CPLD器件)相比,FPGA具有不同的结构,FPGA利用小型查找表(161RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能,FPGA允许无限次的编程. FPGA电源要求输出电压范围从1.2V到5V,输出电流范围从数十毫安到数安培。可用三种电

12、源:低压差(LDO)线性稳压器、开关式DC-DC稳压器和开关式电源模块。最终选择何种电源取决于系统、系统预算和上市时间要求。 如果电路板空间是首要考虑因素,低输出噪声十分重要,或者系统要求对输入电压变化和负载瞬变做出快速响应,则应使用LDO稳压器。LDO功效比较低(因为是线性稳压器),只能提供中低输出电流。输入电容通常可以降低LDO输入端的电感和噪声。LDO输出端也需要电容,用来处理系统瞬变,并保持系统稳定性。也可以使用双输出LDO,同时为VCCINT和VCCO供电。 如果在设计中效率至关重要,并且系统要求高输出电流,则开关式稳压器占优势。开关电源的功效比高于LDO,但其开关电路会增加输出噪声

13、。与LDO不同,开关式稳压器需利用电感来实现DC-DC转换。3 单元电路设计3.1分频模块设计系统需要1Hz的频率来驱动计时器,而实验箱上可提供多种不同的频率,如系统时钟20MHz和SW7提供的可选择频率,请根据需要自行选择频率,并进行分频,形成1Hz频率。晶体震荡器U7提供40M时钟脉冲,通过EPM3064分频为0.1Hz,1Hz,10Hz,100Hz,1K,10K,100K,1M,10M,40M。十组时钟信号,由指拨旋转开关SW7(GCLK1)选择输出频率。3.2计时功能模块设计计时模块需对时、分、秒进行计数,其中小时位为24进制,分钟和秒钟位为60进制。可以用一段程序对时、分、秒进行连续

14、计数,也可以对时、分、秒的高位和低位分别计数。注意,如果采用连续计数方式,因为每位显示时有高位和低位之分,所以需将十进制数据用BCD码进行转换后,才能输出到七段数码管上显示。1秒计数模块核心程序如下:ENTITY second ISPORT(clk_1s : IN STD_LOGIC;os : OUT STD_LOGIC);END second;ARCHITECTURE sec_architecture OF second ISBEGINk1:process(clk_1s)variable count:integer range 0 to 100:=0;beginif rising_edge(

15、clk_1s) thenif count=59 thenos=1;count:=0;elseos=0;count:=count+1;end if;end if;end process k1;2.分低位计数模块核心程序如下:ENTITY ml ISPORT(clk_1s : IN STD_LOGIC;iset : IN STD_LOGIC;iset_addr : IN STD_LOGIC_VECTOR(3 DOWNTO 0);addr_1s : OUT STD_LOGIC_vector(3 downto 0);os : OUT STD_LOGIC);END ml;ARCHITECTURE ml_

16、architecture OF ml ISBEGINk1:process(clk_1s,iset)variable count:integer range 0 to 10:=0;beginif iset=0 thencount:=CONV_INTEGER(iset_addr);addr_1s=iset_addr;elsif rising_edge(clk_1s) thenif count=9 thenos=1;count:=0;addr_1s=CONV_STD_LOGIC_VECTOR(count,4);elseos=0;count:=count+1;addr_1s=CONV_STD_LOGI

17、C_VECTOR(count,4);end if;end if;end process k1;END ml_architecture;说明:对于分高位计数模块的程序,只需将上面程序中的count=9改成count=6即可。3.小时低位计数模块核心程序如下:ENTITY hl ISPORT(clk_1s : IN STD_LOGIC;iset : IN STD_LOGIC;flag : IN STD_LOGIC;iset_addr : IN STD_LOGIC_VECTOR(3 DOWNTO 0);addr_1s : OUT STD_LOGIC_vector(3 downto 0);os : O

18、UT STD_LOGIC);END hl;ARCHITECTURE hl_architecture OF hl ISBEGINk1:process(clk_1s,iset)variable count:integer range 0 to 10:=0;beginif iset=0 thencount:=CONV_INTEGER(iset_addr);addr_1s=iset_addr;elsif rising_edge(clk_1s) thenif flag=1 thenif count=3 thenos=1;count:=0;addr_1s=CONV_STD_LOGIC_VECTOR(cou

19、nt,4);elseos=0;count:=count+1;addr_1s=CONV_STD_LOGIC_VECTOR(count,4);end if;elseif count=9 thenos=1;count:=0;addr_1s=CONV_STD_LOGIC_VECTOR(count,4);elseos=0;count:=count+1;addr_1s=CONV_STD_LOGIC_VECTOR(count,4);end if;end if;end if;end process k1;END hl_architecture;4.小时高位计数模块核心程序如下:ENTITY hh ISPORT

20、(clk_1s : IN STD_LOGIC;iset : IN STD_LOGIC;iset_addr : IN STD_LOGIC_VECTOR(3 DOWNTO 0);addr_1s : OUT STD_LOGIC_vector(3 downto 0);flag: OUT STD_LOGIC);END hh;ARCHITECTURE hh_architecture OF hh ISBEGINk1:process(clk_1s,iset)variable count:integer range 0 to 2:=0;beginif iset=0 thencount:=CONV_INTEGER

21、(iset_addr);addr_1s=iset_addr;if count=2 thenflag=1;else flag=0;end if;elsif rising_edge(clk_1s) thenif count=2 thenflag=0;count:=0;addr_1s=CONV_STD_LOGIC_VECTOR(count,4);elsif count=1 thenflag=1;count:=count+1;addr_1s=CONV_STD_LOGIC_VECTOR(count,4);elseflag=0;count:=count+1;addr_1s=CONV_STD_LOGIC_V

22、ECTOR(count,4);end if;end if;end process k1;END hh_architecture;3.3状态转换功能模块该模块实现电路各状态之间的转换功能,若仅完成基本功能,系统应包含4个状态,分别为正常计时、对秒位进行设置、对分位进行设置和对小时位进行设置。若完成扩展功能,还可增加其他状态。这部分可以用脉冲键输入进行切换,也可以用拨动开关进行切换。根据所选择的切换方式,自行编写程序。3.4译码功能模块此模块功能将计数器产生的数值,通过编译,形成对应七段数码管显示格式的编码。七段数码管的a-g对应实验箱上的主要引脚为O50-O56。核心程序如下:ENTITY dr

23、ive IS PORT (clk:in std_logic;addr : IN STD_LOGIC_vector(3 downto 0); led : OUT STD_LOGIC_vector(7 downto 0); END drive; ARCHITECTURE behave OF drive IS SIGNAL sel:STD_LOGIC_vector(3 downto 0); BEGIN process(clk)begin selledledledledledledledledledledled=10111111; end case; end process; end behave;3

24、.5校时功能模块此模块主要在状态切换到设置时,可以将时、分、秒位设置成需要的数值,此功能可以由脉冲键输入完成。1.分低位按键控制核心程序如下:ENTITY addram ISPORT(inkey : IN STD_LOGIC;oaddr : OUT STD_LOGIC_VECTOR(3 downto 0);END addram;ARCHITECTURE addram_architecture OF addram ISsignal count:std_logic_vector(3 downto 0);BEGINoaddr=count;k1:process(inkey)beginif rising

25、_edge(inkey) thencount=count+1;if count=9 thencount=0000;end if;end if;end process k1;END addram_architecture;说明:每按键一次,即每当inkey的上升沿到来时,count加一,当count等于9的时候,作为分的低位,将0赋值于count,在此过程中,随时将十进制数的count的值的8421码作为oaddr的信号。对于分的高位,仅将程序中的count=9改成count=5即可;对于小时的高位,仅将程序中的count=9改成count=2即可。2.小时低位按键控制核心程序如下:ENTITY

26、 addram3 ISPORT(inkey : IN STD_LOGIC;flag : IN STD_LOGIC;oaddr : OUT STD_LOGIC_VECTOR(3 downto 0);END addram3;ARCHITECTURE addram3_architecture OF addram3 ISsignal count:std_logic_vector(3 downto 0);BEGINoaddr=count;k1:process(inkey,flag)beginif rising_edge(inkey) thenif flag=1 thenif count=3 thenco

27、unt=0000;elsecount=count+1;end if;elsecount=count+1;if count=9 thencount=0000;end if;end if;end if;end process k1;END addram3_architecture;说明:当flag为高电平时,即小时高位为2,小时低位只能在0到3之间变动;当flag为低电平时,即小时高位为1,小时低位可以在0到9之间变动。4系统功能及功能仿真4.1 系统功能1基本功能以数字形式显示时、分、秒;小时计数器为24进制;分、秒计数器为60进制。2扩展功能定时闹钟整点报时4.2功能仿真各个模块的仿真波形分频

28、模块仿真图秒计数模块波形仿真图4.18 整点报时模块波形仿真5.设计总结这是我们大学四年里的最后一门课程设计丶即将毕业的我们丶有很多同学都陆续有了工作丶在校的学生也不是很多丶感觉最后一学期放松了很多丶但是该在学校完成的任务还是要一如既往的完成好。此次课程设计丶我们所设计是一个基于FPGA多功能的数字钟设计丶在为期3周的过程中丶或多或少的学到了一些东西。其整个过程都是对上学期EDA课程学习的实践演示及拓展丶更加充实了我对EDA的了解。在培养自己动手能力的同时,也暴露了很多问题。例如,当程序下载到实验箱上后,数码管显示全部为零且计数器不工作,经分析得知程序中的总的清零信号保持有效状态,改动程序后计

29、数器开始计数。通过查阅书籍丶询问老师丶同学之间的互相帮助,也慢慢的解决了相应的问题,培养了我们虚心求教丶团结互助的精神。通过这次课程设计,综合运用了笨专业所学的课程理论知识和实际知识进行数字钟设计工作的实际训练从而培养了自身的学习能力,巩固与扩充了数字电路,EDA等课程的学习内容。掌握了数字钟的设计方法及步骤,掌握数字钟设计的基本功能,懂得了怎样分析电路的模块及作用,怎样确定工作的步骤及方法,熟悉了规范和标准,这为我以后的学习机工作奠定了良好的基础。参考文献1.潘松,黄继业.EDA技术使用教程.科学出版社.2006.92.林明权,VHDL数字控制系统设计范例.电子工业出版社.2003.013

30、崔葛,基于FPGA的数字电路系统设计,西安电子科技大学出版社,20084 王开军,姜宇柏,面向CPLD/FPGA的VHDL设计,机械工业出版社,20075 毕满清,电子技术实验与课程设计,机械工业出版社,2005附录:完整实验程序 1)主程序模块:Library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity clock is port( mode, set, clr, clk :in std_logic; seg7, segctr :out std_logic_vector(7 downto 0)

31、 );end entity;ARCHITECTURE arch OF Clock IS signal state: std_logic_vector(1 downto 0); signal Hour, Min, Sec: std_logic_vector(5 downto 0); signal BCDH, BCDM, BCDS: std_logic_vector(7 downto 0); signal segDat: std_logic_vector(3 downto 0); signal blink: std_logic_vector(2 downto 0); signal set_reg,

32、 blink_clk: std_logic; component BCD port(DataIn : in std_logic_vector(5 downto 0); BCDOut : out std_logic_vector(7 downto 0) ); end component;BEGIN process(mode) begin if (clr=1) then state=00; else if (modeevent and mode=1) then state blink blinkblink_clk, others=0); when 10 = blinkblink_clk, othe

33、rs=0); when 11 = blinkblink_clk, others=0); end case; end process; process(clk) variable blink_cnt: std_logic_vector(13 downto 0); begin if (clr=1) then blink_clk0); else if (clkevent and clk=1) then if (blink_cnt=11000011010011) then blink_cnt:=(others=0); blink_clk=not blink_clk; else blink_cnt:=b

34、link_cnt+1; end if; end if; end if; end process; process(clk, state) variable clk_cnt: std_logic_vector(16 downto 0); begin if (clr=1) then Hour=000000; Min=000000; Sec0);set_reg if (clk_cnt=11000011010011111) then clk_cnt:=(others=0); if (Sec=59) then Sec0); if (Min=59) then Min0); if (Hour=23) the

35、n Hour0); else Hour=Hour+1; end if; else Min=Min+1; end if; else Sec if (set=1) then if set_reg=0 then set_reg=1; if (Hour=23) then Hour0); else Hour=Hour+1; end if; end if; else set_reg if (set=1) then if set_reg=0 then set_reg=1; if (Min=59) then Min0); else Min=Min+1; end if; end if; else set_reg

36、 if (set=1) then if set_reg=0 then set_reg=1; if (Sec=59) then Sec0); else Sec=Sec+1; end if; end if; else set_reg0); segCtr0); else if (clkevent and clk=1) then cnt:=cnt+1; case cnt is when 000 = segDat=BCDH(7 downto 4) or (blink(2) & blink(2) & blink(2) & blink(2); segctr segDat=BCDH(3 downto 0) or (blink(2) & blink(2) & blink(2) & blink(2); segctr segDat=1010; segctr segDat=BCDM(7 downto 4)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号