现代科技电子钟课程设计.doc

上传人:牧羊曲112 文档编号:3919240 上传时间:2023-03-27 格式:DOC 页数:29 大小:2.55MB
返回 下载 相关 举报
现代科技电子钟课程设计.doc_第1页
第1页 / 共29页
现代科技电子钟课程设计.doc_第2页
第2页 / 共29页
现代科技电子钟课程设计.doc_第3页
第3页 / 共29页
现代科技电子钟课程设计.doc_第4页
第4页 / 共29页
现代科技电子钟课程设计.doc_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《现代科技电子钟课程设计.doc》由会员分享,可在线阅读,更多相关《现代科技电子钟课程设计.doc(29页珍藏版)》请在三一办公上搜索。

1、太原理工大学现代科技学院 EDA技术与FPGA应用设计 课程设计 设计名称 数字电子钟 专业班级 学 号 姓 名 指导教师 张 博 太原理工大学现代科技学院专业班级学生姓名课程名称EDA技术与FPGA应用设计设计名称数字电子钟设计周数1.5指导教师张博设计任务主要设计参数设计一个电子钟,具体要求如下: (1) 具有时、分、秒计数显示功能,以24小时循环计时; (2) 具有清零、校时、校分功能; (3) 具有整点蜂鸣器报时功能。 设计内容设计要求(1)根据选题要求,进行方案比较,画出系统框图; (2)使用VHDL语言描述各单元电路; (3)利用Quartus II 10.0软件对单元电路进行编译

2、、仿真、引脚锁定、下载调试; (4)撰写课程设计任务书。 主要参考资 料1 张文爱.EDA技术与FPGA应用设计.电子工业出版社, 2013. 2 贾秀美. 数字电路硬件设计实践. 高等教育出版社, 2008 学生提交归档文件课程设计说明书,主要包括以下内容: (1)设计方案,系统框图,原理分析; (2)系统各模块的VHDL源程序; (3)综合、编程部分,包括各模块的综合结果、仿真分析,系统管脚定义,下载验证结果; (4)设计总结部分,指出设计系统的特点及选用方案优缺点,提出改进意见及展望,总结设计收获、体会; (5)参考文献。 课程设计任务书注:1.课程设计完成后,学生提交的归档文件应按照:

3、封面任务书说明书图纸的顺序进行装订上交(大张图纸不必装订) 2.可根据实际内容需要续表,但应保持原格式不变。指导教师签名: 日期: 2016.06.08 装订线专业班级 学号 姓名 成绩 数 字 电 子 钟一、设计名称: 数字电子钟的实现 二、设计要求:设计一个电子钟,具体要求如下: (1) 具有时、分、秒计数显示功能,以24小时循环计时; (2) 具有清零、校时、校分功能; (3) 具有整点蜂鸣器报时功能。 三、设计内容: (1)根据选题要求,进行方案比较,画出系统框图; (2)使用VHDL语言描述各单元电路; (3)利用Quartus II 10.0软件对单元电路进行编译、仿真、引脚锁定、

4、下载调试; (4)撰写课程设计任务书。 四、CPLD介绍:(1)FPGA(FieldProgrammable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interco

5、nnect)三个部分。 现场可编程门阵列(FPGA)是可编程器件。与传统逻辑电路和门阵列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的结构,FPGA利用小型查找表161RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能,FPGA允许无

6、限次的编程。 五、 电子钟总体设计方案:本时钟系统主要由分频器、计数、译码、显示、校时以及闹钟等功能。由于分频器从50MHZ晶振中得到1HZ信号给计数器提供标准时钟,译码器将计数器数据译码数码管能显示的信号,显示模块扫描译码器数据并显示。由于计数的起始时间不可能与标准时间一致,所以需要加入一个分频程序。1.分频程序先后采用过两种方式:(1)signal count : integer;-分频内部时钟process(clk)-分频程序beginif (clkevent and clk=1) thenif(count=N-1)thencount=conv_integer(0);elsecount=

7、count+1;if count(integer(N/2)thenclk1=0;elseclk1=1;end if;end if;end if;end process;这种分频程序可调,但是应用于开发板写入之后发现计数器在十几秒内无响应,十几秒之后正常计数,所以采用了进位时钟,见第二个。(2)signal cnt : std_logic_vector(25 downto 0);process(rst,clk)beginif rst=0 thencnt0);elsif clkevent and clk=1 thencnt=cnt+1;end if;end process;clk1=cnt(24)

8、;这个是应用于分频的分频程序模块,测试结果良好。此分频没有严格分频至1秒种,要求严格可以进一步深入编辑。2.计数模块signal sz_h,sz_l: std_logic_vector(3 downto 0);-内部小时BCDsignal fz_h,fz_l: std_logic_vector(3 downto 0);-内部分钟BCDsignal mz_h,mz_l: std_logic_vector(3 downto 0);-内部秒钟BCDsignal gongneng:std_logic_vector(2 downto 0);-功能控制process(clk1,gongneng,rst)-

9、秒针BCDbeginif rst=0 then-复位有效mz_h=0000;mz_l=0000;elsif kz_1=1 then-调整秒针低位控制按钮mz_l=a;elsif kz_2=1 then-调整秒针高位控制按钮mz_h=a;elsif (gongneng=000 and (clk1event and clk1=1) thenif mz_l=9 then if mz_h=5 thenmz_h=0000; else mz_h=mz_h+1; end if;mz_l=0000;else mz_l=mz_l+1;end if; end if;end process;以上一部分为秒针的计数器

10、模块,通过IF嵌套将复位信号、秒针计数、及置位模块并入同一进程,因为信号不能不在多个进程被赋值,所以只能集成如同一进程。process(clk1,gongneng,rst)-分针BCDbeginif rst=0 then-复位有效fz_h=0000;fz_l=0000;elsif kz_3=1 then-分钟低位置数fz_l=a;elsif kz_4=1 then-分钟高位置数fz_h=a;elsif gongneng=000 thenifclk1event and clk1=1 thenif(mz_l=9 and mz_h=5) thenif fz_l=9 then if fz_h=5 th

11、enfz_h=0000; else fz_h=fz_h+1; end if;fz_l=0000;else fz_l=fz_l+1;end if; end if;end if;end if;end process;process(clk1,gongneng,rst)-时针BCDbeginif rst=0 then-复位控制sz_h=0000;sz_l=0000;elsif kz_5=1 then-时针低位控制sz_l=a;elsif kz_6=1 then-时针高位控制sz_h=a;elsif gongneng=000 then if clk1event and clk1=1 thenif(fz

12、_l=9 and fz_h=5 and mz_l=9 and fz_h=5) thenif(sz_h=2 and sz_l=3)thensz_h=0000;sz_l=0000;elsif sz_l=9 thensz_l=0000; sz_h=sz_h+1; elsesz_l miao_h miao_h miao_h miao_h miao_h miao_h miao_h miao_h miao_h miao_h null;end case;end process;因为实验箱电路板提供的是共阳数码管,所以为低位有效,将进程中的敏感信号切换即可显示各模块的时间显示。4. 功能调整模块jz_0:in

13、 std_logic;-校正开关signal gn:std_logic_vector(2 downto 0);-内部功能计数signal gongneng:std_logic_vector(2 downto 0);-功能控制计数以便拓展 -这里只用到1为调位,0process(jz_0)-功能计数beginif(jz_0event and jz_0=1)then if gn=001 then -此处可选功能增加或减少功能gn=000; elsegn=gn+1; end if;end if;gongneng=gn;end process;以上为功能调整模块,例如本例中想通过000控制正常计数,而

14、001时停止计数,开始调整,此处选择001返回000是因为校时分秒采用了单独的置位开关,所以功能只有停止和计数两种模式。在附录中提供集成功能控制的校时程序。5. 校正时间输入调整模块clk_tz :in std_logic;-单独的时间调整按钮process(clk_tz,gongneng)-校正时间调整beginif gongneng=001 then if clk_tzevent and clk_tz=1then if a=9 then a=0000;elsea=a+1;end if;end if;end if;end process;此段程序虽然可以实现置数校时,但是例如分秒高位最高只有

15、5所以改进程序如下:process(clk_tz)beginif gongneng/=000 then if clk_tzevent and clk_tz=1then if kz_1=1 or kz_3=1 or kz_5=1thenif a=9 then a=0000;elsea=5 then a=0000;elsea4 and a=1 then a2 thena=0000;elsea=a+1;end if;end if; end if;end if;end process;这样就不会出现调整高位时间溢出的问题。6. 在实验过程中还加入了便于观察和研究的校时单独显示模块。process(go

16、ngneng,a)-调整显示beginif gongneng=000 then-正常计数时校时显示不显示ts_xs ts_xs ts_xs ts_xs ts_xs ts_xs ts_xs ts_xs ts_xs ts_xs ts_xs null;end case;end if;end process;7. 整点报时signal b:std_logic_vector(2 downto 0);-控制闪烁时间process(gongneng,clk1,fz_l,fz_h,mz_h,mz_l)-蜂鸣器(灯光代替)beginif b=5 then b=000;baoshi=0;elsif(clk1eve

17、nt and clk1=1) then if(gongneng=000 and fz_l=9 and fz_h=5 and mz_l=9 and mz_h=5) thenb=000;baoshi=1;end if;b=b+1;end if;end process;此程序选择灯光亮5秒即可,具体亮闪时间可由自己调整决定,程序中if语句中有时分高低位加功能控制一共5个满足才灯光亮,实际测试中发现偶尔会出现部分整点不亮灯光,仔细判断发现是if语句中判断先后问题引起的,目前没有找到较好的解决办法。8. 按键消抖程序signal count:integer range 0 to 3; signal jz

18、_0_0:std_logic;process(clk1) begin if(clk1event and clk1=1) then -if(jz_0=1)then -if(count=3)then count=count;- else count=count+1; -end if; if(count=2)then cp=1;else cp=0; end if; else count=0;end if; end if; jz_0_0=cp;end process; 这个主要是缓解调时及功能选择时按键抖动的问题,在实际的应用中相当重要。六、 设计电子钟完整程序这段程序为便于调查观察各部分功能的程序,

19、精简后的完整程序见附录。library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity dianzizhong isGENERIC (N:integer:=50000000);-N为分频数port(rst :in std_logic;-复位按钮clk_tz :in std_logic;-功能调整时分秒按钮jz_0:in std_logic;-校正开关(JZ=1时校时)kz_1:in std_logic;-校正秒低位开关kz_2:in std_

20、logic;-校正秒高位开关kz_3:in std_logic;-校正分低位开关kz_4:in std_logic;-校正分高位开关kz_5:in std_logic;-校正时低位开关kz_6:in std_logic;-校正时高位开关clk: in std_logic; -输入时钟50MHzshi_h :out std_logic_vector(6 downto 0);-时高位shi_l :out std_logic_vector(6 downto 0);-时低位fen_h :out std_logic_vector(6 downto 0);-分高位fen_l :out std_logic_

21、vector(6 downto 0);-分低位miao_h :out std_logic_vector(6 downto 0);-秒高位miao_l :out std_logic_vector(6 downto 0);-秒低位ts_xs :out std_logic_vector(6 downto 0);-调整时钟时显示(便于观察)baoshi :out std_logic -报时灯光(没有蜂鸣器用灯光代替) );end dianzizhong;architecture dzz of dianzizhong issignal sz_h,sz_l: std_logic_vector(3 down

22、to 0);-内部小时BCDsignal fz_h,fz_l: std_logic_vector(3 downto 0);-内部分钟BCDsignal mz_h,mz_l: std_logic_vector(3 downto 0);-内部秒钟BCDsignal clk1:std_logic;-分频后时钟signal gongneng:std_logic_vector(2 downto 0);-功能控制计数以便拓展 -这里只用到1为调位,0为计数signal count : integer;-分频内部时钟signal gn:std_logic_vector(2 downto 0);-内部功能计数

23、signal a:std_logic_vector(3 downto 0);-校时显示端signal b:std_logic_vector(2 downto 0);-控制报时灯时间beginprocess(clk_tz)-校正时间调整beginif gongneng/=000 then if clk_tzevent and clk_tz=1then if kz_1=1 or kz_3=1 or kz_5=1thenif a=9 then a=0000;elsea=5 then a=0000;elsea4 and a=1 then a2 thena=0000;elsea=a+1;end if;e

24、nd if; end if;end if;end process;process(rst,clk)-分频程序beginif rst=0 thencnt0);elsif clkevent and clk=1 thencnt=cnt+1;end if;end process;clk1=cnt(24);process(jz_0)-功能计数beginif(jz_0event and jz_0=1)then if gn=001 then gn=000; elsegn=gn+1; end if;end if;gongneng=gn;end process;process(clk1,gongneng,rst

25、)-秒针BCDbeginif rst=0 thenmz_h=0000;mz_l=0000;elsif kz_1=1 thenmz_l=a;elsif kz_2=1 thenmz_h=a;elsif (gongneng=000 and (clk1event and clk1=1) thenif mz_l=9 then if mz_h=5 thenmz_h=0000; else mz_h=mz_h+1; end if;mz_l=0000;else mz_l miao_h miao_h miao_h miao_h miao_h miao_h miao_h miao_h miao_h miao_h n

26、ull;end case;end process;process(mz_l)-秒针低位显示begincase mz_l iswhen 0000 = miao_l miao_l miao_l miao_l miao_l miao_l miao_l miao_l miao_l miao_l null;end case;end process;process(clk1,gongneng,rst)-分针BCDbeginif rst=0 thenfz_h=0000;fz_l=0000;elsif kz_3=1 thenfz_l=a;elsif kz_4=1 thenfz_h=a;elsif gongne

27、ng=000 thenifclk1event and clk1=1 thenif(mz_l=9 and mz_h=5) thenif fz_l=9 then if fz_h=5 thenfz_h=0000; else fz_h=fz_h+1; end if;fz_l=0000;else fz_l fen_h fen_h fen_h fen_h fen_h fen_h fen_h fen_h fen_h fen_h null;end case;end process;process(fz_l) -分针低位显示begincase fz_l iswhen 0000 = fen_l fen_l fen

28、_l fen_l fen_l fen_l fen_l fen_l fen_l fen_l null;end case;end process;process(clk1,gongneng,rst)-时针BCDbeginif rst=0 thensz_h=0000;sz_l=0000;elsif kz_5=1 thensz_l=a;elsif kz_6=1 thensz_h=a;elsif gongneng=000 then if clk1event and clk1=1 thenif(fz_l=9 and fz_h=5 and mz_l=9 and fz_h=5) thenif(sz_h=2 a

29、nd sz_l=3)thensz_h=0000;sz_l=0000;elsif sz_l=9 thensz_l=0000; sz_h=sz_h+1; elsesz_l shi_h shi_h shi_h shi_h shi_h shi_h shi_h shi_h shi_h shi_h null;end case;end process;process(sz_l)-时钟低位显示begincase sz_l iswhen 0000 = shi_l shi_l shi_l shi_l shi_l shi_l shi_l shi_l shi_l shi_l null;end case;end pro

30、cess;process(gongneng,a)-调整功能显示beginif gongneng=000 thents_xs ts_xs ts_xs ts_xs ts_xs ts_xs ts_xs ts_xs ts_xs ts_xs ts_xs null;end case;end if;end process;process(gongneng,clk1,fz_l,fz_h,mz_h,mz_l)-蜂鸣器(灯光代替)beginif b=5 then b=000;baoshi=0;elsif(clk1event and clk1=1) then if(gongneng=000 and fz_l=9 and fz_h=5 and mz_l=9 and mz_h=5

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号