基于VHDL的万年历设计
毕业论文基于veriloghdl万年历说明书
基于Verilog HDL的万年历设计与总结报告题目名称:基于Verilog HDL的万年历研究设计报告人:___________________________________________ 院系/年级/专业:________________________指导教师:________________________________________ 制作日期:_____________________________基于Verilog HDL 的万年历摘要基于Verilog HDL的万年历设计,主要完成的任务是使用Verilog语言,在Quartus2 上完成电路设计,程序开发模拟,基于功能是能够显示/ 修改年月日时分秒。
电路设计模块:分频、控制、时间显示调整、时分秒、年月日、显示控制、译码器。
各个模块完成不同的任务,合在一起就构成了万年历电路设计。
软件模拟直接在Quartus2 上进行。
随着科学技术的发展,时间观念越来越重,但是老式的钟表以及日历等时间显示工具已不合时宜。
对此,数字钟表的设计有了用武之地。
基于Verilog 的万年历设计,采用软件开发模拟,开发成本低,而且在功能设计上有了很大的灵活度。
同时,该设计的精度远远超过钟表,并且不需要维修。
综上所述,本设计具有设计方便、功能多样、电路简洁、成本低廉等优点。
符合社会发展趋势,前景广阔。
关键词:万年历,Verilog HDL ,Quartus2Based on the design of the calendar Verilog HDL circuitAbstractThe calendar based on FPGA design, the main task is to use eVrilog language, in the Quartus2 complete circuit design module is divided into several modules: point frequency, control and time display adjustment, arc, date, display, when control, decoder. Each module complete different tasks, together they form a calendar system circuit design. Software simulation on directly in Quartus2.With the development of technology and science, the concept of time is more and more heavey, but old-fashioned clock and calendar etc time display tools are not very good.Key words: Calendar,Verilog HDL ,Quartus2目录摘要......................................................... ..1Abstract .......................................................................................................... .2第一章万年历发展介绍及Verilog HDL 简介.. (3)1.1万年历的发展.................................................. ..31.2Verilog HDL 简介 (4)第二章设计原理................................................ ..52.1组成模块...................................................... ..62.2系统设计图.................................................... ..7第三章各功能模块介绍 (8)第四章模拟仿真 (11)4.1年月日仿真 (12)4.2时分秒仿真 (13)总结结论 (14)参考文献 (15)第一章万年历的发展介绍及Verilog HDL简介1.1万年历的发展钟表、日历等的数字化大大方便了我们的日常生活,同时大大扩展了其功能,而这些功能的实现,均以钟表的数字化为基础的。
vhdl万年历
FPGA——VHDL万年历LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY TIMER ISPORT(CLK,RES,XUAN,JIA_SEC1,JIA_SEC2,JIA_MIN1,JIA_MIN2,JIA_HOUR1,JIA_HOUR2:IN STD_LOGIC;HOUR2,HOUR1,MIN2,MIN1,SEC2,SEC1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);COUT:OUT STD_LOGIC);END;ARCHITECTURE ONE OF TIMER ISSIGNAL HOUR11,HOUR22,SEC11,SEC22,MIN11,MIN22:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(CLK,RES,XUAN,JIA_SEC1,JIA_SEC2,JIA_MIN1,JIA_MIN2,JIA_HOUR1,JIA_HOUR2)BEGINIF(XUAN='0')THEN----------------------自动计时IF(CLK'EVENT AND CLK='1')THENIF(RES='0')THENIF(HOUR22<"0010")THENIF(HOUR11<"1001")THEN ------<19 HOURSIF(MIN22<"0101")THENIF(MIN11<"1001")THENIF(SEC22<"0101")THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<=SEC22+1;END IF;ELSIF(SEC22="0101") THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<="0000";MIN11<=MIN11+1;END IF;END IF;ELSIF(MIN11="1001")THENIF(SEC22<"0101")THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<=SEC22+1;END IF;ELSIF(SEC22="0101") THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<="0000";MIN11<="0000";MIN22<=MIN22+1;END IF;END IF;ELSIF(MIN22="0101")THENIF(MIN11<"1001")THENIF(SEC22<"0101")THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<=SEC22+1;END IF;ELSIF(SEC22="0101") THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<="0000";MIN11<=MIN11+1;END IF;END IF;ELSIF(MIN11="1001")THENIF(SEC22<"0101")THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<=SEC22+1;END IF;ELSIF(SEC22="0101") THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<="0000";MIN11<="0000";MIN22<="0000";HOU R11<=HOUR11+1;END IF;END IF;END IF;END IF;ELSIF(HOUR11="1001")THENIF(MIN22<"0101")THENIF(MIN11<"1001")THENIF(SEC22<"0101")THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<=SEC22+1;END IF;ELSIF(SEC22="0101") THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<="0000";MIN11<=MIN11+1;END IF;ELSIF(MIN11="1001")THENIF(SEC22<"0101")THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<=SEC22+1;END IF;ELSIF(SEC22="0101") THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<="0000";MIN11<="0000";MIN22<=MIN22+1;END IF;END IF;END IF;ELSIF(MIN22="0101")THENIF(MIN11<"1001")THENIF(SEC22<"0101")THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<=SEC22+1;END IF;ELSIF(SEC22="0101") THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<="0000";MIN11<=MIN11+1;END IF;END IF;ELSIF(MIN11="1001")THENIF(SEC22<"0101")THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<=SEC22+1;END IF;ELSIF(SEC22="0101") THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<="0000";MIN11<="0000";MIN22<="0000";HOU R11<="0000";HOUR22<=HOUR22+1;END IF;END IF;END IF;END IF;END IF;ELSIF(HOUR22="0010")THEN -----20--23 hoursIF(MIN22<"0101")THENIF(MIN11<"1001")THENIF(SEC22<"0101")THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<=SEC22+1;END IF;ELSIF(SEC22="0101") THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<="0000";MIN11<=MIN11+1;END IF;END IF;ELSIF(MIN11="1001")THENIF(SEC22<"0101")THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<=SEC22+1;END IF;ELSIF(SEC22="0101") THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<="0000";MIN11<="0000";MIN22<=MIN22+1;END IF;END IF;END IF;ELSIF(MIN22="0101")THENIF(MIN11<"1001")THENIF(SEC22<"0101")THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<=SEC22+1;END IF;ELSIF(SEC22="0101") THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<="0000";MIN11<=MIN11+1;END IF;END IF;ELSIF(MIN11="1001")THENIF(SEC22<"0101")THENIF(SEC11<"1001")THENELSE SEC11<="0000";SEC22<=SEC22+1;END IF;ELSIF(SEC22="0101") THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<="0000";MIN11<="0000";MIN22<="0000";HOUR11<=HOUR11+1;END IF;END IF;END IF;END IF;ELSIF(HOUR11="0100")THEN------------------------------------20--23HOURSIF(MIN22<"0101")THENIF(MIN11<"1001")THENIF(SEC22<"0101")THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<=SEC22+1;END IF;ELSIF(SEC22="0101") THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<="0000";MIN11<=MIN11+1;END IF;END IF;ELSIF(MIN11="1001")THENIF(SEC22<"0101")THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<=SEC22+1;END IF;ELSIF(SEC22="0101") THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<="0000";MIN11<="0000";MIN22<=MIN22+1;END IF;END IF;END IF;ELSIF(MIN22="0101")THENIF(MIN11<"1001")THENIF(SEC22<"0101")THENIF(SEC11<"1001")THENELSE SEC11<="0000";SEC22<=SEC22+1;END IF;ELSIF(SEC22="0101") THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<="0000";MIN11<=MIN11+1;END IF;END IF;ELSIF(MIN11="1001")THENIF(SEC22<"0101")THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<=SEC22+1;END IF;ELSIF(SEC22="0101") THENIF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";SEC22<="0000";MIN11<="0000";MIN22<="0000";HOUR11<="0000";HOUR22<="0000";END IF;END IF;END IF;END IF;END IF;END IF;ELSE SEC11<="0000";SEC22<="0000";MIN11<="0000";MIN22<="0000";HOUR11<="0000";HOUR22<="0000";END IF;END IF;ELSE------------------------------------------进行手动调整IF(RES='0')THENIF(JIA_SEC1'EVENT AND JIA_SEC1='1')THEN------------------调整秒1IF(SEC11<"1001")THENSEC11<=SEC11+1;ELSE SEC11<="0000";END IF;END IF;IF(JIA_SEC2'EVENT AND JIA_SEC2='1')THEN------------------调整秒2IF(SEC22<"0101")THENSEC22<=SEC22+1;ELSE SEC22<="0000";END IF;END IF;IF(JIA_MIN1'EVENT AND JIA_MIN1='1')THEN------------------调整分1IF(MIN11<"1001")THENMIN11<=MIN11+1;ELSE MIN11<="0000";END IF;END IF;IF(JIA_MIN2'EVENT AND JIA_MIN2='1')THEN------------------调整分2IF(MIN22<"0101")THENMIN22<=MIN22+1;ELSE MIN22<="0000";END IF;END IF;IF(JIA_HOUR1'EVENT AND JIA_HOUR1='1')THEN----------------调整时1IF(HOUR11<"1001")THENHOUR11<=HOUR11+1;ELSE HOUR11<="0000";END IF;END IF;IF(JIA_HOUR2'EVENT AND JIA_HOUR2='1')THEN----------------调整时2IF(HOUR22<"0010")THENHOUR22<=HOUR22+1;ELSE HOUR22<="0000";END IF;END IF;ELSE SEC11<="0000";SEC22<="0000";MIN11<="0000";MIN22<="0000";HOUR11<="0000";HOUR22<="0000";END IF;END IF;END PROCESS;PROCESS(SEC11,SEC22,MIN11,MIN22)BEGINIF(MIN11="0000" AND MIN22="0000")THENIF(SEC11<"1010" AND SEC22<"0011")THENCOUT<='1';ELSE COUT<='0';END IF;ELSIF(MIN11="0000" AND MIN22="0011")THENIF(SEC11<"1010" AND SEC22<"0011")THENCOUT<='1';ELSE COUT<='0';END IF;ELSE COUT<='0';END IF;END PROCESS;HOUR2<=HOUR22;HOUR1<=HOUR11;SEC1<=SEC11;SEC2<=SEC22;MIN1<=MIN11;MIN2<=MIN22;END;。
基于EDA的万年历
目录一、设计总体思路1.1课程设计内容-------------------------------------------------1 1.2课程设计要求-------------------------------------------------1 1.3课程设计的意义----------------------------------------------2 1.4设计总体思路-------------------------------------------------2 1.5设计框图-------------------------------------------------------3 二单元电路设计2.1天模块----------------------------------------------------------4 2.2月模块----------------------------------------------------------5 2.3年模块. ---------------------------------------------------------7 2.4星期模块-------------------------------------------------------8 2.5提醒模块-------------------------------------------------------9 2.6控制模块------------------------------------------------------102.7显示模块------------------------------------------------------11三、总电路设计--------------------------------------------------13四、电路调试----------------------------------------------------14五、设计调试总结与体会--------------------------------------16六、附录-----------------------------------------------------------17七、参考文献-----------------------------------------------------18 附:课程设计评分表一、设计总体思路1.1设计总体内容用FPGA为核心器件,用VHDL为设计手段设计制作一个具有大小月份自动调节和闰年补偿功能的数字日历,具体设计要求如下:1、用7个数码管从左到右分别显示年(后两位)、月、日和星期;星期与日之间隔开一位。
基于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;。
基于fpga的多功能万年历
基于FPGA的多功能万年历1. 绪论现代科技在不断进步电子技术在不断发展,电子产品设计复杂程度也在不断增加。
而且电子产品的更新换代也越来越快,现在只靠传统的纯硬件的设计方法已经不能满足现代人们的要求。
EDA就是典型的硬件设计软件化的设计平台。
EDA是一项非常先进的技术,它有许多别的技术没有的优点:像单片机需要先画出硬件图再编写相对应的程序,而EDA是先编好程序再画图的,而且模块化的编程还会在软件中生成相应的封装元件,使最后画原理图变的更加简单;可以编好程序就直接仿真,程序出现错误可以在源文件内部直接改;并且设计好的总系统可以集成在一个体积小、功耗低、可靠性高的芯片上。
本设计采用VHDL语言,VHDL语言是一种全方位的数字系统设计和测试的硬件描述。
它支持原理图输入方法以及传统的文件输入方。
对于前者适用于小规模的数字集成电路,并进行模拟仿真。
而对于大规模的、复杂的系统,如果用纯原理图设计方法的话的,由于种种条件和环境制约,会导致工作效率底而且容易出错的等缺点。
在信息技术的今天,集成电路逐渐的趋向于系统化、微尺寸化、低功耗高集成化,因此,高密度可编程逻辑器件和VHDL越来越得到设计者的青睐。
它具有极强的描述能力,支持结构、数据流、行为三种描述形式的混合的设计方式,描覆盖面广、抽象能力强。
它能支持系统行为级、逻辑门级和寄存器传输级三个不同层次的设计。
在本设计中用到的FPGA是特殊的ASIC芯片,ASIC是一种带有逻辑处理的加速处理器的专用的系统集成电路。
它具有功耗低、速度快、集成度、设计制造成本低等优点。
本设计是研究基于FPGA的多功能万年历的设计,主要实现以下功能:能够显示年、月、日、时、分、秒,时间采用24小时制。
当时间不准确时还可以手动校准。
本系统还能实时的显示当前的温度,扩展了万年历的功能。
我采用的是数字温度传感器DS18B20和FPGA组成的温度采集系统,此系统具有硬件电路简单,抗干扰能力强等优点。
VHDL课程设计
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电子日历设计完整
《EDA技术教程》基于VHDL 的万年历设计(EDA实验报告)学校:郑州大学院部:物理工程学院年级: 2010级专业:电子科学与技术姓名:张金灿2013年01月20日ONE:本设计为实现一个多功能的万年历,具有年、月、日、时、分、秒计时并显示的功能,其满量程计时为一万年;具有校对功能,能够对初始的时间进行人为的设定。
设计采用EDA技术,以硬件描述语言VHDL为系统逻辑描述手段设计具有万年历功能的硬件电路,在QuartusII9.0软件设计环境下,采用自顶向下的设计思路,分别对各个基础模块进行创建,通过各个基础模块的组合和连接来构建上层原理图,完成基于VHDL万年历设计。
系统目标芯片采用EP2C35F484C8N,由CNT60模块、CNT24模块、DAY模块、MONTH模块、YEAR模块、TIAOSHI模块、CONTROL模块组成。
经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,将硬件编写程序下载到试验箱上,选择模式5进行功能验证。
本系统能够完成年、月、日和时、分、秒的分别显示,由按键输入进行万年历的校时功能。
TWO: 万年历的设计思路与多功能时钟的设计思路相似。
多功能时钟的各功能模块及相互之间的连接如下图1所示图1THREE:年、月、日和时、分、秒的显示格式如图2所示。
年、月、日同时显示,时、分、秒同时显示,通过显示模式切换来分别显示。
年/ (时)月/分日/秒图2万年历显示格式FOUR:按照模块化的设计思想,要实现万年历的基础功能,必定要包含年、月、日和时、分、秒的功能模块,其中秒和分可以用六十进制计数器来实现,时用二十四进制计数器实现,月用十二进制计数器来实现,年的低两位和高两位都是一百进制计数器,比较特殊的是天的计数器,因为它有四种情况,大月三十一天,小月三十天,平年二月二十八天,闰年二月有二十九天,所以年和月的模块对天的计数都有影响,需要从年和月的输出端引出控制信号来控制天的计数。
同时每个计数器都有显示输出端和进位输出端,同时低级别(如秒)的进位输出要给较高级别(如分)的时钟输入端,以此类推,采用串行工作方式进行连接。
万年历的设计与实现
学校代码 ***** 学号 ******** 分类号 TP 密级公开本科毕业论文(设计)学院、系鄂尔多斯学院电子信息工程系专业名称自动化年级 2011 级学生姓名张文博指导教师王俊林2013年 6月 8 日万年历的设计与实现摘要本设计为一个多功能的万年历,具有年、月、日、时、分、秒计数显示功能,以24小时循环计数,具有校对功能。
本设计采用EDA 技术,以硬件描述语言verilog HDL和VHDL为系统逻辑描述手段设计文件,在Quartus II工具软件环境下,采用自顶向下的设计方法,由各个基本模块共同构建了一个基于KH-310开发工具的万年历。
系统主芯片采用EP1C12Q240C8,由主程序和BCD模块组成。
经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,本系统通过控制能够完成年、月、日和时、分、秒的分别显示,由按键输入进行数字钟的校时、切换、扫描功能。
关键字:VHDL Verilog HDL EDA 万年历目录1绪论 (1)1.1选题背景 (1)1.2课题相关技术的发展 (1)1.3课题研究的必要性 (2)1.4课题研究的内容 (3)2 EDA技术 (4)2.1 EDA概述 (4)2.2什么是EDA (4)2.3 EDA的特点 (5)3 FPGA简介 (7)3.1 FPGA概述 (7)3.2 FPGA开发编程原理 (7)3.3FPGA基本结构 (8)3.4 FPGA系统设计流程 (10)4万年历设计方案 (14)4.1万年历的原理 (14)4.2 实验程序 (14)4.3 实验连接 (34)4.4 实验仿真与实现 (36)5实验结论与研究展望 (38)5.1实验结论 (38)5.2研究展望 (38)致谢 (39)参考文献 (40)内蒙古大学本科实训论文(设计)1绪论1.1选题背景20世纪末,数字电子技术飞速发展,有力的推动了社会生产力的发展和社会信息化的提高。
在其推动下,数字技术的应用已经渗透到人类生活的各个方面。
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万年历程序设计方案一.秒显示程序说明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对输出结果进行调整。
数字系统课程设计万年历时钟 VHDL语言
万年历电子时钟--------------- 数字系统课程设计班级:电子1412学号:14200106214、14200106204姓名:孙玮、甘家雨指导老师:刘传洋时间:6月14日——6月22日1课程设计要求1.1设计任务设计制作一个基于LCD1602显示,带有时间调整的万年历电子时钟。
1.2设计要求1)采用硬件描述语言VHDL设计带有日期功能的数字电子时钟模块及LCD显示控制模块,并在Quartus-II环境下编译;2)在Quartus-II环境下编辑仿真激励波形,并模拟;3)在CPLD/FPGA实验板下载调试;4)撰写设计报告, 需要提供详细的设计方案分析、相关的参数计算过程、电路/系统组成、模块划分及其功能定义、程序设计、功能仿真及其结果分析、下载调试等内容。
1.3功能及性能指标要求1)具有时钟的时、分、秒计数功能以及万年历的年、月、日功能;2)年、月、日、时、分、秒数值采用字符型LCD1602显示;3)具有对年、月、日、时、分时间数值调整功能,采用两个按键实现。
4)设计中时钟输入采用验证电路板上的50MHz作为基准;5)程序设计尽可能考虑模块化、参数化设计思想,并遵循基本的格式规范,添加适当的注释及文档说明;6)采用模块化设计方式,底层模块必须进行功能仿真;2设计方案根据课程设计要求,万年历电子时钟的设计框架图如图1所示。
LCD1602显示模块年计数器月计数器日计数器时计数器秒计数器分计数器分频模块校时模块图1 设计框架图由上图可知,万年历电子时钟由校时模块、LCD1602显示模块、分频模块、秒计数器、分计数器、时计数器、日计数器、月计数器和年计数器组成。
3模块分析3.1秒计数器模块秒计数器模块为60进制计数器,其有三个输入和三个输出,其中rst起复位作用,clk为1Hz的脉冲输入,stop为运行控制位,l为个位输出,h为十位输出,c为进位输出。
算法流程图如图2所示。
图2秒计数器算法流程图源程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cont_60s isport(rst,clk,stop:in std_logic;l,h:out std_logic_vector(3 downto 0);c:out std_logic);end cont_60s;architecture behave of cont_60s isbeginprocess(clk,stop,rst)variable ll:std_logic_vector(3 downto 0):="0000";variable hh:std_logic_vector(3 downto 0):="0000";beginif(rst='0')thenll:="0000";hh:="0000";else if stop='0' thenif clk'event and clk='1' thenll:=ll+'1';if ll="1010" thenif 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所示。
利用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种情况,故。
数字电路课程设计---基于1602液晶屏的数字万年历(Verilog版)
大连理工大学数字电路课程设计院 系: 电子科学与技术学院 专 业: 集成电路设计与集成系统 班 级: 电集1001 姓 名: 陈朝吉 学 号: 201081086总结报告大连理工大学本科实验报告题目:基于1602液晶屏的数字万年历(Verilog版)课程名称:数字电路课程设计学院(系):电子科学与技术学院专业:集成电路设计与集成系统班级:电集1001学生姓名:陈朝吉学号:201081086完成日期:2012年12月22日成绩:题目:基于1602液晶屏的数字万年历(Verilog版)一.设计要求1.基本功能➢设计一个数字钟,能够显示当前时间,分别用6个数码管显示小时、分钟、秒钟的时间,秒针的计数频率为1Hz,可由系统脉冲分频得到。
➢在整点进行提示,可通过LED闪烁实现,闪烁频率及花型可自己设计。
➢能够调整小时和分钟的时间,调整的形式为通过按键进行累加。
➢具有闹钟功能,闹钟时间可以任意设定(设定的形式同样为通过按键累加),并且在设定的时间能够进行提示,提示同样可以由LED闪烁实现。
2.扩展功能➢设计模式选择计数器,通过计数器来控制各个功能之间转换。
➢调整当前时间以及闹钟时间,在按键累加的功能不变的基础上,增加一个功能,即当按住累加键超过3秒,时间能够以4Hz的频率累加。
➢用LCD液晶屏来显示当前时间及功能模式。
二.设计分析及系统方案设计1.要求分析:◆基于FPGA实际并发处理的特点,对于实现数字万历年系统,相比于任何嵌入式处理器而言,其特点和优势将得以更加全面体现。
◆数字万年历中所有模块都将基于基准时钟源进行处理,结合FPGA本身的特点,在时钟源下可进行精确计数,可轻易而产生十分精确的万年历时间。
◆基础部分:万年历可包括以下时间处理模块:基于秒时钟计数器进行判断处理。
①秒,分,时。
②星期,上/下午。
③日,月,年。
④闹钟◆功能部分:①时间设定:使用四个按键进行控制,分别是:设置复位按键,设置移位键,功能“加”键,功能“减”键。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要 (1)Abstract (2)绪论 (3)第1章基本概念简介 (4)1。
1 EDA技术和FPGA/CPLD简介 (4)1。
2 VHDL的简介 (4)1。
3 Quartus II的简介 (5)第2章系统设计 (6)2.1 设计思想 (6)2。
2 设计原理图 (7)2.3 设计流程图 (8)第3章模块分析 (9)3.1 计数器模块分析 (9)3.1。
1 秒和分计数器模块 (9)3.1。
2 时计数器模块 (10)3。
1。
3 日计数器模块 (12)3.1。
4 月计数器模块 (16)3.1.5 年计数器模块 (19)3.2 校时模块 (22)3。
3 显示及显示方式切换模块 (25)3。
4 顶层原理图 (26)第4章引脚设定与验证 (29)4。
1 引脚设定 (29)4。
2 下载验证 (31)总结 (33)参考文献 (34)致谢...................................... (错误!未定义书签。
)随着EDA(电子设计自动化)技术的发展和应用领域的扩大,EDA技术在电子信息、通信、自动化控制及计算机应用领域的重要性日益突出。
EDA技术作为现代电子设计技术的核心,它依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言HDL(Hardware Description language)为系统逻辑描述手段完成的设计文件,自动完成逻辑化简、逻辑分割、逻辑综合(布局布线)、逻辑优化和仿真测试等项功能,直至实现既定性能的电子线路系统功能。
EDA的关键技术之一是用形式化方法来描述数字系统的硬件电路、即用所谓的硬件描述语言来描述硬件电路。
本设计是基于VHDL语言的万年历。
在设计中,首先介绍了万年历的设计思路,且在Quartus II开发环境中编译和仿真所设计各个模块的程序,并逐一调试程序使各模块达到设计目的。
其次,利用各元器件生成顶层文件,进行系统仿真。
最后,对顶层原理图进行引脚设定,并下载到试验箱验证,证明系统的可行性.关键字: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: VHDL calendar Quartus II绪论EDA技术以计算机为工具,而设计者只需在EDA软件平台上,用硬件描述语言HDL完成设计文件,然后由计算机自动完成逻辑编译、化简、分割、综合、布局、布线和仿真,直至对于特定目标芯片的适配编译,逻辑映射和编程下载等工作.其中,EDA的关键技术之一是用形式化方法来描述数字系统的硬件电路,即用硬件描述语言来描述硬件电路。
本设计是基于VHDL语言的万年历,故名思议,需要用VHDL语言描述万年历的硬件电路。
就万年历的功能而言,首先,其不仅要计算时间,且需要计算日期,尤其需要正确的判断每月的天数.在其中,比较困难的是如何正确的计算2月份的天数,因为闰年的2月份有29天,但平年的2月份只有28天。
由此,引出一个新的问题:在系统中除计算年份外,还需判断其是否为闰年.其次,系统还要将时间显示,显示方式分为时分秒、年月日这两种显示方式。
最后,为增加系统的实用性,本设计还增加校时功能,主要实现当计时出现误差时进行校正的功能。
在本设计中,通过程序使系统有7种不同的工作状态,分别为正常计时、校分、校时、校日、校月、校年低位、校年高位。
除此,为了显示目前所处的工作状态,用6个指示灯的亮灭来表示,6个灯都不亮时表示正常计时,其余每个灯的亮灭依次表示6种不同的工作状态。
在系统设计中,先用VHDL语言实现各个模块的功能,然后用原理图方式生成顶层文件,使设计思路清晰。
最后,对顶层原理图进行引脚设定,并进行下载验证,证明系统的可行性.第1章基本概念简介1。
1 EDA技术和FPGA/CPLD简介EDA技术作为现代电子设计技术的核心,它依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言HDL(Hardware Description language)为系统逻辑描述手段完成的设计文件,自动完成逻辑化简、逻辑分割,逻辑综合(布局布线),以及逻辑优化和仿真测试等项功能,直至实现既定性能的电子线路系统功能。
EDA技术使得设计者的工作几乎仅限于利用软件的方式,即利用硬件描述语言HDL和EDA软件来完成对系统硬件功能的实现。
CPLD(Complex Programmable Logic Device),即复杂可编程逻辑器件,是从PAL和GAL 器件发展出来的器件,相对而言规模大,结构复杂,属于大规模集成电路。
它是一种用户根据各自需要而自行构造逻辑功能的数字集成电路。
其基本设计方法是借助集成开发软件平台,用原理图、硬件描述语言等方法,生成相应的目标文件,通过下载电缆(“在系统”编程)将代码传送到目标芯片中,实现数字系统的设计。
FPGA(Field-Programable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。
它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
它们的特点是直接面向用户,具有极强的灵活性和通用性,使用方便,硬件测试和实现快捷,开发效率高,成本低,上市时间短,工作可靠性好等。
FPGA和CPLD的应用是EDA技术有机融合硬件电子设计技术、SOC和ASIC设计,以及对自动设计与自动实现最典型的诠释。
1。
2 VHDL的简介硬件描述语言发展至今已有几十年的历史,并已成功地应用到系统的仿真,验证和设计综合等方面。
到20世纪80年代后期,已出现上百种硬件描述语言,它们对设计自动化起了促进和推动作用。
但是,它们大多针对特定设计领域,没有统一的标准,从而使一般用户难以使用.广大用户期盼一种面向设计的多层次,宽领域且得到一致认同的标准硬件语言。
80年代后期有美国国防部开发的VHDL语言(VHSIC Hardware Description Language)恰好满足上述要求,并在1987年12月由IEEE标准化VHDL(定为IEEE std 1076-1987标准,1993年进一步修订,被定为ANSI/IEEE std 1076—1993标准)。
VHDL语言的出现为电子设计自动化(EDA)的普及和推广奠定了坚实的基础。
据1991年有关统计资料表明,VHDL语言已被广大设计爱好者所接受,据称已有90%的设计者使用或即将使用VHDL语言设计数字系统.另外,众多CAD厂商也纷纷使自己新开发的电子设计软件与VHDL语言兼容.由此可见,使用VHDL语言来设计数字系统是电子设计技术的大势所趋。
VHDL的一个突出优点是移植性强。
因为它是一种标准语言,故它的设计描述可以被不同的工具所支持.它可以从一个模拟工具移植到另一个模拟工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台去执行。
同时,这意味着许多设计不必个个都从头再来,只要在更高层次上把已有的模块利用起来,就可以达到事半功倍的效果。
此外,VHDL本身的生命期长.因为VHDL的硬件描述与工艺技术无关,不会因为工艺变化而使描述过时。