欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

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

    • 资源ID:3919240       资源大小:2.55MB        全文页数:29页
    • 资源格式: DOC        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    太原理工大学现代科技学院 EDA技术与FPGA应用设计 课程设计 设计名称 数字电子钟 专业班级 学 号 姓 名 指导教师 张 博 太原理工大学现代科技学院专业班级学生姓名课程名称EDA技术与FPGA应用设计设计名称数字电子钟设计周数1.5指导教师张博设计任务主要设计参数设计一个电子钟,具体要求如下: (1) 具有时、分、秒计数显示功能,以24小时循环计时; (2) 具有清零、校时、校分功能; (3) 具有整点蜂鸣器报时功能。 设计内容设计要求(1)根据选题要求,进行方案比较,画出系统框图; (2)使用VHDL语言描述各单元电路; (3)利用Quartus II 10.0软件对单元电路进行编译、仿真、引脚锁定、下载调试; (4)撰写课程设计任务书。 主要参考资 料1 张文爱.EDA技术与FPGA应用设计.电子工业出版社, 2013. 2 贾秀美. 数字电路硬件设计实践. 高等教育出版社, 2008 学生提交归档文件课程设计说明书,主要包括以下内容: (1)设计方案,系统框图,原理分析; (2)系统各模块的VHDL源程序; (3)综合、编程部分,包括各模块的综合结果、仿真分析,系统管脚定义,下载验证结果; (4)设计总结部分,指出设计系统的特点及选用方案优缺点,提出改进意见及展望,总结设计收获、体会; (5)参考文献。 课程设计任务书注:1.课程设计完成后,学生提交的归档文件应按照:封面任务书说明书图纸的顺序进行装订上交(大张图纸不必装订) 2.可根据实际内容需要续表,但应保持原格式不变。指导教师签名: 日期: 2016.06.08 装订线专业班级 学号 姓名 成绩 数 字 电 子 钟一、设计名称: 数字电子钟的实现 二、设计要求:设计一个电子钟,具体要求如下: (1) 具有时、分、秒计数显示功能,以24小时循环计时; (2) 具有清零、校时、校分功能; (3) 具有整点蜂鸣器报时功能。 三、设计内容: (1)根据选题要求,进行方案比较,画出系统框图; (2)使用VHDL语言描述各单元电路; (3)利用Quartus II 10.0软件对单元电路进行编译、仿真、引脚锁定、下载调试; (4)撰写课程设计任务书。 四、CPLD介绍:(1)FPGA(FieldProgrammable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。 现场可编程门阵列(FPGA)是可编程器件。与传统逻辑电路和门阵列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的结构,FPGA利用小型查找表16×1RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能,FPGA允许无限次的编程。 五、 电子钟总体设计方案:本时钟系统主要由分频器、计数、译码、显示、校时以及闹钟等功能。由于分频器从50MHZ晶振中得到1HZ信号给计数器提供标准时钟,译码器将计数器数据译码数码管能显示的信号,显示模块扫描译码器数据并显示。由于计数的起始时间不可能与标准时间一致,所以需要加入一个分频程序。1.分频程序先后采用过两种方式:(1)signal count : integer;-分频内部时钟process(clk)-分频程序beginif (clk'event and clk='1') thenif(count=N-1)thencount<=conv_integer('0');elsecount<=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' thencnt<=(others=>'0');elsif clk'event and clk='1' thencnt<=cnt+1;end if;end process;clk1<=cnt(24);这个是应用于分频的分频程序模块,测试结果良好。此分频没有严格分频至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)-秒针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 (clk1'event 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;以上一部分为秒针的计数器模块,通过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" thenifclk1'event 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<=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 clk1'event and clk1='1' thenif(fz_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<=sz_l+1;end if;end if;end if;end if;end process;以上一部分为分和时的计数器模块,通过IF嵌套将复位信号、分(时)计数、及置位模块并入同一进程,因为信号不能不在多个进程被赋值,所以只能集成如同一进程。Gongneng为正常计时有效信号。3.显示译码模块通用形式为:process(mz_h)-秒针高位显示begincase mz_h iswhen "0000" => miao_h<="1000000"when "0001" => miao_h<="1111001"when "0010" => miao_h<="0100100"when "0011" => miao_h<="0110000"when "0100" => miao_h<="0011001"when "0101" => miao_h<="0010010"when "0110" => miao_h<="0000010"when "0111" => miao_h<="1111000"when "1000" => miao_h<="0000000"when "1001" => miao_h<="0010000"when others => null;end case;end process;因为实验箱电路板提供的是共阳数码管,所以为低位有效,将进程中的敏感信号切换即可显示各模块的时间显示。4. 功能调整模块jz_0:in std_logic;-校正开关signal gn:std_logic_vector(2 downto 0);-内部功能计数signal gongneng:std_logic_vector(2 downto 0);-功能控制计数以便拓展 -这里只用到1为调位,0process(jz_0)-功能计数beginif(jz_0'event and jz_0='1')then if gn="001" then -此处可选功能增加或减少功能gn<="000" elsegn<=gn+1; end if;end if;gongneng<=gn;end process;以上为功能调整模块,例如本例中想通过000控制正常计数,而001时停止计数,开始调整,此处选择001返回000是因为校时分秒采用了单独的置位开关,所以功能只有停止和计数两种模式。在附录中提供集成功能控制的校时程序。5. 校正时间输入调整模块clk_tz :in std_logic;-单独的时间调整按钮process(clk_tz,gongneng)-校正时间调整beginif gongneng="001" then if clk_tz'event and clk_tz='1'then if a=9 then a<="0000"elsea<=a+1;end if;end if;end if;end process;此段程序虽然可以实现置数校时,但是例如分秒高位最高只有5所以改进程序如下:process(clk_tz)beginif gongneng/="000" then if clk_tz'event and clk_tz='1'then if kz_1='1' or kz_3='1' or kz_5='1'thenif a=9 then a<="0000"elsea<=a+1;end if;end if;if kz_2='1' or kz_4='1' thenif a>=5 then a<="0000"elsea<=a+1;end if;end if;if kz_6='1' thenif sz_l>4 and a=1 then a<="0000"elsif a>2 thena<="0000"elsea<=a+1;end if;end if; end if;end if;end process;这样就不会出现调整高位时间溢出的问题。6. 在实验过程中还加入了便于观察和研究的校时单独显示模块。process(gongneng,a)-调整显示beginif gongneng="000" then-正常计数时校时显示不显示ts_xs<="1111111" ;elsecase a iswhen "0000" => ts_xs<="1000000"when "0001" => ts_xs<="1111001"when "0010" => ts_xs<="0100100"when "0011" => ts_xs<="0110000"when "0100" => ts_xs<="0011001"when "0101" => ts_xs<="0010010"when "0110" => ts_xs<="0000010"when "0111" => ts_xs<="1111000"when "1000" => ts_xs<="0000000"when "1001" => ts_xs<="0010000"when others => 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(clk1'event 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_0_0:std_logic;process(clk1) begin if(clk1'event 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; 这个主要是缓解调时及功能选择时按键抖动的问题,在实际的应用中相当重要。六、 设计电子钟完整程序这段程序为便于调查观察各部分功能的程序,精简后的完整程序见附录。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_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_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 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 clk1:std_logic;-分频后时钟signal gongneng:std_logic_vector(2 downto 0);-功能控制计数以便拓展 -这里只用到1为调位,0为计数signal count : integer;-分频内部时钟signal gn:std_logic_vector(2 downto 0);-内部功能计数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_tz'event and clk_tz='1'then if kz_1='1' or kz_3='1' or kz_5='1'thenif a=9 then a<="0000"elsea<=a+1;end if;end if;if kz_2='1' or kz_4='1' thenif a>=5 then a<="0000"elsea<=a+1;end if;end if;if kz_6='1' thenif sz_l>4 and a=1 then a<="0000"elsif a>2 thena<="0000"elsea<=a+1;end if;end if; end if;end if;end process;process(rst,clk)-分频程序beginif rst='0' thencnt<=(others=>'0');elsif clk'event and clk='1' thencnt<=cnt+1;end if;end process;clk1<=cnt(24);process(jz_0)-功能计数beginif(jz_0'event 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)-秒针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 (clk1'event 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;process(mz_h)-秒针高位显示begincase mz_h iswhen "0000" => miao_h<="1000000"when "0001" => miao_h<="1111001"when "0010" => miao_h<="0100100"when "0011" => miao_h<="0110000"when "0100" => miao_h<="0011001"when "0101" => miao_h<="0010010"when "0110" => miao_h<="0000010"when "0111" => miao_h<="1111000"when "1000" => miao_h<="0000000"when "1001" => miao_h<="0010000"when others => null;end case;end process;process(mz_l)-秒针低位显示begincase mz_l iswhen "0000" => miao_l<="1000000"when "0001" => miao_l<="1111001"when "0010" => miao_l<="0100100"when "0011" => miao_l<="0110000"when "0100" => miao_l<="0011001"when "0101" => miao_l<="0010010"when "0110" => miao_l<="0000010"when "0111" => miao_l<="1111000"when "1000" => miao_l<="0000000"when "1001" => miao_l<="0010000"when others => 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 gongneng="000" thenifclk1'event 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<=fz_l+1;end if; end if;end if;end if;end process;process(fz_h)-分针高位显示begincase fz_h iswhen "0000" => fen_h<="1000000"when "0001" => fen_h<="1111001"when "0010" => fen_h<="0100100"when "0011" => fen_h<="0110000"when "0100" => fen_h<="0011001"when "0101" => fen_h<="0010010"when "0110" => fen_h<="0000010"when "0111" => fen_h<="1111000"when "1000" => fen_h<="0000000"when "1001" => fen_h<="0010000"when others => null;end case;end process;process(fz_l) -分针低位显示begincase fz_l iswhen "0000" => fen_l<="1000000"when "0001" => fen_l<="1111001"when "0010" => fen_l<="0100100"when "0011" => fen_l<="0110000"when "0100" => fen_l<="0011001"when "0101" => fen_l<="0010010"when "0110" => fen_l<="0000010"when "0111" => fen_l<="1111000"when "1000" => fen_l<="0000000"when "1001" => fen_l<="0010000"when others => 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 clk1'event and clk1='1' thenif(fz_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<=sz_l+1;end if;end if;end if;end if;end process;process(sz_h)-时钟高位显示begincase sz_h iswhen "0000" => shi_h<="1000000"when "0001" => shi_h<="1111001"when "0010" => shi_h<="0100100"when "0011" => shi_h<="0110000"when "0100" => shi_h<="0011001"when "0101" => shi_h<="0010010"when "0110" => shi_h<="0000010"when "0111" => shi_h<="1111000"when "1000" => shi_h<="0000000"when "1001" => shi_h<="0010000"when others => null;end case;end process;process(sz_l)-时钟低位显示begincase sz_l iswhen "0000" => shi_l<="1000000"when "0001" => shi_l<="1111001"when "0010" => shi_l<="0100100"when "0011" => shi_l<="0110000"when "0100" => shi_l<="0011001"when "0101" => shi_l<="0010010"when "0110" => shi_l<="0000010"when "0111" => shi_l<="1111000"when "1000" => shi_l<="0000000"when "1001" => shi_l<="0010000"when others => null;end case;end process;process(gongneng,a)-调整功能显示beginif gongneng="000" thents_xs<="1111111" ;elsecase a iswhen "0000" => ts_xs<="1000000"when "0001" => ts_xs<="1111001"when "0010" => ts_xs<="0100100"when "0011" => ts_xs<="0110000"when "0100" => ts_xs<="0011001"when "0101" => ts_xs<="0010010"when "0110" => ts_xs<="0000010"when "0111" => ts_xs<="1111000"when "1000" => ts_xs<="0000000"when "1001" => ts_xs<="0010000"when others => 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(clk1'event and clk1='1') then if(gongneng="000" and fz_l=9 and fz_h=5 and mz_l=9 and mz_h=5

    注意事项

    本文(现代科技电子钟课程设计.doc)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开