数字日历电路设计EDA实训
数字万年历实训报告电气

一、实训目的随着科技的不断发展,电子产品的应用越来越广泛。
数字万年历作为一种常见的电子设备,具有显示日期、星期、农历、节假日等多种功能,给人们的生活带来了极大的便利。
为了更好地掌握电子产品的设计原理和制作方法,提高自身的实践能力,本次实训旨在通过设计和制作数字万年历,使学生对电子技术、电路设计、编程等方面有一个全面的认识和掌握。
二、实训内容1. 数字万年历的设计(1)功能需求分析根据用户需求,数字万年历应具备以下功能:1)显示日期、星期、农历、节假日等信息;2)具有闹钟功能,可设定闹钟时间、闹钟音量等;3)具有定时关机功能,可根据用户需求设定关机时间;4)具备背光功能,便于夜间使用;5)具有定时更新功能,可自动更新农历、节假日等信息。
(2)硬件设计1)主控芯片:选用STM32F103系列单片机,具有丰富的片上资源,易于编程和控制。
2)显示模块:采用TFT LCD显示屏,显示效果清晰,支持触摸操作。
3)按键模块:采用独立按键,实现功能选择、闹钟设置、关机等操作。
4)时钟模块:采用DS3231实时时钟模块,提供高精度的时间测量和闹钟功能。
5)背光模块:采用LED背光,可调节亮度,满足不同环境需求。
6)电源模块:采用DC-DC转换器,将5V输入电压转换为3.3V输出电压,为电路提供稳定电源。
(3)软件设计1)系统初始化:初始化各个模块,包括显示模块、按键模块、时钟模块等。
2)主循环:根据用户操作,实现功能切换、闹钟设置、关机等功能。
3)闹钟功能:实现闹钟时间设置、闹钟音量调节、闹钟提醒等功能。
4)定时关机功能:根据用户设置,实现定时关机功能。
5)背光功能:实现背光亮度调节,满足不同环境需求。
6)定时更新功能:自动更新农历、节假日等信息。
2. 数字万年历的制作(1)焊接电路板:按照电路图,焊接各个模块,确保电路连接正确。
(2)编程:使用Keil uVision5开发环境,编写STM32F103单片机程序,实现数字万年历的功能。
数字日历的设计DA应用实例

数字钟和年月日按键切换模块程序(mux_4v.v) module mux_4v(k,jm,jf,js,jr,jy,jn,j1,j2,j3); input k,j1,j2,j3; //输入按键 output reg jm,jf,js,jr,jy,jn; //输出时分秒、年月日 always begin if (k==0) {jm,jf,js}={j1,j2,j3}; //输出时分秒 else {jr,jy,jn}={j1,j2,j3}; //输出年月日 end endmodule
数字钟和年月日显示8秒切换模块程序(contr.v) module contr(clk,k1,k2,k); input clk,k1,k2; output reg k; reg [3:0] qc; reg rc; always @(posedge clk) //时钟显示和日期8秒显示切换程序 begin qc=qc+1; if (qc<8) rc=0; //每8秒切换一次 else rc=1; case ({k1,k2}) //按键切换选择 0:k=rc; //自动切换 1:k=0; //显示时分秒 2:k=1; // //显示年月日 3:k=rc; endcase end endmodule
2、数字日历的设计
1. 设计任务 设计并制作一台数字日历。 2. 设计要求 ① 用EDA实训仪的I/O设备和PLD芯片实现数字日历的设计。 ② 数字日历能够显示年、月、日、时、分和秒。 ③ 用EDA实训仪上的8只八段数码管分两屏分别显示年、月、日和时、 分、秒,即在一定时间段内显示年、月、日(如20080101),然后在另 一时间段内显示时、分、秒(如00123625),两个时间段能自动倒换。 ④ 数字日历具有复位和校准年、月、日、时、分、秒的按钮,但校年和 校时同用一个按钮,即在显示年、月、日时用此按钮校年,在显示时、 分、秒时则用此按钮校时,依此类推。
《EDA技术及可编程器件应用实训》课程设计报告-基于CPLD技术的数字万年历设计模板

《EDA技术及可编程器件应用实训》课程设计报告院系机械电子工程系姓名专业班级07通信技术一班学号指导老师日期:2009年 6 月10 日《EDA技术及可编程器件应用实训》课程设计报告一、设计内容:课程设计题目:基于CPLD技术的数字万年历设计。
课题设计的万年历具有年、月、日、时、分、秒计数功能,以秒、分、时、日、月、年进制循环计时;具有清零、调时功能、报时功能。
二、设计意义通过理论学习和实践动手操作,可以掌握小型数字系统的设计方法。
理论学习中了解到大规模可编程逻辑器件CPLD/FPGA的内部结构和外部特性;了解到EDA设计的方法;掌握硬件描述语言VHDL程序方法和思路;学会使用Quartus II开发平台。
通过具体的数字百年历的项目设计,可深切地领会到EDA硬件设计软件化的特点;掌握六十进制、二十四进制、十二进制、及通过语言VHDL程序来控制三十、三十一、二十八、二十九进制的选择、五选一、二选一,从而实现计数器的设计方法;同时掌握CPLD技术的层次化结构化设计方法;并能熟练使用Quartus II开发小中型数字系统,解决调试过程中所遇到的一些问题。
三、设计方法常见数字百年历具有计时和显示、报时功能。
电路设计中包括分频模块,用于将外部晶振产生的一定周期的时钟信号计数产生1s时钟信号;60进制的秒、分计数模块;24进制的时计数模块;12进制的月计数模块;通过语言选择的闰年平年天数选择模块;5选一的调时控制模块;2选一模式转换模块;另有显示模块和整点报时信号端口。
1、同步计时六十进制加法器的程序如下。
其中,cout为输出端口信号,clk为分频模块产生的秒计时信号(时钟信号),q1和q2为秒计数中十进制数所对应的高位和低位信号。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt60 isport(clk:in std_logic;cout:out std_logic;q1,q2:out std_logic_vector(3 downto 0));architecture behav of cnt60 isbeginvariable cq1,cq2:std_logic_vector(3 downto 0);beginif clk'event and clk='1' thencq1:=cq1+1;if cq1>9 then cq1:="0000";cq2:=cq2+1;end if;if cq2=6 and cq1=0 thencq1:="0000";cq2:="0000";cout<='1';else cout<='0';end if;q1<=cq1;q2<=cq2;end process;end;所写程序经过仿真的如上图所示。
数字万年历组装实训报告

一、实训背景随着科技的发展,电子产品在我们的日常生活中扮演着越来越重要的角色。
为了提高学生的动手能力和实际操作技能,同时也为了加深对数字电路知识的理解,我们选择了数字万年历的组装作为实训项目。
数字万年历是一种具有日历、星期、日期、农历、节假日等多种功能的电子设备,它集成了数字电路、微控制器、液晶显示屏等元件,能够直观地显示日期和时间信息。
二、实训目的1. 通过组装数字万年历,使学生掌握数字电路的基本原理和实际应用。
2. 培养学生的动手能力、团队协作能力和创新意识。
3. 加深对微控制器、液晶显示屏等电子元件的理解和认识。
4. 学会使用电子工具和仪器,提高实际操作技能。
三、实训内容1. 硬件准备:数字万年历的硬件主要包括微控制器、液晶显示屏、时钟模块、按键、电源模块等。
2. 元件识别:学习各种电子元件的外观、符号、规格等,了解它们在电路中的作用。
3. 电路设计:根据数字万年历的功能要求,设计电路图,包括电路元件的连接方式和电路参数。
4. 电路焊接:按照电路图,将各个电子元件焊接在一起,确保电路的连通性。
5. 软件编程:编写微控制器的程序,实现万年历的各项功能,如时间显示、日期设置、农历查询等。
6. 系统调试:检查万年历的各项功能是否正常,对出现的问题进行调试和修复。
四、实训过程1. 硬件准备:首先,我们准备了一套数字万年历的组装套件,包括微控制器、液晶显示屏、时钟模块、按键、电源模块等。
2. 元件识别:在指导老师的讲解下,我们学习了各种电子元件的外观、符号、规格等,了解了它们在电路中的作用。
3. 电路设计:根据数字万年历的功能要求,我们设计了电路图,包括电路元件的连接方式和电路参数。
电路图设计完成后,我们将其打印出来,作为焊接的依据。
4. 电路焊接:按照电路图,我们将各个电子元件焊接在一起。
在焊接过程中,我们注意以下几点:a. 焊接前,检查元件的规格和引脚是否正确;b. 焊接时,控制好焊接时间,避免过热损坏元件;c. 焊接完成后,检查焊接点是否牢固,是否有虚焊现象。
EDA技术及其应用__万年历实训报告

EDA实训万年历简介万年历的制作是利用EDA技术中VHDL语言编制程序,利用QuartusII软件进行仿真波形,然后在试验箱上实现功能。
万年历由电子表模块、日历模块、调制模块组成。
电子表模块是基层;日历模块是高层;调制模块由五选一模块、二选一模块组成,它可以对电子表模块和日历模块进行手动调节。
但是,各个独立的模块需要通过顶层文件来实现。
顶层文件的作用为将各独立的功能模块关联起来,协同完成该系统的最终功能,通过画系统的整体组装设计原理图的方法来实现这一功能。
万年历实训大纲1.·················实训课题2.·················实训地点3.·················实训目的4.·················实训器材5.·················实训内容6.·················实训结果7.·················实训心得实训报告正文实训课题万年历实训地点郑州信息科技职业学院EDA技术实验室实训目的(1)掌握系统设计的方法和层次化设计方法。
《EDA技术及应用》数字日历电路的设计

《EDA技术及应用》数字日历电路的设计1 系统设计1.1 设计要求1.1.1 设计任务设计并制作一台数字日历。
1.1.2 性能指标要求①用EDA实训仪的I/O设备和PLD芯片实现数字日历的设计。
②数字日历能够显示年、月、日、时、分和秒。
③用EDA实训仪上的8只八段数码管分三屏分别显示年、月、日和时、分、秒,即在一定时间段内显示年(如002022),一段时间段内月、日(如000101),然后在另一时间段内显示时、分、秒(如120000),两个时间段能自动倒换。
④数字日历具有复位和校准年、月、日、时、分、秒的按钮,但校年和校时同用一个按钮,即在显示年、月、日时用此按钮校年,在显示时、分、秒时则用此按钮校时,依此类推。
1.2 设计思路及设计框图1.2.1设计思路通过EDA课程的学习,总体设计中包括显示部分、计时部分、控制部分、校时部分、年月日部分以及分频功能。
之后运用Verilog HDL语言编写60进制、24进制、年月日模块(nyr2022.)、控制模块(contr)、校时选择模块(mux_4)、显示选择模块(mux_16)和分频器的源程序,分别生成元件符号,然后将各个模块连接起来画成原理图再下载到实训箱上,调节开关及按钮来实现数字日历的功能。
1.2.2总体设计框图2 各个模块程序的设计1.1 年月日模块clrn是异步清除输入端,低电平有效;clk是时钟输入端,上升沿有效;jn、jy和jr分别是校年、校月、校日输入端;qn[15..0]、qy[7..0]、qr[7..0]分别是年、月、日的输出端。
1.2 控制模块控制模块上的clk给的是1s时钟脉冲,k是一个两位的控制输出端,所以k可以有4个值,它与显示模块共同控制年月日,时分秒,月日显示的切换。
1.3 校时选择模块①当k=0时,开关j1,j2,j3校秒时分然后将信号分别送到jsq模块的jm(校秒)、jf(校分)、js(校时)。
②当k=1时,开关j1,j2,j3校年月日然后将信号分别送到nyr模块的jr(校日)、jy(校月)、jn(校年)。
EDA万年历实训报告

《EDA技术及其应用》实训报告班级 11241姓名苏合信,张明伟,朱迎新,王亚坤学号 22,11,28,29指导教师薛瑞2013年05月26 日北华航天工业学院11级电子工程系目录一设计要求 (2)1.0 设计目的及意义 (2)1.1 设计要求 (2)二设计流程: (2)2.0 原理框图 (2)2.1 VHDL设计思路 (3)三 VHDL程序 (3)3.0 天计数模块 (6)3.1 月计数模块 (7)3.2 年计数模块 (9)3.3 调时控制模块 (11)3.4 译码模块 (12)3.5 扫描模块 (12)四心得体会 (14)4.0 (14)五附录 (15)5.0 顶层文件 (15)一、设计目的及意义1.0 设计目的及意义在掌握EDA理论知识的基础上进一步了解EDA开发软件QuartusII的使用,掌握VHDL编程的技巧及方法,学会并熟练掌握PC机与实验箱的连接下载及使用,进一步提高自己的动手操作能力。
1.1 设计要求利用QuartusII编写程序在实验箱上实现万年历的年月日的显示,要求能够区分闰年与平年;年月日,时分秒可以自由调整并能随意切换;能够清楚地分辨出年月日,时分秒的显示状态。
二、设计流程2.0 原理框图2.1 VHDL设计思路编写年月日模块,年模块要有一个反馈端口控制月;月也要有一个反馈端口控制日;最后编写调时模块和扫描模块,以及译码模块,可以用k1,k2调节年月,用对应的LED等的亮灭来表示调节状态。
三、VHDL程序3.0 天计数模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity tian isport(clk:in std_logic;pan:in std_logic_vector(1 downto 0);T1:out std_logic_vector(6 downto 0);cout:out std_logic);end tian;architecture one of tian issignal q1:std_logic_vector(3 downto 0);signal q2:std_logic_vector(2 downto 0);signal ab:std_logic_vector(1 downto 0);beginprocess(clk,pan)beginif clk'event and clk='1'then q1<=q1+1;if q1=9 then q1<="0000";q2<=q2+1;end if;case pan iswhen "00"=>if q2=3 and q1=1 then q2<="000" ;q1<="0001";cout<='1'; else cout<='0';end if;when "01"=>if q2=3 and q1=0 then q2<="000" ;q1<="0001";cout<='1'; else cout<='0';end if;when "10"=>if q2=2 and q1=8 then q2<="000" ;q1<="0001";cout<='1'; else cout<='0';end if;when "11"=>if q2=2 and q1=9 then q2<="000" ;q1<="0001";cout<='1'; else cout<='0';end if;when others=>null;end case;end if;end process;T1(3 downto 0)<=q1;T1(6 downto 4)<=q2;end one;3.1 月计数模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity yue isport(clk,run:in std_logic;cout:out std_logic;pan:out std_logic_vector(1 downto 0);Y1:out std_logic_vector(6 downto 0));end yue;architecture behav of yue issignal q1:std_logic_vector(3 downto 0);signal q2:std_logic_vector(2 downto 0);signal q3:std_logic_vector(6 downto 0);beginprocess(clk,run,q1,q2)beginif clk'event and clk='1' thenq1<=q1+1;if q1=9 then q1<="0000";q2<=q2+1;end if;if q1=2 and q2=1 thenq1<="0001";q2<="000";cout<='1';else cout<='0';end if;q3<=q2&q1;case q3 iswhen "0000001"=>pan<="00";when "0000010"=>if run='1' then pan<="11";else pan<="10"; end if;when "0000011"=>pan<="00";when "0000100"=>pan<="01";when "0000101"=>pan<="00";when "0000110"=>pan<="01";when "0000111"=>pan<="00";when "0001000"=>pan<="00";when "0001001"=>pan<="01";when "0001010"=>pan<="00";when "0001011"=>pan<="01";when "0001100"=>pan<="00";when others=>null;end case;end if;Y1(3 downto 0)<=q1;Y1(6 downto 4)<=q2; end process;end behav;3.2 年计数模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity nian isport(clk :in std_logic;n1:out std_logic_vector(6 downto 0); run:out std_logic);end entity;architecture one of nian issignal q1,q3:std_logic_vector(3 downto 0); signal q2:std_logic_vector(2 downto 0);beginprocess(clk)beginif clk'event and clk='1' thenq1<=q1+1;q3<=q3+1;if q1=9 then q2<=q2+1;q1<="0000";end if;if q3=3 thenq3<="0000";run<='1';else run<='0';end if;if q1=9 and q2<=7 then q1<="0001";q2<="000"; end if;end if;end process;n1(3 downto 0)<=q1;n1(6 downto 4)<=q2;end one;3.3 调时模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity tiaoshi isport(k1,k2:in std_logic;m1,m2:in std_logic;n1,n2,d1,d2:out std_logic);end entity;architecture one of tiaoshi issignal q:std_logic_vector(3 downto 0);beginprocess(k1,q,m1,m2)beginif k1'event and k1='1' then q<=q+1;if q=2 then q<="0000";end if;end if;case q iswhen"0000"=>n1<=m1;n2<=m2;d1<='0';d2<='0'; when"0001"=>n1<=k2;n2<='0'; d1<='1';d2<='0'; when"0010"=>n1<='0';n2<=k2; d1<='0';d2<='1'; when others=>NULL;end case;end process;end one;3.4 扫描模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity seltime isport(clk1:in std_logic;tian,yue:in std_logic_vector(6 downto 0); nian:in std_logic_vector(6 downto 0);daout:out std_logic_vector(3 downto 0);dp:out std_logic;sel:out std_logic_vector(2 downto 0));end seltime;architecture fun of seltime issignal count:std_logic_vector(2 downto 0); beginsel<=count;process(clk1)beginif(clk1'event and clk1='1')thenif(count>="101")thencount<="000";elsecount<=count+1;end if;end if;case count iswhen "000"=>daout<=tian(3 downto 0);dp<='0'; when"001"=>daout(3)<='0';daout(2 downto 0)<=tian(6 downto 4);dp<='0';when "010"=>daout<=yue(3 downto 0);dp<='1'; when"011"=>daout(3)<='0';daout(2 downto 0)<=yue(6 downto 4);dp<='0';when "100"=>daout<=nian(3 downto 0);dp<='1'; when others=>daout(3 downto 2)<="00"; daout(2 downto 0)<=nian(6 downto 4);dp<='0';end case;end process;end fun;3.5 译码模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity led isport(ledi:in std_logic_vector(3 downto 0);ledo:out std_logic_vector(6 downto 0));end entity;architecture one of led isbeginprocess(ledi)begincase ledi iswhen "0000"=>ledo<="1111110";when "0001"=>ledo<="0110000";when "0010"=>ledo<="1101101";when "0011"=>ledo<="1111001";when "0100"=>ledo<="0110011";when "0101"=>ledo<="1011011";when "0110"=>ledo<="1011111";when "0111"=>ledo<="1110000";when "1000"=>ledo<="1111111";when "1001"=>ledo<="1111011";when others=>null;end case;end process;end one;四、心得体会通过本次万年历实训,让我从中收获很多,感触也很多。
数字日历电路的设计-EDA实训

成绩批阅教师日期桂林电子科技大学实训报告2016-2017学年第1学期学院海洋信息工程学院课程 EDA综合实训姓名钟朝林学号 1416030218 指导老师覃琴日期 2016/12/29实训题目:数字日历电路的设计1 概述1.1 设计要求1.1.1 设计任务设计并制作一台数字日历。
1.1.2 性能指标要求①用EDA实训仪的I/O设备和PLD芯片实现数字日历的设计。
②数字日历能够显示年、月、日、时、分和秒。
③用EDA实训仪上的8只八段数码管分两屏分别显示年、月、日和时、分、秒,即在一定时间段内显示年、月、日(如20080101),然后在另一时间段内显示时、分、秒(如00123625),两个时间段能自动倒换。
④数字日历具有复位和校准年、月、日、时、分、秒的按钮,但校年和校时同用一个按钮,即在显示年、月、日时用此按钮校年,在显示时、分、秒时则用此按钮校时,依此类推。
1.2 总体设计基本原理及框图1.2.1 基本原理日历主要由年月日模块、时分秒模块、控制模块、显示模块、校时模块组成。
采用3个公用按钮j1、j2、和j3完成时分秒或年月日的校时,用8只七段数码管分时完成时分秒或年月日的显示。
设计电路的计时器模块(jsq24)用于完成一天的24小时计时;年月日模块接收计时器模块送来的“天”脉冲进行计数,得到日月年的显示结果,控制模块产生控制信号k,控制数码显示器显示年月日,还是时分秒,或者自动轮流显示;校时选择模块在k信号的控制下,选择将j1、j2和j3这3个校时按钮产生的信号是送到计时器模块的校秒、校分和校时输入端,还是送到年月日模块的校天、校月、校年输入端;显示选择模块在k信号的控制下,选择是将计时器模块的时、分、秒状态信号,还是将年月日模块的年、月、日状态信号送到数码管显示器显示。
1.2.2 总体框图2 系统软件设计分析2.1年月日模块module r(clrn,clk,jn,jy,jr,qn,qy,qr); //年月日模块input clrn,clk,jn,jy,jr;output reg[15:0] qn;reg [15:0] qn1;output reg[7:0] qy,qr;reg clkn,clky;reg[7:0] date;reg clkn1,clkn2,clkn3;initial begin clkn1=1;clkn2=1;clkn3=1;endinitial begin qn='h2011;qn1=2011;qy=1;qr=1;endalways @(posedge (clk^jr) or negedge clrn)// 日计时模块beginif(~clrn)qr=1;else beginif(qr==date)begin qr=1; clky=1;endelse begin qr=qr+1;clky=0;endif(qr[3:0]=='ha)beginqr[3:0]=0;qr[7:4]=qr[7:4]+1;endendendalways @(posedge (clky^jy) or negedge clrn)//月计时模块beginif(~clrn) qy=1;else beginif(qy=='h12) begin qy=1;clkn=1;endelse begin qy=qy+1;clkn=0;endif(qy[3:0]=='ha)beginqy[3:0]=0;qy[7:4]=qy[7:4]+1;endendendalwayscase(qy)'h01:date='h31;'h02:beginif((qn1%4==0)&(qn1%100 != 0)|(qn1%400==0))date='h29;else date='h28;end'h03:date='h31;'h04:date='h30;'h05:date='h31;'h06:date='h30;'h07:date='h31;'h08:date='h31;'h09:date='h30;'h10:date='h31;'h11:date='h30;'h12:date='h31;default: date='h30;endcaseendalways @( posedge (clkn^jn) or negedge clrn) //年计时模块 beginif(~clrn)begin qn[3:0]=1;qn1=2011;endelse begin if(qn[3:0]==9)qn[3:0]=0;else begin qn[3:0]=qn[3:0]+1;qn1=qn1+1;endif(qn[3:0]==9)clkn1=0;else clkn1=1;endendalways @(posedge clkn1 or negedge clrn)beginif(~clrn)qn[7:4]=1;else begin if(qn[7:4]==9) qn[7:4]=0;else qn[7:4]=qn[7:4]+1;if(qn[7:4]==9) clkn2=0;else clkn2=1;endendalways @(posedge clkn2 or negedge clrn)beginif(~clrn)qn[11:8]=0;else begin if(qn[11:8]==9) qn[11:8]=0;else qn[11:8]=qn[7:4]+1;if(qn[11:8]==9) clkn3=0;else clkn3=1;endendalways @(posedge clkn3 or negedge clrn)if(~clrn)qn[15:12]=2;else if(qn[15:12]==9) qn[15:12]=0;else qn[15:12]=qn[15:12]+1;endendmodule2.2时分秒模块module cnt60(clk,clrn,j,q,cout);//分和秒计时input clk,clrn,j;output reg[7:0] q;output reg cout;always @(posedge clk^j or negedge clrn )beginif (~clrn) q=0;else beginif (q=='h59) begin q=0;cout=1;endelse begin q=q+1;cout=0;endif (q[3:0]=='ha) beginq[3:0]=0;q[7:4]=q[7:4]+1;endendendendmodulemodule cnt24(clk,clrn,j,q,cout);//小时计时input clk,clrn,j;output reg[7:0] q;output reg cout;always @(posedge clk^j or negedge clrn )beginif (~clrn) q=0;else beginif (q=='h23) begin q=0;cout=1;endelse begin q=q+1;cout=0;endif (q[3:0]=='ha) beginq[3:0]=0;q[7:4]=q[7:4]+1;endendendendmodule2.3控制模块module contr(clk,k1,k2,k);input clk,k1,k2;output reg k;reg [3:0] qc;reg rc;always @(posedge clk)begin qc=qc+1;if (qc<8) rc=0;else rc=1;case ({k1,k2})0:k=rc; //八秒显示年月日八秒显示时分秒的自由转换 1:k=0;//显示并且校准时分秒2:k=1; //显示并且校准年月日3:k=rc;endcaseendendmodule2.4显示模块module mux_16(k,qm,qf,qs,qr,qy,qn,q);input k;input [7:0]qm,qf,qs,qr,qy;input [15:0] qn;output reg [31:0]q;alwaysbeginif (k==0) beginq[31:24]=0;q[23:0]={qs,qf,qm};endelse q={qn,qy,qr};endendmodule2.5校时模块module mux_4(k,jm,jf,js,jr,jy,jn,j1,j2,j3); input k,j1,j2,j3;output reg jm,jf,js,jr,jy,jn;alwaysbeginif (k==0) {jm,jf,js}={j1,j2,j3};else {jr,jy,jn}={j1,j2,j3};endendmodule2.6闹钟模块module naozhong(qs,qf,led,zt);input zt;input[7:0] qs,qf;output led;reg led;alwaysbeginif (qs=='h06&&qf=='h01) //6:01闹钟开始闪烁led=1;elseled=0;if(zt==1) led=0; // 在任意时刻都可以关掉闹钟endendmodule2.7分频器模块module FENP(clk,newclk);input clk;output reg newclk;reg[24:0] cnter;always @(posedge clk)beginif(cnter<20000000) cnter=cnter+1;else cnter=0;if (cnter<10000000) newclk=1;elsenewclk=0;endendmodule3 系统测试(调试)3.1 测试仪器与设备计算机,EDA实训仪。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
成绩批阅教师日期桂林电子科技大学实训报告2016-2017学年第1学期学院海洋信息工程学院课程EDA综合实训姓名钟朝林学号 1416030218指导老师覃琴日期2016/12/29实训题目:数字日历电路的设计1 概述1.1 设计要求1.1.1 设计任务设计并制作一台数字日历。
1.1.2 性能指标要求①用EDA实训仪的I/O设备和PLD芯片实现数字日历的设计。
②数字日历能够显示年、月、日、时、分和秒。
③用EDA实训仪上的8只八段数码管分两屏分别显示年、月、日和时、分、秒,即在一定时间段内显示年、月、日(如20080101),然后在另一时间段内显示时、分、秒(如00123625),两个时间段能自动倒换。
④数字日历具有复位和校准年、月、日、时、分、秒的按钮,但校年和校时同用一个按钮,即在显示年、月、日时用此按钮校年,在显示时、分、秒时则用此按钮校时,依此类推。
1.2 总体设计基本原理及框图1.2.1 基本原理日历主要由年月日模块、时分秒模块、控制模块、显示模块、校时模块组成。
采用3个公用按钮j1、j2、和j3完成时分秒或年月日的校时,用8只七段数码管分时完成时分秒或年月日的显示。
设计电路的计时器模块(jsq24)用于完成一天的24小时计时;年月日模块接收计时器模块送来的“天”脉冲进行计数,得到日月年的显示结果,控制模块产生控制信号k,控制数码显示器显示年月日,还是时分秒,或者自动轮流显示;校时选择模块在k信号的控制下,选择将j1、j2和j3这3个校时按钮产生的信号是送到计时器模块的校秒、校分和校时输入端,还是送到年月日模块的校天、校月、校年输入端;显示选择模块在k信号的控制下,选择是将计时器模块的时、分、秒状态信号,还是将年月日模块的年、月、日状态信号送到数码管显示器显示。
1.2.2 总体框图2 系统软件设计分析2.1年月日模块module r(clrn,clk,jn,jy,jr,qn,qy,qr); //年月日模块input clrn,clk,jn,jy,jr;output reg[15:0] qn;reg [15:0] qn1;output reg[7:0] qy,qr;reg clkn,clky;reg[7:0] date;reg clkn1,clkn2,clkn3;initial begin clkn1=1;clkn2=1;clkn3=1;endinitial begin qn='h2011;qn1=2011;qy=1;qr=1;endalways @(posedge (clk^jr) or negedge clrn)// 日计时模块beginif(~clrn)qr=1;else beginif(qr==date)begin qr=1; clky=1;endelse begin qr=qr+1;clky=0;endif(qr[3:0]=='ha)beginqr[3:0]=0;qr[7:4]=qr[7:4]+1;endendendalways @(posedge (clky^jy) or negedge clrn)//月计时模块 beginif(~clrn) qy=1;else beginif(qy=='h12) begin qy=1;clkn=1;endelse begin qy=qy+1;clkn=0;endif(qy[3:0]=='ha)beginqy[3:0]=0;qy[7:4]=qy[7:4]+1;endendendalwaysbegincase(qy)'h01:date='h31;'h02:beginif((qn1%4==0)&(qn1%100 != 0)|(qn1%400==0))date='h29;else date='h28;end'h03:date='h31;'h04:date='h30;'h05:date='h31;'h06:date='h30;'h07:date='h31;'h08:date='h31;'h09:date='h30;'h10:date='h31;'h11:date='h30;'h12:date='h31;default: date='h30;endcaseendalways @( posedge (clkn^jn) or negedge clrn) //年计时模块 beginif(~clrn)begin qn[3:0]=1;qn1=2011;endelse begin if(qn[3:0]==9)qn[3:0]=0;else begin qn[3:0]=qn[3:0]+1;qn1=qn1+1;endif(qn[3:0]==9)clkn1=0;else clkn1=1;endendalways @(posedge clkn1 or negedge clrn)beginif(~clrn)qn[7:4]=1;else begin if(qn[7:4]==9) qn[7:4]=0;else qn[7:4]=qn[7:4]+1;if(qn[7:4]==9) clkn2=0;else clkn2=1;endendalways @(posedge clkn2 or negedge clrn)beginif(~clrn)qn[11:8]=0;else begin if(qn[11:8]==9) qn[11:8]=0;else qn[11:8]=qn[7:4]+1;if(qn[11:8]==9) clkn3=0;else clkn3=1;endendalways @(posedge clkn3 or negedge clrn)beginif(~clrn)qn[15:12]=2;else if(qn[15:12]==9) qn[15:12]=0;else qn[15:12]=qn[15:12]+1;endendmodule2.2时分秒模块module cnt60(clk,clrn,j,q,cout);//分和秒计时input clk,clrn,j;output reg[7:0] q;output reg cout;always @(posedge clk^j or negedge clrn )beginif (~clrn) q=0;else beginif (q=='h59) begin q=0;cout=1;endelse begin q=q+1;cout=0;endif (q[3:0]=='ha) beginq[3:0]=0;q[7:4]=q[7:4]+1;endendendendmodulemodule cnt24(clk,clrn,j,q,cout);//小时计时input clk,clrn,j;output reg[7:0] q;output reg cout;always @(posedge clk^j or negedge clrn )beginif (~clrn) q=0;else beginif (q=='h23) begin q=0;cout=1;endelse begin q=q+1;cout=0;endif (q[3:0]=='ha) beginq[3:0]=0;q[7:4]=q[7:4]+1;endendendendmodule2.3控制模块module contr(clk,k1,k2,k);input clk,k1,k2;output reg k;reg [3:0] qc;reg rc;always @(posedge clk)begin qc=qc+1;if (qc<8) rc=0;else rc=1;case ({k1,k2})0:k=rc; //八秒显示年月日八秒显示时分秒的自由转换 1:k=0;//显示并且校准时分秒2:k=1; //显示并且校准年月日3:k=rc;endcaseendendmodule2.4显示模块module mux_16(k,qm,qf,qs,qr,qy,qn,q);input k;input [7:0]qm,qf,qs,qr,qy;input [15:0] qn;output reg [31:0]q;alwaysbeginif (k==0) beginq[31:24]=0;q[23:0]={qs,qf,qm};endelse q={qn,qy,qr};endendmodule2.5校时模块module mux_4(k,jm,jf,js,jr,jy,jn,j1,j2,j3); input k,j1,j2,j3;output reg jm,jf,js,jr,jy,jn;alwaysbeginif (k==0) {jm,jf,js}={j1,j2,j3};else {jr,jy,jn}={j1,j2,j3};endendmodule2.6闹钟模块module naozhong(qs,qf,led,zt);input zt;input[7:0] qs,qf;output led;reg led;alwaysbeginif (qs=='h06&&qf=='h01) //6:01闹钟开始闪烁led=1;elseled=0;if(zt==1) led=0; // 在任意时刻都可以关掉闹钟endendmodule2.7分频器模块module FENP(clk,newclk);input clk;output reg newclk;reg[24:0] cnter;always @(posedge clk)beginif(cnter<20000000) cnter=cnter+1;else cnter=0;if (cnter<10000000) newclk=1;elsenewclk=0;endendmodule3 系统测试(调试)3.1 测试仪器与设备计算机,EDA实训仪。
3.2 性能指标测试k1、k2控制分屏显示,当k1k2为00或11时是自动显示,控制数码显示用8秒时间显示年、月、日,另外8秒时间显示时、分、秒;当k1k2为01时,仅显示时、分、秒,同时j1、j2和j3校秒、校分和校时,当k1k2为10时,仅显示年、月、日,同时j1、j2和j3校年、月、日。
clkn清零功能。
3.3 结果分析各个功能的实现分开设计。
对于时分秒,则采用24进制和60进制,对于年月日的设计复杂点。