《基于FPGA的万年历说明书》由会员分享,可在线阅读,更多相关《基于FPGA的万年历说明书(53页珍藏版)》请在金锄头文库上搜索。
1、基于FPGA的万年历目录 1 目的11.1硬件实训目的:11.2软件实训目的:12 实训意义23 实训内容43.1 硬件实训内容:43.2 软件实训内容:43.2.1 功能说明:43.2.2 软件设计详细内容:44 疑难解答175 心得18参考文献20 1 目的1.1硬件实训目的:1. 熟悉EDA实验箱的基本工作原理。2. 熟悉并掌握EDA实验箱各个模式的功能。3. 提高学生的动手能力。1.2软件实训目的:1 熟悉并掌握Max+plus2软件的使用。2 熟练的使用原理图输入设计方法,VHDL语言编写程序,进一步了解和掌握各个程序语言,提高编程的熟练程度。3 掌握年、月、日、时、分、秒程序的原理
2、,进而理解万年历的设计原理。4 拓宽学生知识面,增强工程意识,培养学生的分析和解决实际问题的能力。5 提高学生的动手能历。202 实训意义该数字时钟实现了调时、年、月、日、时、分、秒的显示功能,无需接译码器,可直接接八段共阴极数码管,总体结构如下图所示:第一部分 第二部分 第三部分 D8(l5) D7(l2) D6 D5 (l4) D4(l1) D3 D2(l3) D18个LED数码管为了显示清楚只用了6个数码管,分为3个部分。采用的是EDA试验箱上的模式7。软件Max+plus2方面:在显示程序中,k3控制分屏。当k3=1时,3部分数码管显示年、月、日;当k3=0时,3部分数码管显示时、分、
3、秒。万年历正常工作时,D1D8都不亮。调时时,秒的变化不需控制,故需调时有年、月、日、时、分5个量。数码管每部分右边灯亮时,即l5亮、l4亮、l3亮分别控制的是年、月、日的变化;每部分左边亮时,即l2亮、l1亮分别控制的是时、分的变化。若控制其中一个量变化时,其余4个量均不变,也不向高位进位。调时、显示、年、月、日、时、分、秒的VHDL语言分别生成各自的模块(Symbol),在顶层文件wannianli中调用这些底层模块CNT60模块,CNT24模块,tian模块,yue模块,nian模块,tiaoshi模块,xianshi模块,然后链接各个模块,构成所需要的电子日历的原理图。硬件EDA试验箱
4、方面:电子日历电路图根据要求采用的是EDA试验箱上的模式7。对万年历电路图上的引脚在电脑软件Max+plus2进行绑定,然后编译,在进行下载,下载到硬件EDA试验箱上。在EDA试验箱上就可以观察到上述变化。引脚绑定如图所示:3 实训内容3.1 硬件实训内容: 在电脑上通过软件Max+plus2对万年历电路图的引脚进行绑定,编译, 然后与EDA试验箱连接,把wannianli .sof文件配置通过JTAG口载入FPGA中,选择实验电路模式No.7进行硬件测试。通过学习,理论上学习了EDA试验箱的原理,对试验箱内部的组件,以及组件之间的链接有了一定的了解,为以后的实训打下了良好的基础。3.2 软件
5、实训内容:3.2.1 功能说明:(1)显示准确的北京时间(年、月、日、时、分、秒,年号只显示最后两位)(2)随时可以调校时间即可以控制年、月、日、时、分的变化,可以跳到指定的时间。3.2.2 软件设计详细内容:(1).秒、分:秒和分都是从0计数到59,可以用六十进制表示。 CNT60程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity CNT60 isport(CLK :in std_logic;cq1,cq2:out std_logic_vector(3 downto 0);c
6、out:out std_logic);end entity;architecture one of CNT60 issignal q1,q2:std_logic_vector(3 downto 0); begin process(CLK) beginif CLKevent and CLK=1 then 检测时钟上升沿q2=q2+1; q2开始计数if q2=9 then q1=q1+1;q2=0000;end if; if q2=9 and q1=5 then q1=0000;q2=0000; cout=1; q2=9,q1=5时,q1,q2清零并输出进位信号else cout=0;end i
7、f;end if;end process;cq1=q1; cq2=q2;end;CNT60波形仿真如图: CNT60模块如图:(2).时:时是从0计数到23,可以用二十四进制表示。CNT24程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity CNT24 isport(CLK :in std_logic;cq1,cq2:out std_logic_vector(3 downto 0);cout:out std_logic);end entity;architecture one
8、of CNT24 issignal q1,q2:std_logic_vector(3 downto 0);begin process(CLK)begin if CLKevent and CLK=1 then 检测时钟上升沿q2=q2+1; q2开始计数if q2=9 then q1=q1+1;q2=0000;end if; q2=9时,q1开始计数且q2清零if q2=3 and q1=2 then q1=0000;q2=0000;cout=1; q2=3,q1=2时,q1,q2清零并输出进位信号else cout=0;end if;end if;end process;cq1=q1; cq2
9、=q2;end; CNT24波形仿真如图: CNT24模块如图:(3).天:一个月可能有31天或者30天;当该年为闰年,二月有29天,否则二月有28天。library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; entity tian isport(clk:in std_logic;pan:in std_logic_vector(1 downto 0);T1,T2:out std_logic_vector(3 downto 0); cout:out std_logic);end tian; architec
10、ture one of tian is signal q1,q2:std_logic_vector(3 downto 0);signal ab:std_logic_vector(1 downto 0);begin process(clk,pan) begin if clkevent and clk=1 检测时钟上升沿then q1=q1+1; q1开始计数if q1=9 then q1=0000;q2if q2=3 and q1=1 then q2=0000 ;q1=0001;cout=1;else coutif q2=3 and q1=0 then q2=0000 ;q1=0001;cout
11、=1;else coutif q2=2 and q1=8 then q2=0000 ;q1=0001;cout=1;else coutif q2=2 and q1=9 then q2=0000 ;q1=0001;cout=1;else coutnull;end case;end if;end process;T1=q1;T2=q2;end;tian程序波形仿真如图:tian模块如图:(4)月:一,三,五,七,八,十,十二月有31;四,六,九,十一月有30天;当该年为闰年,二月有29天,否则二月有28天。library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity yue isport(clk,run:in std_logic;cout:out std_log