数字系统课程设计-万年历时钟 VHDL语言
用VHDL语言实现数字电子钟的设计(EDA课程设计报告-含源程序)
课程设计报告设计题目:用VHDL语言实现数字钟的设计班级:电子 0901学号: XXXXXXXX姓名:XXXXXXXXX指导教师:XXXXXXXXX设计时间:现代电子设计技术的核心已转向基于计算机的电子设计自动化技术,即EDA (Electronic Design Automation)技术。
EDA技术就是依赖计算机,在EDA工具软件平台上,对以硬件描述语言HDL(Hardware Description Language)为系统逻辑描述手段完成的设计文件,自动地完成逻辑编译、化简、分割、综合、布局布线以及逻辑优化和仿真测试,直至实现既定的电子线路系统功能。
EDA技术使得设计者的工作仅限于利用软件的方式,即利用硬件描述语言和EDA软件来完成对系统硬件功能的实现。
硬件描述语言是EDA技术的重要组成部分,常见的HDL语言有VHDL、Verilog、HDL、ABLE、AHDL、System Verilog和System C。
其中VHDL、Verilog在现在的EDA设计中使用最多,也拥有几乎所有主流EDA工具的支持。
VHDL语言具有很强的电路描述和建模能力,能从多个层次对数字系统进行建模和描述,从而大大简化硬件设计任务,提高了设计效率和可靠性。
在这次设计中,主要使用VHDL语言输入。
此次设计很好地完成了数字钟的定时、切换显示年月日和时分秒的功能,完成了小型FPGA的设计开发,锻炼了动手实践能力,达到了课程设计的目的。
关键词:EDA技术硬件描述语言VHDL 设计数字电子钟摘要 (2)1、课程设计目的 (4)2、课程设计内容及要求 (4)2.1 设计内容 (4)2.2 设计要求 (4)3、VHDL程序设计 (5)3.1 方案论证 (5)3.2 设计思路与方法 (6)3.2.1 设计思路 (6)3.2.2 设计方法 (7)4、仿真与分析 (7)5、器件编程下载及设计结果 (9)6、课程设计总结 (10)7、参考文献 (10)8、程序清单 (11)8.1 顶层模块 (11)8.2 秒脉冲模块 (13)8.3 数码管显示模块 (14)8.4 时分秒模块 (15)8.4.1 分秒模块 (16)8.4.2 小时模块 (18)8.5 年月日模块 (19)8.5.1 日期模块 (21)8.5.2 月份模块 (24)8.5.3 年份模块 (25)1、课程设计目的EDA技术课程设计在课程结束以后进行,在实践中验证理论知识,不仅是为了巩固课堂上所学知识,更是为了加深我们对EDA技术和VHDL语言的理解;为了让我们自己动手完成从设计输入、逻辑综合、功能仿真、设计实现到实现编程、时序仿真,一直到器件的下载测试的整个过程,真切感受利用EDA技术对FPGA进行设计开发的过程,锻炼和提高我们对器件的编程调试能力。
数字系统课程设计-万年历时钟 VHDL语言
process(clk,stop,rst)
variable ll:std_logic_vector(3 downto 0):="0000"; variable hh:std_logic_vector(3 downto 0):="0000"; begin if(rst='0')then ll:="0000";hh:="0000"; else if stop='0' then
是
个位 加一
进位 赋零
否
值为13?
是
判断 大小月 并赋 值输出
个十 位清零 进位 赋一
否 个位为10?
是
个位 清零十 位 加一
结束
图 10 月计数器算法流程图
图 11 月计数器 RTL 图 2.6 年计数器模块
年计数器模块为 1000 进制计数器,但其无进位输出。此外,该模块还负责 判断判断闰年还是平年,并将结果输出。其有两个输入和三个输出,其中 rst 起 复位作用,clk 为月计数器的进位,l 为个位输出,h 为十位输出,c 为进位输出,
6月14日6月22日项目设计开发环境使用25分设计任务功能理解与方案设计15分功能模块设计模块划分及编程设计30分功能仿真与调试10分设计报告及答辩20分合计100分得分1设计要求11设计任务设计制作一个基于lcd1602显示带有时间调整的万年历电子时钟
万年历电子时钟
--------------- 数字系统课程设计
port(rst,clk:in std_logic; l,h:out std_logic_vector(3 downto 0);
基于VHDL万年历的设计
数字万年历与数字钟的设计一、设计要求数字万年历要求可以任意设定年份月份和日期;当当日时钟走过24时(即0点)后,日期能够自动改变。
同样,当每月的最后一天走完后,月份也能够自动显示为下一个月。
年份的变化也是如此。
时钟计时按照一天24小时计。
时钟也可以按照由人工设定当前时间,或者修改当前时间,修改完成后,计时即有当前时间开始。
显示方式:日期为2001-11-08,时钟为hh-mm-ss;日期和时钟轮流显示。
二、设计原理本设计先用VHDL语言写出需要的各个小模块,并将这些模块进行编译并打包成图形文件,最后将这些图形文件在顶层文件里进行连线,实现具体要求与功能。
实验源程序:LIBRARY IEEE;USE IEEE.std_logic_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.std_logic_unsigned.ALL;ENTITY onesecond ISPORT (RESET: IN STD_LOGIC;GCLKP1: IN STD_LOGIC;clkout: out std_logic);END onesecond ;ARCHITECTURE Frequency_arch OF onesecond ISSIGNAL Period1S: STD_LOGIC;BEGINPROCESS( RESET, GCLKP1)VARIABLE Count1 : STD_LOGIC_VECTOR(25 DOWNTO 0); BEGINIF( GCLKP1'EVENT AND GCLKP1='1' ) THENIF( Count1>"10111110101111000010000000" ) THENCount1 := "00000000000000000000000000";ELSECount1 := Count1 + 1;END IF;Period1S <= Count1(25); -- 1MHzEND IF;clkout <= Period1S;end process;END Frequency_arch;60进制library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt60 isport(clk: in std_logic;ld: in std_logic;da,db:in std_logic_vector(3 downto 0);outb:out std_logic_vector(3 downto 0);c0: out std_logic);end cnt60;architecture one of cnt60 issignal ma,mb:std_logic_vector(3 downto 0);beginc0<='1' WHEN( ma=5 and mb=9 ) else '0' ; process(clk,ld)beginif clk'event and clk='1' thenif ld='1' thenma<=da;mb<=db;elsif ma=5 and mb=9 thenmb<="0000";ma<="0000";elsif mb=9 thenmb<="0000";ma<=ma+1;else mb<=mb+1;end if;end if;end process;outa<=ma;outb<=mb;end one;24进制程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt24 isport(clk: in std_logic;ld: in std_logic;da,db:in std_logic_vector(3 downto 0);outb:out std_logic_vector(3 downto 0);c0: out std_logic);end cnt24;architecture one of cnt24 issignal ma,mb:std_logic_vector(3 downto 0); beginc0<='1' WHEN( ma=2 and mb=3 ) else '0' ; process(clk,ld)beginif clk'event and clk='1' thenif ld='1' then ma<=da;mb<=db;elsif ma=2 and mb=3 thenmb<="0000";ma<="0000";elsif mb=9thenmb<="0000";ma<=ma+1;elsemb<=mb+1;end if;end if;end process;outa<=ma;outb<=mb;end one;天library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity day isport(clk:in std_logic;ld: in std_logic;maxday: in std_logic_vector(1 downto 0);da:in std_logic_vector(3 downto 0);db:in std_logic_vector(3 downto 0);outa:out std_logic_vector(3 downto 0);outb:out std_logic_vector(3 downto 0);c0: out std_logic);end day;architecture one of day issignal ma: std_logic_vector(3 downto 0);signal mb: std_logic_vector(3 downto 0);beginprocess(clk,ld)beginif clk'event and clk='1' thenif ld='1' then ma<=da;mb<=db;case maxday iswhen "00"=> --28if (ma=2 and mb=8)thenma<="0000";mb<="0001";c0<='1';else if mb=9 then mb<="0000";ma<=ma+1;c0<='0';else mb<=mb+1;c0<='0';end if;end if;when "01"=> -- 29if (ma=2 and mb=9)thenma<="0000";mb<="0001";c0<='1';else if mb=9 then mb<="0000";ma<=ma+1;c0<='0';else mb<=mb+1;c0<='0';end if;end if;when "10"=> -- 30if (ma=3 and mb=0)thenma<="0000";mb<="0001";c0<='1';else if mb=9 then mb<="0000";ma<=ma+1;c0<='0';else mb<=mb+1;c0<='0';end if;end if;when others => --31if (ma=3 and mb=1)thenma<="0000";mb<="0001";c0<='1';else if mb=9 then mb<="0000";ma<=ma+1;c0<='0';else mb<=mb+1;c0<='0';end if;end if;end case;end if;end if;end process;outa<=ma;outb<=mb;end one;月library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity yue isport(clk,ld:in std_logic;da: in std_logic_vector(3 downto 0);db: in std_logic_vector(3 downto 0);runnian:in std_logic;outa: out std_logic_vector(3 downto 0);outb: out std_logic_vector(3 downto 0);c0:out std_logic;maxday:out std_logic_vector(1 downto 0) );end yue;architecture one of yue issignal mb:std_logic_vector(3 downto 0);signal ma:std_logic_vector(3 downto 0);beginprocess(clk,ld)beginif (clk'event and clk='1') thenif ld='1' thenma<=da;mb<=db;if(ma=1 and mb=2)thenma<="0000";mb<="0001";elsif mb=9 thenmb<="0000";ma<=ma+1;elsemb<=mb+1;end if;end if;end if;end process;outa<=ma;outb<=mb;c0<='1' WHEN( ma=1 and mb=2 ) else '0' ;maxday <="00" when ma=0 and mb=2 and runnian='0' else "01" when ma=0 and mb=2 and runnian='1' else"10" when (ma=0 and mb=4)or(ma=0 and mb=6)or(ma=0 and mb=9)or(ma=1 and mb=1) else"11";end one;年library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity nian isport(ld1,ld2,clk:in std_logic;dy1,dy2:in std_logic_vector(3 downto 0);y1,y2,y3,y4:out std_logic_vector(3 downto 0);run,cout:out std_logic);end nian;architecture one of nian issignal q1,q2,q3,q4:std_logic_vector(3 downto 0); signal sum,sum1,sum2:std_logic_vector(1 downto 0); beginprocess(clk,ld1,ld2)beginif clk'event and clk='1' thenif ld1='1' thenq1<=dy1;q2<=dy2;elsif ld2='1' thenq3<=dy1;q4<=dy2;elseq1<=q1+1;if q1=9 thenq1<=(others=>'0');q2<=q2+1;end if;if q1=9 and q2=9 thenq1<=(others=>'0');q2<=(others=>'0');q3<=q3+1;end if;if q1=9 and q2=9 and q3=9 thenq1<=(others=>'0');q2<=(others=>'0');q3<=(others=>'0');q4<=q4+1;end if;if q2=9 and q1=9 and q3=9 and q4=9 thenq4<="0000";q3<="0000";q2<="0000";q1<="0000";cout<='1';else cout<='0';end if;end if;end if;end process ;with conv_integer(q4) selectsum1<="10" when 1|3|5|7|9,"00" when others;with conv_integer(q2) selectsum2<="10" when 1|3|5|7|9,"00" when others;process(q1,q2,q3,q4,sum1,sum2)beginif(q1="0000"and q2="0000")thensum<=sum1+q3(1 downto 0);elsesum<=sum2+q1(1 downto 0);end if;end process ;run<= '1' when sum="00" else '0';y1<=q1;y2<=q2;y3<=q3;y4<=q4;end one;置数选择程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity yima1 isport(x:in std_logic_vector(2 downto 0);y0,y1,y2,y3,y4,y5,y6,y7:out std_logic);end yima1;architecture a of yima1 issignal da:std_logic_vector(7 downto 0);beginwith x selectda<="00000001"when"000","00000010"when"001","00000100"when"010","00001000"when"011","00010000"when"100","00100000"when"101","01000000"when"110","10000000"when"111","00000000"when others;y0<=da(0);y1<=da(1);y2<=da(2);y3<=da(3);y4<=da(4);y5<=da(5);y6<=da(6);y7<=da(7);end a;显示library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity display isport(clk:in std_logic;c4:in std_logic;ya,yb,yc,yd,ma,mb,da,db,ha,hb,fa,fb,oa,ob:in std_logic_vector(3 downto 0);d0,d1,d2,d3,d4,d5,d6,d7:out std_logic_vector(0 to 6));end display;architecture one of display issignal w:std_logic;signal s0,s1,s2,s3,s4,s5,s6,s7:std_logic_vector(3 downto 0);beginprocess(clk,c4)beginif clk'event and clk='1' thencase c4 iswhen '1' => w<='0';--display hour fen minutewhen '0' => w<='1';--display year month daywhen others=> null;end case;end if;end process;process(clk,w,ya,yb,yc,yd,ma,mb,da,db,ha,hb,fa,fb,oa,ob) beginif clk'event and clk='1' thencase w iswhen '0' =>s0<=hb;s1<=ha;s2<="1111";s3<=fa;s4<=fb;s5<="1111";s6<=oa;s7<=ob;when others =>s0<=ya;s1<=yb;s2<=yc;s3<=yd;s4<=ma;s5<=mb;s6<=da;s7 <=db;end case;end if;end process;with s0 selectd0<= "0110000" when "0001","1101101" when "0010","1111001" when "0011","0110011" when "0100","1011011" when "0101","1011111" when "0110","1110000" when "0111","1111111" when "1000","1111011" when "1001","1111110" when others; with s1 selectd1<= "0110000" when "0001", "1101101" when "0010","1111001" when "0011","0110011" when "0100","1011011" when "0101","1011111" when "0110","1110000" when "0111","1111111" when "1000","1111011" when "1001","1111110" when others; with s2 selectd2<= "0110000" when "0001", "1101101" when "0010","1111001" when "0011","0110011" when "0100","1011011" when "0101","1011111" when "0110","1110000" when "0111","1111111" when "1000","1111011" when "1001","0000001" when "1111","1111110" when others; with s3 selectd3<= "0110000" when "0001", "1101101" when "0010","1111001" when "0011","0110011" when "0100","1011011" when "0101","1011111" when "0110","1110000" when "0111","1111111" when "1000","1111011" when "1001","1111110" when others; with s4 selectd4<= "0110000" when "0001", "1101101" when "0010","1111001" when "0011","0110011" when "0100","1011011" when "0101","1011111" when "0110","1110000" when "0111","1111111" when "1000","1111011" when "1001","1111110" when others; with s5 selectd5<= "0110000" when "0001", "1101101" when "0010","1111001" when "0011","0110011" when "0100","1011011" when "0101","1011111" when "0110","1110000" when "0111","1111111" when "1000","1111011" when "1001","0000001" when "1111","1111110" when others; with s6 selectd6<= "0110000" when "0001", "1101101" when "0010","1111001" when "0011","0110011" when "0100","1011011" when "0101","1011111" when "0110","1110000" when "0111","1111111" when "1000","1111011" when "1001","1111110" when others; with s7 selectd7<= "0110000" when "0001", "1101101" when "0010","1111001" when "0011","0110011" when "0100","1011011" when "0101","1011111" when "0110","1110000" when "0111","1111111" when "1000","1111011" when "1001","1111110" when others; end one;。
EDA数字钟课程设计--用VHDL语言实现数字钟的设计
课程设计报告设计题目:用VHDL语言实现数字钟的设计班级:电子1002班学号:20102625姓名:于晓指导教师:李世平、李宁设计时间:2012年12月摘要数字钟是一种用数字电路技术实现时、分、秒计时的钟表。
本设计主要是实现数字钟的功能,程序用VHDL语言编写,整体采用TOP-TO-DOWN设计思路,具有基本的显示年月日时分秒和星期的功能,此外还有整点报时功能。
该数字钟的实现程序分为顶层模块、年月模块、日模块、时分秒定时模块、数码管显示模块、分频模块、星期模块,此外还有一个库。
该程序主要是用了元件例化的方法,此外还有进程等重要语句。
没有脉冲时,显示时分秒,set按钮产生第一个脉冲时,显示年月日,第2个脉冲到来时可预置年份,第3个脉冲到来时可预置月份,依次第4、5、6、7、8个脉冲到来时分别可预置日期、时、分、秒、星期,第 9个脉冲到来时设置星期后预置结束,正常工作,显示的是时分秒和星期。
调整设置通过Up来控制,UP为高电平,upclk有脉冲到达时,预置位加1,否则减1。
当整点到达时,报时器会鸣响,然后手动按键停止报时。
关键词:数字钟,VHDL,元件例化,数码管1、课程设计目的掌握利用可编程逻辑器件和EDA设计工具进行电子系统设计的方法2、课程设计内容及要求设计实现一个具有带预置数的数字钟,具有显示年月日时分秒的功能。
用6个数码管显示时分秒,set按钮产生第一个脉冲时,显示切换年月日,第2个脉冲到来时可预置年份,第3个脉冲到来时可预置月份,依次第4、5、6、7个脉冲到来时分别可预置日期、时、分、秒,第 8个脉冲到来后预置结束,正常工作,显示的是时分秒。
Up为高电平时,upclk有脉冲到达时,预置位加1.否则减1,还可以在此基础上增加其它功能。
3、VHDL程序设计3.1整体设计思路本设计采用top-down 模式设计,分模块进行,各功能都使用元件例化方式设计,主要有LED显示模块、时分秒定时模块、日期模块、年月模块、分频模块、星期模块,此外还创建了一个程序包,用来实现年月日、时分秒的加减调整。
VHDL课程设计_001
VHDL 课程设计题目多功能万年历的数字钟设计专业名称学生姓名指导教师完成时间一:课程设计的任务设计一个多功能的数字时钟,具有以下功能:1. 正常的显示功能:显示AM、PM、时、分、秒(24进制或者12进制)。
2. 手动校时功能:按动方式键,将电路置于校时状态,则计时电路可用手动方式校准,每按一下校时键,时计数器加1;按动方式键,将电路置于校分状态,以同样方式手动校分。
按动按键有滴滴声,并且数码管显示的数字会闪动。
3. 万年历功能:显示年、月、日、星期、是否闰年。
4. 手动校正日历功能。
按动方式键,将电路置于校年状态,则计时电路可用手动方式校准,每按一下校年键,时计数器加1;按动方式键,将电路置于校月状态,以同样方式手动校月。
按动按键有滴滴声,并且数码管显示的数字会闪动。
5. 闹钟功能:按动方式键进入闹钟设定模块,设定闹钟时间。
闹铃信号到达播放音乐《两只蝴蝶》,按动停止键则立即停止播放音乐,若不按动停止键则自动播放音乐1分钟后停止。
6. 整点播报功能,从59分50秒开始发出播报,每隔2秒发出一声(信号名叫持续时间1秒,间隙1秒)连续发出5次,到达整点时停止播报。
7. 秒表功能:按动开始键开始计时,按动停止键数字保持不变,按动复位键从新计时二:系统设计根据以上对于多功能数字钟的功能的描述,可以将整个的电路设计分为以下几个模块:1.分频模块:由于实验电路板上所能提供的只有1Khz和6Mhz的信号,而本设计过程的即时以及跑表模块需要1hz、100hz和4hz的时钟信号。
2.控制模块:为达到多动能数字钟在计时、校时、显示日历、跑表等不同的模块之间切换,需要控制模块产生时序要不相冲突的控制信号,保证各个模块的功能有序的执行。
3.计时模块:在输入的1hz时钟信号,产生显示的AM、PM、时、分、秒信号,由于要涉及到后面的校时模块,这里采用带有置数的计时模块,在load信号控制下将校时模块设定的时间转载至初始值,在初始值的基础上正常计时。
vhdl万年历
一 VHDL实现万年历该数字时钟实现了调时、年、月、日、时、分、秒、星期的显示功能,无需接译码器,可直接接七段共阴极数码管,总体结构如下图所示:图一数字时钟RTL图1:CLK(时钟信号模块)如下所示:图二时钟产生模块RTL图其中,CLK为1MHZ的晶振输入,CLKN为正常工作时钟(1HZ),CLKS(2HZ)为时钟调整时所用时钟,CLK_SACN(1KHZ)为扫描显示输出模块所用时钟频率。
2:DISPLAY(扫描显示模块)如下图所示:图三扫描显示模块RTL图3:control(调整模式选择)模块如下所示:图四调整模式选择模块RTL图4:CLOCK(时钟模块如下所示)图五时钟模块RTL图二 VHDL实现万年历(控制模块)控制模块的RTL图如下所示:图一控制模块的RTL图波形仿真图:图二仿真时序图程序如下所示:library ieee;use ieee.std_logic_1164.all;entity control isport(set_mod:in std_logic;out_mod:buffer std_logic_vector(6 downto 0));end entity control;architecture bhv of control isbeginprocess(set_mod)variable mod_state:std_logic_vector(6 downto 0); variable count:integer range 0 to 1;variable temp:std_logic;beginif rising_edge(set_mod) thenif count=0 thenmod_state:="1000000";count:=count+1;elsetemp:=mod_state(0);mod_state(5 downto 0):=mod_state(6 downto 1); mod_state(6):=temp;end if;out_mod<=mod_state;end if;end process;end architecture bhv;VHDL实现万年历(七段译码器)其段译码器的RTL图如下所示:TMV视图如下图所示:程序代码如下所示:library ieee;use ieee.std_logic_1164.all;entity seg7 isport(din:in std_logic_vector(3 downto 0); dout:out std_logic_vector(6 downto 0)); end entity seg7;architecture bhv of seg7 isbegindout<="1111110" when din="0000" else "0110000" when din="0001" else "1101101" when din="0010" else "1111001" when din="0011" else "0110011" when din="0100" else "1011011" when din="0101" else "1011111" when din="0110" else "1110000" when din="0111" else "1111111" when din="1000" else "1111011" when din="1001" else "0000000" ;end architecture bhv;4 VHDL实现万年历(扫描模块)扫描模块的RTL图如下所示:TMV图如下所示:程序代码如下所示:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity scan isport(clk_scan:in std_logic;s_in:in std_logic_vector(7 downto 0);minute_in:in std_logic_vector(7 downto 0);h_in:in std_logic_vector(7 downto 0);d_in:in std_logic_vector(7 downto 0);month_in:in std_logic_vector(7 downto 0);y_in:in std_logic_vector(7 downto 0);w_in:in std_logic_vector(3 downto 0);time_out:out std_logic_vector(51 downto 0));end entity scan;architecture bhv of scan isbegin----------process(clk_scan,s_in,minute_in,h_in,d_in,w_in,month_in,y_in) variable count:std_logic_vector(3 downto 0);beginif rising_edge(clk_scan) thenif (count="0000") thentime_out<=(others=>'0');time_out(3 downto 0)<=s_in(3 downto 0);count:=count+1;elsif (count="0001") thentime_out<=(others=>'0');time_out(7 downto 4)<=s_in(7 downto 4);count:=count+1;elsif (count="0010") thentime_out<=(others=>'0');time_out(11 downto 8)<=minute_in(3 downto 0);count:=count+1;elsif (count="0011") thentime_out<=(others=>'0');time_out(15 downto 12)<=minute_in(7 downto 4);count:=count+1;elsif (count="0100") thentime_out<=(others=>'0');time_out(19 downto 16)<=h_in(3 downto 0);count:=count+1;elsif (count="0101") thentime_out<=(others=>'0');time_out(23 downto 20)<=h_in(7 downto 4);count:=count+1;elsif (count="0110") thentime_out<=(others=>'0');time_out(27 downto 24)<=d_in(3 downto 0);count:=count+1;elsif (count="0111") thentime_out<=(others=>'0');time_out(31 downto 28)<=d_in(7 downto 4);count:=count+1;elsif (count="1000") thentime_out<=(others=>'0');time_out(35 downto 32)<=w_in(3 downto 0);count:=count+1;elsif (count="1001") thentime_out<=(others=>'0');time_out(39 downto 36)<=month_in(3 downto 0); count:=count+1;elsif (count="1010") thentime_out<=(others=>'0');time_out(43 downto 40)<=month_in(7 downto 4); count:=count+1;elsif (count="1011") thentime_out<=(others=>'0');time_out(47 downto 44)<=y_in(3 downto 0);count:=count+1;elsetime_out<=(others=>'0');time_out(51 downto 48)<=y_in(7 downto 4);count:="0000";end if;end if;end process;end architecture bhv;。
基于vhdl万年历设计说明书
目录摘要......................................... (错误!未定义书签。
) Abstract . (1)绪论.......................................... (错误!未定义书签。
)第1章基本概念简介. (2)1.1 EDA技术和FPGA/CPLD简介 (2)1.2 VHDL的简介 (3)1.3 Quartus II的简介 (4)第2章系统设计 (5)2.1 设计思想 (5)2.2 设计原理图 (6)2.3 设计流程图 (6)第3章模块分析 (7)3.1 计数器模块分析 (7)3.1.1 秒和分计数器模块 (7)3.1.2 时计数器模块 (8)3.1.3 日计数器模块 (9)3.1.4 月计数器模块 (12)3.1.5 年计数器模块 (14)3.2 校时模块 (16)3.3 显示及显示方式切换模块 (18)3.4 顶层原理图 (20)第4章引脚设定与验证 (21)4.1 引脚设定 (21)4.2 下载验证 (23)总结 (23)参考文献 (25)致谢.......................................... (错误!未定义书签。
)摘要随着EDA(电子设计自动化)技术的发展和应用领域的扩大,EDA技术在电子信息、通信、自动化控制及计算机应用领域的重要性日益突出。
EDA技术作为现代电子设计技术的核心,它依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言HDL (Hardware Description language)为系统逻辑描述手段完成的设计文件,自动完成逻辑化简、逻辑分割、逻辑综合(布局布线)、逻辑优化和仿真测试等项功能,直至实现既定性能的电子线路系统功能。
EDA的关键技术之一是用形式化方法来描述数字系统的硬件电路、即用所谓的硬件描述语言来描述硬件电路。
本设计是基于VHDL语言的万年历。
vhdl多功能数字万年历 百度文库
vhdl多功能数字万年历全部源代码,已调试成功基本要求:采用VHDL硬件描述语言或者电路图描述的方式完成设计。
1)设计一个万年历系统,可现实从秒到年的计数功能;2)由于开仅具备四位数码管,因此需要进行功能切换,即利用开发板上的一个按键完成小时/分钟、月/日、年等三种显示的切换。
3)秒计数采用开发板上独立的LED以秒闪进行显示;4)同时切换设置模式与显示模式(一个按键完成切换),完成每个显示的增减设置(两个按键实现增减)。
说明:基本要求不需要提供闰月识别功能。
发挥要求:1)提供整点时间报警功能;2)提供闹钟功能;3)提供闰月检测功能;4)以7个独立的LED显示星期。
全部源代码如下,已调试成功1,将50mhz转为1ms时钟count LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY count ISPORT(clk :IN STD_LOGIC;co:OUT STD_LOGIC);END count;ARCHITECTURE behav OF count ISsignal count1 : integer range 0 to 49999 ; BEGINPROCESS(clk)BEGINIF rising_edge(clk) THENcount1<=count1+1;if count1=49999 thencount1<=0;co<='1';else co<='0';end if;end if;end process;end behav;2.秒模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY second ISPORT(clk :IN STD_LOGIC;sec :OUT integer range 0 to 59;miao:out std_logic;co:OUT STD_LOGIC);END second;ARCHITECTURE behav OF second IS signal sect : integer range 0 to 59;signal temp : integer range 0 to 1000;BEGINprocess(clk)beginIF rising_edge(clk) THENif temp=1000 then temp<=0;if sect=59 thensect<=0;co<='1';else sect<=sect+1;co<='0';end if;else temp<=temp+1;co<='0';end if;end if;end process;process(temp,sect)beginif temp<500 thenmiao<='1';else miao<='0';end if;sec<=sect;end process;end behav;3.分模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY cent ISPORT(clk,seco,centkeyadd,centkeysub:IN STD_LOGIC;cent: out integer range 0 to 59;co:OUT STD_LOGIC);END cent;ARCHITECTURE behav OF cent ISsignal centt: integer range 0 to 59;beginprocess(clk,seco)beginif rising_edge(clk)thenif seco='1' thenif centt=59 then centt<=0;co<='1';else centt<=centt+1;co<='0';end if;elsif centkeyadd='0' thenif centt=59 then centt<=0;else centt<=centt+1;end if;elsif centkeysub='0' thenif centt=0 then centt<=59;else centt<=centt-1;end if;else co<='0';end if;end if;end process;cent<=centt;end behav;4.时模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY hour ISPORT(clk,cento,hourkeyadd,hourkeysub:IN STD_LOGIC;hour: out integer range 0 to 23;co:OUT STD_LOGIC);END hour;ARCHITECTURE behav OF hour ISsignal hourt: integer range 0 to 59:=9;beginprocess(clk,cento)beginif rising_edge(clk)thenif cento='1' thenif hourt=23 then hourt<=0;co<='1';else hourt<=hourt+1;co<='0';end if;elsif hourkeyadd='0' thenif hourt=23 then hourt<=0;else hourt<=hourt+1;end if;elsif hourkeysub='0' thenif hourt=0 then hourt<=23;else hourt<=hourt-1;end if;else co<='0';end if;end if;end process;hour<=hourt;end behav;5.日模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY day ISPORT(clk,houro,daykeyadd,daykeysub:IN STD_LOGIC;yue:in integer range 1 to 31;day :OUT integer range 1 to 31;co:OUT STD_LOGIC);END day;ARCHITECTURE behav OF day ISsignal dayt: integer range 0 to 31:=24;signal yuet: integer range 1 to 31;beginyuet<=yue;process(clk,houro)beginif rising_edge(clk)thenif houro='1' thenif dayt=yuet then dayt<=1;co<='1';else dayt<=dayt+1;end if;elsif daykeyadd='0' thenif dayt=yuet then dayt<=1;else dayt<=dayt+1;end if;elsif daykeysub='0' thenif dayt=1 then dayt<=yuet;else dayt<=dayt-1;end if;else co<='0' ;end if;end if;end process;day<=dayt;end behav;6.月模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY month ISPORT(clk,dayo,monthkeyadd,monthkeysub,run:IN STD_LOGIC;month: out integer range 1 to 12;yue:out integer range 1 to 31;co:OUT STD_LOGIC);END month;ARCHITECTURE behav OF month ISsignal montht: integer range 1 to 12:=2;beginprocess(clk,dayo)beginif rising_edge(clk)thenif dayo='1' thenif montht=12 then montht<=1;co<='1';else montht<=montht+1;end if;elsif monthkeyadd='0' thenif montht=12 then montht<=1;else montht<=montht+1;end if;elsif monthkeysub='0' thenif montht=1 then montht<=12;else montht<=montht-1;end if;else co<='0';end if;end if;end process;month<=montht;--闰月检测功能process(montht,run)beginCASE montht ISWHEN 2=>if run='1' then yue<=29;else yue<=28;end if; --—二月WHEN 3=>yue<=30; --四月WHEN 6=>yue<=30; --六月WHEN 9=>yue<=30; --WHEN 11=>yue<=30; --十一月WHEN others=>yue<=31;END CASE;END PROCESS;END behav;3.年模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY year ISPORT(clk,montho,yearkeyadd,yearkeysub:IN STD_LOGIC;year :out integer range 0 to 99;run:OUT STD_LOGIC);END year;ARCHITECTURE behav OF year ISsignal yeart: integer range 0 to 59:=13;beginprocess(clk,montho)beginif rising_edge(clk)thenif montho='1' thenif yeart=59 then yeart<=0;else yeart<=yeart+1;end if;elsif yearkeyadd='0' thenif yeart=59 then yeart<=0;else yeart<=yeart+1;end if;elsif yearkeysub='0' thenif yeart=0 then yeart<=59;else yeart<=yeart-1;end if;end if;end if;end process;year<=yeart;process(yeart)beginif (yeart mod 4)=0 thenrun<='1';else run<='0';end if;end process;end behav;9.显示模块--显示模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY display ISPORT(sec,cent : in integer range 0 to 59;hour :in integer range 0 to 23;day: in integer range 1 to 31;month:in integer range 1 to 12;year:in integer range 0 to 99;cento,houro,clk,key0,key1,key2,key3 :IN STD_LOGIC;dis:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);centkeyadd,centkeysub,hourkeyadd,hourkeysub,daykeyadd,daykeysu b,monthkeyadd,monthkeysub: out std_logic;--加减控制输出yearkeyadd,yearkeysub: out std_logic;dis1en,dis2en,dis3en,dis4en,beep: out std_logic;--数码管使能,设置指示,蜂鸣器输出ledweekend:out std_logic_vector(6 downto 0));END display;ARCHITECTURE behav OF display IStype state_type is(s0,s1,s2,s3,s4);signal pre_s,next_s : state_type;type state is(c1,c2,c3,c4);signal pre_c,next_c : state;constant led0 : std_logic_vector(7 downto 0):="11000000";constant led1 : std_logic_vector(7 downto 0):="11111001";constant led2 : std_logic_vector(7 downto 0):="10100100";constant led3 : std_logic_vector(7 downto 0):="10110000";constant led4 : std_logic_vector(7 downto 0):="10011001";constant led5 : std_logic_vector(7 downto 0):="10010010";constant led6 : std_logic_vector(7 downto 0):="10000010";constant led7 : std_logic_vector(7 downto 0):="11111000";constant led8 : std_logic_vector(7 downto 0):="10000000";constant led9 : std_logic_vector(7 downto 0):="10010000";signal count1: integer range 0 to 99;signal count2: integer range 0 to 99;signal count3: integer range 0 to 99;signal count4: integer range 0 to 99;signal set:std_logic_vector(1 downto 0):="00";signal weekend: std_logic_vector(6 downto 0):="0000001";signal acentadd,acentsub,ahouradd,ahoursub :std_logic:='0';signal ahour,acent,centadd,centsub,houradd,hoursub: integer range 0 to 59;signal weekendset:std_logic:='1';signalcentl,centh,hourl,hourh,dayl,dayh,monthl,monthh,yearl,yearh:integer range 0 to 9;signal sec1,sec2,sec3,sec4,acentl,acenth,ahourl,ahourh:integer range 0 to 9;begin--界面转换状态机process(key0)beginif falling_edge(key0) thenpre_s<=next_s;end if;end process;--扫描状态机process(clk)beginif rising_edge(clk) thenpre_c<=next_c;end if;end process;process(key1)beginif falling_edge(key1) thenif set=2 thenset<="00";elseset<=set+1;end if;end if;end process;centl<=cent mod 10; centh<=cent/10;hourl<=hour mod 10; hourh<=hourh/10;dayl<=day mod 10; dayh<=day/10;monthl<=month mod 10; monthh<=month/10;yearl<=year mod 10; yearh<=year/10;acentl<=acent mod 10; acenth<=acent/10;ahourl<=ahour mod 10; ahourh<=ahourh/10;--显示切换状态机p1:process(pre_s,set,centl,centh,hourl,hourh,dayl,dayh,monthl,monthh,yearl, yearh,key2,key3,acentl,acenth,ahourl,ahourh)begincase pre_s iswhen s0 => count4<=centl; count3<=centh;--显示时钟count2<=hourl; count1<=hourh;next_s<=s1;weekendset<='1';daykeyadd<='1';daykeysub<='1';monthkeyadd<='1';monthkeysub<='1';yearkeyadd<='1';yearkeysub<='1';acentadd<='1';acentsub<='1';ahouradd<='1';ahoursub<='1';if set=1 then centkeyadd<=key2;centkeysub<=key3;hourkeyadd<='1';hourkeysub<='1' ;elsif set=2 then hourkeyadd<=key2;hourkeysub<=key3;centkeyadd<='1';centkeysub<='1' ;else centkeyadd<='1';centkeysub<='1'; hourkeyadd<='1';hourkeysub<='1';end if;when s1=> count4<=dayl; count3<=dayh;--显示日期count2<=monthl; count1<=monthh;next_s<=s2;weekendset<='1';centkeyadd<='1';centkeysub<='1';hourkeyadd<='1';hourkeysub<='1';yearkeyadd<='1';yearkeysub<='1';acentadd<='1';acentsub<='1';ahouradd<='1';ahoursub<='1';if set=1 then daykeyadd<=key2;daykeysub<=key3;monthkeyadd<='1';monthkeysub<= '1';elsif set=2 then monthkeyadd<=key2;monthkeysub<=key3;daykeyadd<='1';daykeysub<= '1';elsedaykeyadd<='1';daykeysub<='1';monthkeyadd<='1';monthkeysub<='1';end if;when s2 => count4<=yearl; count3<=yearh;--显示年份count2<=0; count1<=2;next_s<=s3; weekendset<='1';daykeyadd<='1';daykeysub<='1';monthkeyadd<='1';monthkeysub<='1';centkeyadd<='1';centkeysub<='1'; hourkeyadd<='1';hourkeysub<='1';acentadd<='1';acentsub<='1';ahouradd<='1';ahoursub<='1';if set=1 or set=2 then yearkeyadd<=key2;yearkeysub<=key3;else yearkeyadd<='1';yearkeysub<='1';end if;when s3 => count4<=1; count3<=1;--星期控制状态count2<=1; count1<=1;next_s<=s4;daykeyadd<='1';daykeysub<='1';monthkeyadd<='1';monthkeysub<='1';centkeyadd<='1';centkeysub<='1'; hourkeyadd<='1';hourkeysub<='1';acentadd<='1';acentsub<='1';ahouradd<='1';ahoursub<='1';yearkeyadd<='1';yearkeysub<='1';weekendset<='0';when s4 => count4<=acentl; count3<=acenth;--闹钟设置状态count2<=ahourl; count1<=ahourh;next_s<=s0;daykeyadd<='1';daykeysub<='1';monthkeyadd<='1';monthkeysub<='1';centkeyadd<='1';centkeysub<='1'; hourkeyadd<='1';hourkeysub<='1';yearkeyadd<='1';yearkeysub<='1';weekendset<='1';if set=1 then acentadd<=key2;acentsub<=key3; ahouradd<='1';ahoursub<='1';elsif set=2 then ahouradd<=key2;ahoursub<=key3;acentadd<='1';acentsub<='1';else acentadd<='1';acentsub<='1'; ahouradd<='1';ahoursub<='1';end if;end case;end process;--闹钟功能process(clk,acent,centadd,centsub)beginif rising_edge(clk) thenif acent=59 thenacent<=0;elseacent<=centadd-centsub;end if;end if;end process;process(acentadd)beginif falling_edge(acentadd)thenif acent<60 thencentadd<=centadd+1;else centadd<=0;end if;end if;end process;process(acentsub)beginif falling_edge(acentsub)thenif acent<60 thenif acent>0 thencentsub<=centsub+1;else null;end if;else centsub<=0;end if;end if;end process;process(clk,ahour,houradd,hoursub)beginif rising_edge(clk) thenif ahour=23 thenahour<=0;else ahour<=houradd-hoursub; end if;end if;end process;process(ahouradd)beginif falling_edge(ahouradd)thenif ahour<23 thenhouradd<=houradd+1;else houradd<=0;end if;end if;end process;process(ahoursub)beginif falling_edge(ahoursub)thenif ahour<23 thenif ahour>0 thenhoursub<=hoursub+1;else null;end if;else hoursub<=0;end if;end if;end process;--闹钟process(clk,cent,hour,acent,ahour)variable acount: integer range 0 to 30; beginif rising_edge(clk) thenif acent=cent and ahour=hour thenbeep<='0' ;elsif cento='1' thenbeep<='0';else beep<='1';end if;end if;end process;--星期显示和设置process(weekendset,clk,key2,key3)beginif rising_edge(clk) thenif weekend="0000000" thenweekend<="0000001";elsif houro='1' thenweekend<=weekend(5 downto 0)&'0';elsif weekendset='0' thenif key2='0' thenweekend<=weekend(5 downto 0)&'0';elsif key3='0' thenweekend<='0'&weekend(6 downto 1);end if;else null;end if;end if;end process;ledweekend<=weekend;p3: process(pre_c,count4,count3,count2,count1)begincase pre_c iswhen c1=>next_c<=c2;dis1en<='1';dis2en<='1';dis3en<='1';dis4en<='0';case count4 iswhen 0 => dis<=led0;when 1 => dis<=led1;when 2 => dis<=led2;when 3 => dis<=led3;when 4 => dis<=led4;when 5 => dis<=led5;when 6 => dis<=led6;when 7 => dis<=led7;when 8 => dis<=led8;when 9 => dis<=led9;when others => dis<=led0;end case;when c2 =>next_c<=c3;dis1en<='1';dis2en<='1';dis3en<='0';dis4en<='1';case count3 iswhen 0 => dis<=led0;when 1 => dis<=led1;when 2 => dis<=led2;when 3 => dis<=led3;when 4 => dis<=led4;when 5 => dis<=led5;when 6 => dis<=led6;when 7 => dis<=led7;when 8 => dis<=led8;when 9 => dis<=led9;when others => dis<=led0;end case;when c3 =>next_c<=c4;dis1en<='1';dis2en<='0';dis3en<='1';dis4en<='1';case count2 iswhen 0 => dis<=led0;when 1 => dis<=led1;when 2 => dis<=led2;when 3 => dis<=led3;when 4 => dis<=led4;when 5 => dis<=led5;when 6 => dis<=led6;when 7 => dis<=led7;when 8 => dis<=led8;when 9 => dis<=led9;when others => dis<=led0;end case;when c4 =>next_c<=c1;dis1en<='0';dis2en<='1';dis3en<='1';dis4en<='1';case count1 iswhen 0 => dis<=led0;when 1 => dis<=led1;when 2 => dis<=led2;when 3 => dis<=led3;when 4 => dis<=led4;when 5 => dis<=led5;when 6 => dis<=led6;when 7 => dis<=led7;when 8 => dis<=led8;when 9 => dis<=led9;when others => dis<=led0;end case;end case;end process;end behav;10.顶层文件LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY calendar ISPORT(clk,key0,key1,key2,key3:IN STD_LOGIC;dis1en,dis2en,dis3en,dis4en,setled,beep: out std_logic;dis:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);ledweekend:out std_logic_vector(6 downto 0));END calendar;ARCHITECTURE behav OF calendar IScomponent keyPORT(CLK,kin:IN STD_LOGIC;kout:OUT STD_LOGIC);END component;component countPORT(clk :IN STD_LOGIC;co:OUT STD_LOGIC);END component;component secondPORT(clk :IN STD_LOGIC;sec :OUT integer range 0 to 59;miao:out std_logic;co:OUT STD_LOGIC);END component;component centPORT(clk,seco,centkeyadd,centkeysub:IN STD_LOGIC;cent: out integer range 0 to 59;co:OUT STD_LOGIC);END component;component hourPORT(clk,cento,hourkeyadd,hourkeysub:IN STD_LOGIC;hour: out integer range 0 to 23;co:OUT STD_LOGIC);END component;component dayPORT(clk,houro,daykeyadd,daykeysub:IN STD_LOGIC;yue:in integer range 1 to 31;day :OUT integer range 1 to 31;co:OUT STD_LOGIC);END component;component monthPORT(clk,dayo,monthkeyadd,monthkeysub,run:IN STD_LOGIC;month: out integer range 1 to 12;yue:out integer range 1 to 31;co:OUT STD_LOGIC);END component;component yearPORT(clk,montho,yearkeyadd,yearkeysub:IN STD_LOGIC;year :out integer range 0 to 99;run:OUT STD_LOGIC);END component;component displayPORT(sec,cent : in integer range 0 to 59;hour :in integer range 0 to 23;day: in integer range 1 to 31;month:in integer range 1 to 12;year:in integer range 0 to 99;cento,houro,clk,key0,key1,key2,key3 :IN STD_LOGIC;dis:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);centkeyadd,centkeysub,hourkeyadd,hourkeysub,daykeyadd,daykeysu b,monthkeyadd,monthkeysub: out std_logic;--加减控制输出yearkeyadd,yearkeysub: out std_logic;dis1en,dis2en,dis3en,dis4en,beep: out std_logic;--数码管使能,设置指示,蜂鸣器输出ledweekend:out std_logic_vector(6 downto 0));END component;signal counto,seco,cento,houro,dayo,montho,runo,miaoo : std_logic; signal yueo: integer range 0 to 31;--up is componentsignal secout,centout :integer range 0 to 59;signal hourout:integer range 0 to 59;signal dayout:integer range 1 to 31;signal monthout:integer range 1 to 12;signal yearout: integer range 0 to 99;signalcentkeyaddo,centkeysubo,hourkeyaddo,hourkeysubo,daykeyaddo,daykey subo,monthkeyaddo,monthkeysubo: std_logic;signal yearkeyaddo,yearkeysubo,key0o,key1o,key2o,key3o: std_logic ; beginu0: count port map(clk,counto);u1: second port map(counto,secout,miaoo,seco);u2: cent port map(counto,seco,centkeyaddo,centkeysubo,centout,cento);u3: hour port map(counto,cento,hourkeyaddo,hourkeysubo,hourout,houro);u4: day port map(counto,houro,daykeyaddo,daykeysubo,yueo,dayout,dayo);u5: month port map(counto,dayo,monthkeyaddo,monthkeysubo,runo,monthout,yueo,mo ntho);u6: year port map(counto,montho,yearkeyaddo,yearkeysubo,yearout,runo);u7: display port map(secout,centout,hourout,dayout,monthout,yearout,cento,houro,counto ,key0o,key1o,key2o,key3o,dis,centkeyaddo,centkeysubo,hourkeyaddo,hourkeysubo,daykeyaddo,daykeysubo,monthkeyaddo,monthkeysubo,yearkeyaddo,yearkeysubo,dis1en,dis2en,dis3en,dis4en,beep,ledweekend); setled<=miaoo;u9: key port map(counto,key0,key0o);u10: key port map(counto,key1,key1o);u11: key port map(counto,key2,key2o);u12: key port map(counto,key3,key3o);end behav;。
VHDL设计FPGA数字系统:电子万年历.
大连海事大学毕业论文Array二○一四年六月VHDL设计FPGA数字系统:电子万年历专业班级: 电子信息工程10-2班姓名: 牛舒雅指导老师: 严飞信息科学技术学院摘要随着EDA(电子设计自动化)技术的发展和应用领域的扩大,EDA技术在电子信息、通信、自动化控制及计算机应用领域的重要性日益突出。
钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能,诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭路灯等。
所有这些,都是以钟表数字化为基础的。
因此,研究基于FPGA的电子万年历及扩大其应用,有非常现实的意义。
EDA的关键技术之一是用形式化方法来描述数字系统的硬件电路、即用所谓的硬件描述语言来描述硬件电路。
本设计是用VHDL语言编程实现基于FPGA的电子万年历。
在设计中,首先介绍了万年历的设计思路,确定各功能模块,而后在Quartus II开发环境中用VHDL语言对各模块进行编程,编译成功后完成仿真,并逐一调试程序使各模块达到设计目的。
然后,将各模块生成的元器件连接起来,形成顶层原理图文件,进行系统仿真。
最后,对顶层原理图进行引脚设定,并下载到试验箱验证,证明系统的可行性。
关键字:EDA;VHDL ;万年历;Quartus IIABSTRACTWith the development of EDA (electronic design automation) technology and expansion of application fields ,the importance of EDA technology in electronic information, communication, auto control, and computer applications is becoming increasingly prominent. EDA technology is the core of the modern electronic design techniques, which rely on powerful computers . In EDA tools software platform, computer automatically completes logic simplification,logical partitions, logic synthesis , logic optimization ,logical simulation and other functions until the electronic circuit system achieves the stated performance. However, the realization of these function bases on the description of the system using the hardware description language HDL (Hardware Description language) . One of the key technologies of the EDA is to use formal methods to describe digital systems hardware circuit, which uses the so-called hardware description language to describe the hardware circuit.The design is the calendar based on VHDL language. Firstly, in which ,I introduce ideas about designing the calendar. In addition, I compile and simulate the program of different modules in the Quartus II development environment and debug one by one to make different modules meet objectives of the design. Secondly, I take advantage of all components,which is created according to program to generate top-level file . Finally, I make pin settings and download to the test chamber to prove the feasibility of the system.Key words: EDA;VHDL ;calendar;Quartus II目录第1章绪论 (1)1.1钟的起源 (1)1.2钟的现状以及发展 (1)1.3电子万年历的简介 (1)1.4VHDL设计FPGA数字系统:电子万年历的设计要求 (2)1.5 本章小结 (2)第2章开发技术基础 (3)2.1 EDA技术简介 (3)2.1.1 EDA技术基本概述 (3)2.1.2EDA技术发展与发展方向 (3)2.2FPGA基本介绍 (4)2.2.1FPGA简介 (4)2.2.1FPGA组成 (5)2.3VHDL语言概述 (5)2.3.1VHDL语言特点 (6)2.3.2VHDL语言结构 (7)2.4Quartus II软件介绍 (7)2.5ZY11EDA13BE实验系统介绍 (8)2.5.1 ZY11EDA13BE实验系统的特点 (8)2.5.2ZY11EDA13BE实验系统主板组成 (8)2.6本章小结 (9)第3章电子万年历的设计 (10)3.1设计思想 (10)3.2 设计框图 (11)3.3 设计流程图 (12)3.4 本章小结 (15)第4章电子万年历的设计、仿真与展示 (16)4.1 模块分析 (16)4.1.1 秒与分的计数器模块 (16)4.1.3 日计数器模块 (18)4.1.4月计数器模块 (21)4.1.5年低位计数器模块 (22)4.1.6年高位计数器模块 (23)4.1.7校准模块 (24)4.1.8 显示以及显示内容切换模块 (26)4.2顶层原理图 (27)4.3 管脚锁定 (29)4.4电子万年历的展示 (29)4.5本章小结 (30)第5章总结 (31)参考文献 (32)致谢 (33)第1章绪论1.1钟的起源中国古代很早就用日晷计时。
基于VHDL的简易数字钟
课程设计报告设计题目:基于VHDL语言的简易数字钟设计摘要随着电子设计自动化技术(EDA)的进步,数字电路在实际生活当中已经占据了重要的位置。
在EDA技术中,最为瞩目的是以现代电子技术为特征的逻辑设计仿真测试技术。
该技术的出现,使电子系统设计发生了质的变化。
设计速度快、体积小、重量轻、功耗小的集成电路已成为趋势。
用VHDL 语言开发的数字电路,大大简化了对工控电路的设计并且减低了成本。
本文介绍了利用VHDL硬件描述语言设计一款多功能数字钟的方法。
可以实现显示、预置时分秒,年月日(可以准确显示每月天数,包括对闰年的计算);秒表;整点报时的功能。
利用6个7段数码管显示时分秒或年月日。
在Quartus II 开发环境下编译仿真了设计的程序。
仿真结果表明,该设计方法切实可行,具有一定的借鉴性。
关键词:EDA,VHDL,数字钟,Quartus II目录摘要I一、课程设计目的 1二、课程设计内容及要求 12.1 设计内容12.2设计要求 12.3发挥部分1三、VHDL程序设计 13.1整体介绍 13.2时钟模块 23.3日期模块23.4整点报时模块33.5秒表模块4四、仿真与分析 5五、器件编程下载及设计结果 5六、课程设计总结 5七、参考文献 6八、附录7一、课程设计目的掌握利用可编程逻辑器件和EDA设计工具进行电子系统设计的方法二、课程设计内容及要求2.1设计内容用VHDL语言实现数字钟的设计,要求设计实现一个具有带预置数的数字钟,具有显示年月日时分秒的功能。
2.2设计要求用6个数码管显示时分秒,set按钮产生第一个脉冲时,显示切换年月日,第2个脉冲到来时可预置年份,第3个脉冲到来时可预置月份,依次第4、5、6、7个脉冲到来时分别可预置日期、时、分、秒,第 8个脉冲到来后预置结束,正常工作,显示的是时分秒。
Up为高电平时,upclk有脉冲到达时,预置位加1.否则减1.2.3发挥部分本设计除满足基本要求外,还实现了秒表及整点报时的功能。
基于-VHDL语言实现数字电子钟设计
基于VHDL语言实现数字电子钟的设计一.设计要求:1、设计容选用适宜的可编程逻辑器件及外围电子元器件,设计一个数字电子钟,利用EDA软件〔QUARTUS Ⅱ〕进展编译及仿真,设计输入可采用VHDL硬件描述语言输入法〕和原理图输入法,并下载到EDA实验开发系统,连接外围电路,完成实际测试。
2、设计要求〔1〕具有时、分、秒计数显示功能。
〔2〕具有清零的功能,且能够对计时系统的小时、分钟进展调整。
〔3〕小时为十二小时制。
二.实验目的:1.通过这次EDA设计中,提高手动能力。
2.深入了解时事时钟的工作原理,以及时事时钟外围硬件设备的组成。
3.掌握多位计数器相连的设计方法。
4.掌握十进制,六进制,二十四进制计数器的设计方法。
5.继续稳固多位共阴极扫描显示数码管的驱动,及编码。
6.掌握扬声器的驱动。
7.LED灯的把戏显示。
8.掌握CPLD技术的层次化设计方法三.实验方案:数字系统的设计采用自顶向下、由粗到细, 逐步分解的设计方法, 最顶层电路是指系统的整体要求, 最下层是具体的逻辑电路的实现。
自顶向下的设计方法将一个复杂的系统逐渐分解成假设干功能模块, 从而进展设计描述, 并且应用EDA 软件平台自动完成各功能模块的逻辑综合与优化, 门级电路的布局, 再下载到硬件中实现设计。
因此对于数字钟来说首先是时分秒的计数功能,然后能显示,附带功能是清零、调整时分。
通过参考EDA 课程设计指导书,现有以下方案:1.作为顶层文件有输入端口:时钟信号,清零按键,调时按键,调分按键;输出端口有:用于接数码管的八段码输出口,扫描用于显示的六个数码管的输出口。
2.底层文件分为:〔1〕时间计数模块。
分秒计数模块计数为60计数,时计数模块为12计数。
〔2〕显示模块。
显示模块由一个六进制计数器模块和一个七段译码器组成。
进制计数器为六选一选择器的选择判断端提供输入信号, 六选一选择器的选择输出端分别接秒个位、秒十位、分个位、分十位和时个位、时十位的选通位用来完成动态扫描显示,同时依次输出秒个位、秒十位、分个位、分十位和时个位、时十位数向给译码模块。
vhdl课程设计
v h d l课程设计(电子钟+闹铃)(共5页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--数字钟的设计一、系统功能概述(一)、系统实现的功能:1、具有“时”、“分”、“秒”的十进制数字显示(小时从00 ~ 23)。
2、具有手动校时、校分、校秒的功能。
3、有定时和闹钟功能,能够在设定的时间发出闹铃声。
4、能进行整点报时。
从59分50秒起,每隔2秒发一次低音“嘟”的信号,连续5次,最后一次为高音“嘀”的信号。
(二)、各项设计指标:1、显示部分采用的6个LED显示器,从高位至低位分别显示时、分、秒。
2、有一个设置调闹钟定时时间、正常时间的按钮,选择调的对象。
3、有三个按钮分别调时、分、秒的时间。
4、有一个按钮用作开启/关闭闹铃。
5、另外需要两个时钟信号来给系统提供脉冲信号,使时钟和闹钟正常工作,分别为1Hz、1kHz的脉冲。
二、系统组成以及系统各部分的设计1、系统结构描述三、课程设计过程中遇到的问题以及解决方法主要是在“调整时间”和“调整定时”的上面遇到非常大的困难。
与开始想象的不一样,一个进程中不能加入时钟信号,没能够将按键脉冲直接与时钟脉冲进行累加。
同时,在对VHDL的语法的熟悉上也花费了大量的时间。
最后的解决方法是,通过另一个进程,先将这两个信号进行处理后,分别产生aclk和tclk分别为定时调整部分、和时间调整部分提供时钟信号。
调整按键的脉冲信号和正常的时钟信号不是按照简单的或运算来处理的。
1)、如果要调整时间:1、当时钟信号是高电平,按键信号也是高电平时,则给tclk赋值0。
2、当时钟信号是高电平,按键信号是低电平时,则给tclk赋值1。
3、当时钟信号是低电平,按键信号是高电平时,则给tclk赋值1。
4、当时钟信号是低电平,按键信号是低电平是,则给tclk赋值0。
这样无论按键脉冲是在高电平还是低电平,或者是在高低电平两种状态下出现,其最终结果都是会多产生一个脉冲信号,导致计数值变化,达到修改时间的目的。
万年历VHDL实现
基于FPGA万年历程序设计方案一.秒显示程序说明LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY MAIN ISPORT(clk,clr:in std_logic;co:out std_logic;UNIT:OUT STD_LOGIC_VECTOR(9 DOWNTO 0);TEN: OUT STD_LOGIC_VECTOR(5 DOWNTO 0));END MAIN;ARCHITECTURE ONE OF MAIN ISSIGNAL cnt1,cnt0:std_logic_vector(3 downto 0);BEGINP0: PROCESS(clk,clr)BEGINIF clr='1' THENcnt1<="0000";cnt0<="0000";ELSIF clk'event and clk='1'THENIF cnt1="0101" and cnt0="1000"THENco<='1';cnt0<="1001";ELSif CNT0<"1001"THENCNT0<=CNT0+1;ELSECNT0<="0000";IF CNT1<"0101"THENCNT1<=CNT1+1;ELSECNT1<="0000";CO<='0';END IF;END IF;END IF;END PROCESS P0;P2:PROCESS(CNT1,CNT0)BEGINCASE CNT0 ISWHEN "0000" => unit<="1000000000";WHEN "0001" => unit<="010*******";WHEN "0010" => unit<="0010000000";WHEN "0011" => unit<="0001000000";WHEN "0100" => unit<="0000100000";WHEN "0101" => unit<="0000010000";WHEN "0110" => unit<="0000001000";WHEN "0111" => unit<="0000000100";WHEN "1000" => unit<="0000000010";WHEN "1001" => unit<="0000000001";WHEN others => unit<="1111111111";END CASE;CASE CNT1 ISWHEN "0000" => ten<="011111";WHEN "0001" => ten<="101111";WHEN "0010" => ten<="110111";WHEN "0011" => ten<="111011";WHEN "0100" => ten<="111101";WHEN "0101" => ten<="111110";WHEN others => ten<="111111";END CASE;END PROCESS P2;END ONE;二.各模块说明:年(两位)、月、日、星期、小时、分钟、控制、分频器、位选、显示1、分频器:通过晶振引入计数脉冲后,利用分频器得到秒信号,主要通过程序编写计数器。
基 于VHDL的万年历设计
本设计为实现一个多功能的万年历,具有年、月、日、时、分、秒计时并显示的功能,顾名思义,其满量程计时为一万年;具有校对功能,能够对初始的时间进行人为的设定。
本设计采用EDA技术,以硬件描述语言VHDL为系统逻辑描述手段设计具有万年历功能的硬件电路,在QuartusII软件设计环境下,采用自顶向下的设计思路,分别对各个基础模块进行创建,通过各个基础模块的组合和连接来构建上层原理图,完成基于VHDL万年历设计。
系统目标芯片采用EP1K30TC144-3,由时钟模块、控制模块、计时模块、数据译码模块、显示模块组成。
经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,将硬件编写程序下载到试验箱上,选择模式3进行功能验证。
本系统能够完成年、月、日和时、分、秒的分别显示,由按键输入进行万年历的校时功能。
1 实验概述 (4)1.1 EDA技术 (4)1.2 QuartusII的使用 (4)1.3 模块化设计 (4)1.4 分析、解决问题 (4)2 实验内容与要求 (5)2.1实验内容 (5)2.1实验说明 (5)2.3实验要求 (6)3 实验原理 (7)3.1设计思想 (7)3.2设计原理图 (8)3.3工作工程 (9)4 实验结果 (10)4.1VHDL程序与仿真 (10)4.1.1秒和分模块 (10)4.1.2小时模块 (11)4.1.3日(天)模块 (12)4.1.4月份模块 (15)4.1.5年模块 (17)4.1.6校时模块 (19)4.1.7显示模式切换模块 (21)4.2顶层设计与仿真 (23)4.3下载与验证 (25)4.3.1电路结构选择 (25)4.3.2端口配置 (26)4.3.3实际电路验证 (29)5 实验小结 (30)参考文献 (31)1 、实验概述1.1 EDA技术EDA(Electronic Design Automation),即电子设计自动化,是指利用计算机完成电子系统的设计。
基于VHDL万年历的设计
EDA 课程设计报告书课题名称 基于VHDL 万年历的设计姓 名 学 号 院 系 专 业 指导教师※※※※※※※※※ ※※ ※※ ※※※※※※※※※※※EDA 课程设计基于VHDL 万年历的设计1设计目的1、 熟悉万年历的工作原理,工作过程和所需的相关器件。
2、 增加对EDA 编程方法,编程步骤,相应的操作流程和软件操作等的熟悉度。
3、 积累对数字电路简单系统的实际制作经验,为更加复杂的实际应用领域做准备。
4、 培养独立设计电路系统的专业素养,带动与其他相关课程之间的相互联系来解决电子信息方面常见的实际问题。
2设计的主要内容和要求1、 在Quartus 中编写VHDL 程序实现年、月、日、时、分、秒各模块的功能。
2、 将各模块在原理图中连接起来实现百年历计时功能。
3、 对原理图进行编译仿真,并观察仿真结果看是否能实现万年历的功能效果,如是否可以进位,是否能判断闰年等。
4、 对仿真后的原理图进行引脚锁定,并下载到相关器件中去。
3整体设计方案秒、分是60进制,时是24进制,日31天由月1.3.5.7.8.10.12控制,日28/29由2月和润年控制,日30由月4.6.9.11控制。
原理框图如图3.1所示:图3.1 原理框图整个万年历由五个部分组成。
分别为显示部分,秒、分、时部分,日部分,月部分,年部分和调整控制部分。
秒、分、时分别由两个进制的计数器和一个二十四进制的计数器组成。
当个计数器达到进位的条件时向下一计数器进位。
同样日、月、年也是由不同的计数器组成,当达到所需进位的条件时向下一计数器进位,各计数器在进位的同时分别把各自的结果输出给显示部分进行实时显示。
而调整控制部分通过对k设置高低电平对显示部分的显示进行选择。
例如当k=0时为选择秒分时部分的显示。
此时显示部分输出的结果为秒分时部分各计数器输出的结果;当k=1时选择的是年月日部分的显示,此时显示的结果为年月日个计数器的输出结果。
通过k1、k2对输出结果进行调整。
(2024版)vhdl数字时钟设计
可编辑修改精选全文完整版一、题目分析1、功能介绍(1)具有时、分、秒计数显示功能,以24小时循环计时。
(2)时钟计数显示时有LED灯的花样显示。
(3)具有调节小时、分钟及清零的功能。
(4)具有整点报时功能。
2、总体方框图3、性能指标及功能设计1)时钟计数:完成时、分、秒的正确计时并且显示所计的数字;对秒、分——60进制计数,即从0到59循环计数,时钟——24进制计数,即从0到23循环计数,并且在数码管上显示数值。
2)时间设置:手动调节分钟、小时,可以对所设计的时钟任意调时间,这样使数字钟真正具有使用功能。
我们可以通过实验板上的键7和键4进行任意的调整,因为我们用的时钟信号均是1HZ的,所以每LED灯变化一次就来一个脉冲,即计数一次。
3)清零功能:reset为复位键,低电平时实现清零功能,高电平时正常计数。
可以根据我们自己任意时间的复位。
4)蜂鸣器在整点时有报时信号产生,蜂鸣器报警。
产生“滴答.滴答”的报警声音。
5)LED灯在时钟显示时有花样显示信号产生。
即根据进位情况,LED不停的闪烁,从而产生“花样”信号。
二、选择方案1、方案选择方案一:根据总体方框图及各部分分配的功能可知,本系统可以由秒计数器、分钟计数器、小时计数器、整点报时、分的调整以及小时的调整和一个顶层文件构成。
采用自顶向下的设计方法,子模块利用VHDL语言设计,顶层文件用原理图的设计方法。
显示:小时采用24进制,而分钟均是采用6进制和10进制的组合。
方案二:根据总体方框图及各部分分配的功能可知,本系统可以由秒计数器、分钟计数器、小时计数器、整点报时、分的调整以及小时的调整和一个顶层文件构成。
采用自顶向下的设计方法,子模块利用VHDL语言设计,顶层文件用原理图的设计方法。
显示:小时采用24进制,而分钟和秒均60进制。
终上所述,考虑到试验时的简单性,故我选择了方案二。
三、细化框图根据自顶向下的方法以及各功能模块的的功能实现上述设计方案应系统细化框图:四、编写程序、仿真和分析1、秒计数器1)VHDL 语言描述程序见附录 2)秒计数器的仿真波形图3)波形分析利用60进制计数器完成00到59的循环计数功能,当秒计数至59时,再来一个时钟脉冲则产生进位输出,即enmin=1;reset 作为复位信号低电平有效,数字时钟控制单元 时调整 分调整使能端信号 CLK 信号时显示 分显示 秒显示24进制 60进制 60进制LED 显示整点报花样显即高电平时正常循环计数,低电平清零。
VHDL课程设计(数字钟)
1.设计任务及要求:
设计任务:设计一台能显示时、分、秒的数字钟。具体要求如下:
(1)由实验箱上的时钟信号经分频产生秒脉冲;
(2)计时计数器用24进制计时电路;
(3)可手动校时,能分别进行时、分的校正;
(4)整点报时;
(5)选做:可设置闹时功能,当计时计到预定时间时,扬声器发出闹铃信号,闹铃时间为4s,并可提前终止闹铃。
end if;
end if;
if sethour='1' then
h0:=h0+1;
if h0="1010" then
h0:="0000";
h1:=h1+1;
ifh0="0100"and h1="0010"
then h0:="0000";h1:="0000";
end if;
end if;
end if;
3.2.3.秒计时模块
将“秒计时脉冲”clk接信号源单元的1HZ脉冲信号,此时秒显示将从00计时到59,然后回到00,重新计时。在秒位进行计时的过程中。
秒计时器是由一个60进制的计数器构成的,具有置数和计数功能。其中rst为置数信号,当rst为1时,秒计时器置数。clk为驱动秒计时器的时钟,sec1、sec0为秒计时器的高位和低位输出。
begin
if(clk1'event and clk1='1') then
if(count="10") then
count:=(others=>'0');
tmp<=not tmp;
基于VHDL语言的数字电子钟课程设计
基于VHDL语言的简易电子钟设计[摘要] VHDL是广泛应用的硬件描述语言,可以用在硬件设计流程的建模、综合和模拟等多个阶段。
随着硬件设计规模的不断扩大,应用硬件描述语言进行描述的CPLD结构,成为设计专用集成电路和其他集成电路的主流。
通过应用VHDL对数字时钟的设计,达到对VHDL的理解,同时对CPLD器件加深了解。
该系统在开发软件Quartus Ⅱ环境中设计完成,本文给出了设计该数字时钟系统的流程和方法,最后通过CPLD实现预定功能。
关键词:电子钟;硬件描述语言;VHDL;Quartus Ⅱ;CPLD目录引言 (1)第一章设计任务及功能要求 (1)1.1设计课题内容 (1)1.2功能要求说明 (1)第二章系统设计方案 (2)2.1电子钟工作原理 (2)2.2总体方案设计 (2)第三章电子钟顶层设计 (2)3.1顶层设计分析 (2)3.2 顶层电路图 (3)第四章各功能模块的设计 (4)4.1正常计时模块 (4)4.1.1分频模块设计 (4)4.1.2 60进制计数器设计 (5)4.1.3 24进制计数器设计 (5)4.2整点报时模块 (6)4.2.1整点报时设计思路及原理图 (6)4.2.2整点报时仿真波形 (7)4.3分时校对模块 (7)4.3.1分时校对设计思路及原理图 (7)4.3.2分时校对仿真波形 (7)4.4扫描输出模块 (8)4.4.1扫描输出设计思路及原理图 (8)4.4.2扫描输出仿真波形 (8)4.5译码显示模块 (9)4.5.1译码显示设计思路及原理图 (9)4.5.2译码显示仿真波形 (10)第五章系统硬件实现分析 (10)5.1 引脚分配 (10)5.2 系统硬件测试及分析 (11)第六章结束语 (11)参考文献 (11)附录1顶层电路图 (12)附录2程序代码 (12)引言数字时钟是一种用数字电路技术实现时、分、秒计时的装置,数字时钟走时精度高,稳定性好,使用方便,不需要经常调校,数字式时钟用秒脉冲发生器的精度稳定保证了数字钟的质量。
利用VHDL语言与FPGA器件设计数字日历
利用VHDL语言与FPGA器件设计数字日历基于FPGA设计数字日历可以实现以软件方式设计硬件的目的,无需购买专用数字芯片,从而克服了传统利用多片数字集成电路设计数字日历存在焊接麻烦、调试繁琐、成本较高等问题。
而且,基于FPGA的数字日历与传统系统相比,在设计灵活、开发速度、降低成本、计时精度、功能实现上都得到大幅度提升,能够更好地满足人们日常生活的需要。
本文介绍如何利用VHDL硬件描述语言设计一个具有年、月、日、星期、时、分、秒计时显示功能,时间调整功能和整点报时功能的数字日历。
在QuartusⅡ开发环境下,采用自顶向下的设计方法,建立各个基本模块,再构建成一个完整的基于FPGA设计的数字日历的顶层模块,然后对其进行编译、仿真、引脚锁定,最终下载到可编程逻辑器件上进行结果验证。
1数字日历整体设计方案基于FPGA的数字日历设计分为硬件设计和软件设计两大部分。
其原理框图如图1所示。
整个数字日历由六个部分组成:显示控制部分,时分秒部分,年月日部分,定时与整点报时部分,星期部分,调整控制部分。
秒、分、时分别由两个60进制的计数器和一个24进制的计数器组成。
当个计数器达到进位的条件时向下一计数器进位。
同样日、月、年也是由不同的计数器组成,当达到所需进位的条件时向下一计数器进位,各计数器在进位的同时分别把各自的结果输出给显示部分进行实时显示。
图1数字日历原理框图2数字日历的工作原理首先由外部振荡器产生稳定的高频脉冲信号,作为数字日历的时间基准,然后经过分频器输出标准秒脉冲,输入到FPGA的CLOCK端,实现计数。
当秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24进1”规律计数。
计满后各计数器清零,重新计数。
日部分由于日有28天、29天、30天、31天4种情况,故。
(完整word版)基于VHDL的语言数字钟的设计
HEFEI UNIVERSITY课程设计报告题目基于VHDL语言数字钟的设计系别年级专业姓名指导老师完成时间摘要本设计主要研究基于VHDL的语音数字钟的设计,该数字钟具有年、月、日、时、分、秒计数显示功能,以24小时循环计数;具有校对功能、整点报时以及清零、使能功能。
本设计主要是在介绍了EDA及VHDL一些相关基本知识的基础上,进一步采用EDA技术,以硬件描述语言VHDL为系统逻辑描述手段设计文件,在Max+plusII工具软件环境下,采用自顶向下的设计方法,由各个基本模块共同构建了一个多功能语音数字钟,最后通过仿真出时序图实现预定功能。
其中,重点叙述了数字钟的设计原理和分模块实现的方法,详细介绍了各模块的设计程序并给出了各模块的波形仿真图及分析,最后通过在Max+plusII上进行时序仿真,调试运行,在硬件测试后,验证了所设计的系统达到了预先设计目标。
通过这次的设计更进一步地增强了实验的动手能力,对数字钟的工作原理及EDA技术也有了更加透彻的理解。
关键词:VHDL EDA 数字钟仿真图The Design of a Voice DigitalClock Based on VHDLAbstractThe design for a multi-functional digital clock, with a year,month, day, hours,minutes and seconds count display to a 24-hour cycle count; have proof functions and the whole point timekeeping function。
The design is mainly the introduction of the EDA and some related basic knowledge of VHDL,based on the further use of EDA technology,hardware-description language VHDL description logic means for the system design documents, in MaxplusII tools environment, a top—down design,by the various modules together build a voice digital clock. Finally, a timing diagram of the simulation to achieve the intended function。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
合计
使用(25 分)
方案设计(15 分)
程设计)(30
试(10 分)
答辩(20 分)
(100 分)
分)
得分
1 设计要求 1.1 设计任务
设计制作一个基于 LCD1602 显示,带有时间调整的万年历电子时钟。 1.2 设计要求 1) 采用硬件描述语言 VHDL 设计带有日期功能的数字电子时钟模块及 LCD 显
l<=ll;h<=hh; end process; end architecture behave; 3.3 时计数器模块 时计数器模块源程序如下: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity cont_24 is port(rst,clk:in std_logic; l,h:out std_logic_vector(3 downto 0); c:out std_logic); end cont_24; architecture behave of cont_24 is begin
if clk'event and clk='1' then ll:=ll+'1'; if ll="1010" then if hh="0101" then hh:="0000";ll:="0000";c<='1'; else ll:="0000";hh:=hh+'1';c<='0'; end if; else c<='0'; end if; end if;
end if;end if; l<=ll;h<=hh;
end process; end architecture behave; 3.2 分计数器模块 分计数器模块源程序如下: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity cont_60m is
万年历电子时钟
--------------- 数字系统课程设计
班 级:电子 1412
学 号:14200106214、14200106204
姓 名:孙玮、甘家雨
指导老师:刘传洋
时 间:6 月 14 日——6 月 22 日
项目
功能模块设计
设计开发环境
设计报告及
设计任务功能理解与 (模块划分及编 功能仿真与调
begin if(rst='0')then ll:="0000";hh:="0000";
else if clk'event and clk='1' then ll:=ll+'1'; if ll="1010" then if hh="0101" then hh:="0000";ll:="0000";c<='1'; else ll:="0000";hh:=hh+'1';c<='0'; end if; else c<='0'; end if;end if; end if;
秒计数器模块源程序如下: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity cont_60s is
port(rst,clk,stop:in std_logic; l,h:out std_logic_vector(3 downto 0);
29 天,并将结果输出。其有三个输入和三个输出,其中 rst 起复位作用,clk 为日 计数器的进位,run 为闰年的判断输入,l 为个位输出,h 为十位输出,c 为进位 输出,pan 为二月判断结果的输出。算法流程图如图 10 所示。
开始
初始 化变量 变量赋初值
rst为零?
是
否 clk上升沿? 否
否
十位为10? 个位为0?
是
十位 清零百 位 加一
否 个位为10?
是
个位 清零十 位 加一
开始
变量 清零
等于100? 百进 制计数 清
零
结束
图 12 年计数器算法流程图
初始 化变量
rst为零?பைடு நூலகம்
是
否 clk上升沿? 否
是
四进 制计数 加 一
为闰 年
四进 制清零 百进制加一 是
否
计数 为4?
否
不为 闰年
是
个位 加一
进位 赋零
否
值为13?
是
判断 大小月 并赋 值输出
个十 位清零 进位 赋一
否 个位为10?
是
个位 清零十 位 加一
结束
图 10 月计数器算法流程图
图 11 月计数器 RTL 图 2.6 年计数器模块
年计数器模块为 1000 进制计数器,但其无进位输出。此外,该模块还负责 判断判断闰年还是平年,并将结果输出。其有两个输入和三个输出,其中 rst 起 复位作用,clk 为月计数器的进位,l 为个位输出,h 为十位输出,c 为进位输出,
25的倍数且 不等于100?
不是 闰年
是
结束
图 13 判断闰年算法流程图
图 14 年计数器 RTL 图
2.7 校时模块
校时模块的主要功能是校对时间,而校时功能通过按键 K1、K2 来实现。当 不按 K2 按键时,计数器正常计时,而当按下 K2 按键时,根据所按的次数不同 进入不同的工作模式,利用 K1 改变对应计数器的值,每按下 K1,对应计数器的 值加 1。其有七个输入和八个输出,分别为复位信号输入、时钟输入、进位输入、 按键输入、进位输出和停止位输出。
开始
初始 化变量
rst为零?
是
否 stop为零? 否
是
进位 赋零
变量 清零
clk上升沿? 否
是
否 个位为10?
个位 加一
是
十位 为5?
是
个十 位清零 进位 赋一
个位 清零十 位
否
加一
结束
图 2 秒计数器算法流程图
图 3 秒计数器 RTL 图 2.2 分计数器模块
分计数器模块为 60 进制计数器,其有两个输入和三个输出,其中 rst 起复位 作用,clk 为秒计数器的进位,l 为个位输出,h 为十位输出,c 为进位输出。算 法流程图如图 4 所示。分计数器 RTL 图如图 5 所示。
port(rst,clk:in std_logic; l,h:out std_logic_vector(3 downto 0);
c:out std_logic); end cont_60m; architecture behave of cont_60m is begin
process(clk,rst) variable ll:std_logic_vector(3 downto 0):="0000"; variable hh:std_logic_vector(3 downto 0):="0000";
2.9 分频模块
由于系统外接时钟频率为 50MHz,而按键扫描频率通常在 1~10KHz,LCD 显示模块的频率也低于 50MHz,再加上万年历计时时需要 1Hz 的脉冲信号,因 此需要对系统输入脉冲进行分频,使其产生合适的时钟频率。需要产生的时钟频 率分别有 1Hz 和 10kHz,其中 1Hz 占空比为 50%,而 10kHz 的时钟信号在单个 周期内有多个短脉冲。1Hz 分频的 RTL 图如图 17 所示。10kHz 分频的 RTL 图如 图 18 所示。
图 17 1Hz 分频的 RTL 图
2.10 顶层模块
图 18 10kHz 分频的 RTL 图
顶层设计采用原理图输入法,从而达到设计思路清晰、直观的目的。顶层原 理图如图 19 所示。由仿真图可以看出在按键没有操作的情况下,LCD_Data 分别 输出了年月日时分秒这六个数据。
图 19 顶层原理图 3 程序设计 3.1 秒计数器模块
LCD1602显示模块
年月日时分秒分 计计计计计计频 数数数数数数模 器器器器器器块
校时模块
图 1 设计框架图
由上图可知,万年历电子时钟由校时模块、LCD1602 显示模块、分频模块、 秒计数器、分计数器、时计数器、日计数器、月计数器和年计数器组成。 2.1 秒计数器模块
秒计数器模块为 60 进制计数器,其有三个输入和三个输出,其中 rst 起复位 作用,clk 为 1Hz 的脉冲输入,stop 为运行控制位,l 为个位输出,h 为十位输出, c 为进位输出。算法流程图如图 2 所示。秒计数器 RTL 图如图 3 所示。
校时模块的工作模式总共有 6 种,分别为正常计时、调分、调时、调日、调 月和调年。算法流程图如图 15 所示。RTL 图如图 16 所示。
开始
rst为零?
否
是
c lk上升 沿?
否
是
变量 清零
否 k2上升沿?
是
功能 值加一
k1=0? 是
缓存 值置一
否 缓存 值置零
根据 功能值 和 缓存 值赋值
a="101"?
c:out std_logic); end cont_60s; architecture behave of cont_60s is begin