多功能数字时钟的设计_EDA课程设计报告(59页).doc
-
资源ID:37171001
资源大小:392.50KB
全文页数:59页
- 资源格式: DOC
下载积分:15金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
多功能数字时钟的设计_EDA课程设计报告(59页).doc
-多功能数字时钟的设计_EDA课程设计报告-第 59 页多功能数字时钟的设计1 绪论1.1设计目的 本次设计的目的就是在掌握EDA实验开发系统的初步使用基础上,了解EDA技术,加深对计算机体系结构的理解。通过学习的VHDL语言结合电子电路的设计知识理论联系实际,掌握所学的课程知识,学习VHDL基本单元电路的综合设计应用。通过对实用数字钟的设计,巩固和综合运用计算机原理的基本理论和方法,理论联系实际,提高设计、分析、解决计算机技术实际问题的独立工作能力。1.2设计要求 (1)熟练掌握VHDL语言的结构特点并能运用到具体实际中。 (2)学会利用复杂的可编程逻辑器件进行简单的电子系统设计。 (3)熟悉并掌握基于EDA实验开发系统设计实际问题的方法和步骤。 (4)通过设计过程提高自己运用所学知识来分析解决问题的能力。1.3设计内容本课程设计中使用Altera公司的EP2C35系列的FPGA芯片,利用SOPC-NIOSII-EP2C35开发板上的资源和QuartusII软件,实现一个多功能数字时钟。本设计的任务要求显示格式为 小时分钟秒钟,整点报时,报时时间为10秒,即从整点前10秒钟开始进行报时提示,喇叭开始发声,直到过整点时,在 5秒LED开始闪烁,过整点后,停止闪烁。系统时钟选择时钟模块的10KHz,要得到1Hz时钟信号,必须对系统时钟进行10,000次分频。调整时间的的按键用按键模块的S1和S2,S1调节小时,每按下一次,小时增加一个小时,S2调整分钟,每按下一次,分钟增加一分钟。另外用S8按键作为系统时钟复位,复位后全部显示000000。扩展内容:用16*16点阵显示实现日期的动态显示用4×4键盘阵列键盘替换按键实现日期、时钟的调整,用液晶显示模块日期、时间的显示。1.4设计环境 本次课题设计方要用到的开发环境是Altera公司的EDA设计工具软件QuartusII。Altera公司的工作与EDA厂家紧密结合,使QuartusII软件可以与其它工业标准的设计输入、综合和校验工具相连接。设计者可以使用Altera或标准EDA输入工具进行设计,使用QuartusII编译器对Altera器件的设计进行编译,并使用Altera或其它EDA校验工具进行仿真。目前,QuartusII支持与Cadence,Mentor Graphics, Synopsys, Viewlogic等EDA工具接口。QuartusII的设计输入、处理和校验功能都集中在统一的开发环境下,这样可以加快动态调试,缩短开发周期。QuartusII软件支持多种硬件描述语言设计输入,包括VHDL,Verilog HDL和Altera自己的硬件描述语言AHDL。 QuartusII软件提供丰富的库单元供设计调用,其中包括74系列的全部器件和一些基本的逻辑门,多种特殊的逻辑宏功能(Macro-Function)以及新型的参数化的兆功能(Mage-Function).调用库单元进行设计,可以大大减轻工作量。 2 VHDL简介 2.1VHDL硬件描述语言简介模块是VHDL的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的外部端口。一个设计的结构可使用开关级原语、门级原语和用户定义的原语方式描述; 设计的数据流行为使用连续赋值语句进行描述; 时序行为使用过程结构描述。一个模块可以在另一个模块中使用。说明部分用于定义不同的项,例如模块描述中使用的寄存器和参数。语句定义设计的功能和结构。说明部分和语句可以散布在模块中的任何地方;但是变量、寄存器、线网和参数等的说明部分必须在使用前出现。为了使模块描述清晰和具有良好的可读性, 最好将所有的说明部分放在语句前。本书中的所有实例都遵守这一规范。在模块中,可用下述方式描述一个设计:(1) 数据流方式;(2) 行为方式;(3) 结构方式;(4) 上述描述方式的混合。VHDL模型中的所有时延都根据时间单位定义。 在顺序过程中出现的语句是过程赋值模块化的实例。模块化过程赋值在下一条语句执行前完成执行。过程赋值可以有一个可选的时延。时延可以细分为两种类型:(1) 语句间时延: 这是时延语句执行的时延。(2) 语句内时延: 这是右边表达式数值计算与左边表达式赋值间的时延。在VHDL中可使用如下方式描述结构:(1) 内置门原语(在门级);(2) 开关级原语(在晶体管级);(3) 用户定义的原语(在门级);(4) 模块实例 (创建层次结构)。3 各模块电路及其简介3.1 分频器模块 图3.1 分频器模块因为本实验选用频率为10KHZ,对于秒表的计时和进行数码管的动态扫描来说,频率都太大了,因此要将10KHz进行分频处理,本次设计将分成1Hz频率。3.2 控制调节模块图3.2 控制调节模块 本模块用于时间与日期的切换与时间的调节、日期的调节以及复位调节,其中K1用于时间与日期的切换,S1、S2用于时间的调节,S3、S4、S5用于日期的调节,最后S8为复位按键。3.3 报警模块 图3.3 报警模块 报警模块中有两个报警输出,其一为蜂鸣器,在整点前十秒开始发声;其二为LED灯显示输出,在最后5秒按照一定的规律亮灯。本模块受到前一模块输出分、秒的控制。3.4 数码管显示模块图3.4 数码管显示模块很显然,此模块是用来进行数码管显示的,先进行动态扫描,然后将程序中要求输出的部分通过7段数码管显示出来。其中K1用于控制显示部分是日期还是时间。比之于静态显示,动态显示有着不可替代的优点:占用数据线少,功耗小。3.5 16*16点阵控制模块图3.5 16*16点阵控制模块 本模块用于控制后面的16*16点阵显示模块,其中keyc用于控制点阵的行扫描,S为4根数据总线,用于控制点阵数据的动态显示。3.6 16*16点阵显示模块 图3.6 16*16点阵显示模块 该模块用于满足实验内容中用16*16点阵动态显示日期的要求。可以看出,输出为每一行的数据,通过动态扫描之后就可以动态的显示所有的16行数据。4 设计步骤4.1新建一个工程(1)打开Quartus II 12.1sp1仿真软件,点击File=>New Project Wizard按钮创建一个新的工程。弹出如图所示对话框:(2)再点击Next按钮出现下一对话框并将工程名和文件名都命名为zjh:(3)然后再点击Next按钮出现下一对话框将Family设置为cycloneIII,将Package设置为FBGA,将Picount设置为780,将Speed grade设置为8并选择EP3C80F780C8器件,如图所示:(4)最后点击Next=>Finish按钮完成新工程的创建。4.2新建一个VHDL文件(1) 点击File=>New按钮出现如图所示对话框:(2) 选择VHDL File完成文件创建,创建完成后如图所示:4.3VHDL程序的编译及仿真4.3.1VHDL程序的编译 将编写好的符合实验要求的VHDL程序复制在上图所示的对话框内,然后点击Processing=>Start Compilation按钮开始进行编译,编译完成并确保程序无误后开始进行管脚分配。4.3.2管脚分配(1)点击Assignments=>Assignments Editor按钮出现如图所示对话框:(2) 再点击List、>>、OK按钮出现如图所示管脚分配对话框:(3) 然后按如下表所示的管脚顺序进行分配:Display0LocationPIN_G16YesDisplay1LocationPIN_G17YesDisplay2LocationPIN_F18YesDisplay3LocationPIN_G18YesDisplay4LocationPIN_G15YesDisplay5LocationPIN_G14YesDisplay6LocationPIN_G12YesDisplay7LocationPIN_M21YesK1LocationPIN_AH12Yeskeyc0LocationPIN_L5Yeskeyc1LocationPIN_H6Yeskeyc2LocationPIN_H7Yeskeyc3LocationPIN_H5Yeskeyr0LocationPIN_C17Yeskeyr1LocationPIN_D15Yeskeyr2LocationPIN_D14Yeskeyr3LocationPIN_D13Yeskeyr4LocationPIN_D12Yeskeyr5LocationPIN_D10Yeskeyr6LocationPIN_C10Yeskeyr7LocationPIN_C9Yeskeyr8LocationPIN_D21Yeskeyr9LocationPIN_C21Yeskeyr10LocationPIN_D20Yeskeyr11LocationPIN_D19Yeskeyr12LocationPIN_C19Yeskeyr13LocationPIN_D18Yeskeyr14LocationPIN_C18Yeskeyr15LocationPIN_D17Yesled0LocationPIN_AE8Yesled1LocationPIN_J22Yesled2LocationPIN_M24Yesled3LocationPIN_L24YesS1LocationPIN_AF5YesS2LocationPIN_AH6YesS3LocationPIN_AH7YesS4LocationPIN_AH8YesS5LocationPIN_AG10YesS8LocationPIN_AG7YesSEG_SEL0LocationPIN_C22YesSEG_SEL1LocationPIN_D22YesSEG_SEL2LocationPIN_G9YesspkLocationPIN_L23ClkLocationPIN_A14Yes(4) 分配完成后再进行一次编译以使管脚分配生效。4.3.3下载与仿真 用下载线将电脑USB接口和试验箱VGA接口相连接,点击Tools=>Programmer按钮将Output File内的文件添加进去,再点击Start按钮将结果下载到试验箱内。观察并操作试验箱看仿真结果能否满足数字时钟的设计需求。5 心得与体会 这次的EDA课程设计是我大学的第三次课程设计,由于刚开始设计思路不清晰,对Quartus II 12.1sp1仿真软件的运用也不熟练而且相关的知识准备也不充分,所以拿到设计题目后感觉不知所措,不知道如何开始。但是通过一段时间的查阅资料和请教同学老师我发现设计多功能数字时钟也并不十分困难,在他们的帮助与指导下我的课程设计也就顺利的一步步展开。通过这次课程设计让我体会到在实际的操作过程中,要把理论中所学的知识灵活地运用起来,在程序调试中会遇到各种各样的问题,而耐心就是我们最好的帮手,遇事不能急、不能慌,慢慢分析才能解决问题。这次课程设计提高了我解决问题的能力,使我学会了在设计中怎样去查找问题,然后怎样解决问题。这次课程设计让我可以熟练的掌握了Quartus II 12.1sp1仿真软件的操作,也了解了如何运用VHDL语言和FPGA芯片去解决实际问题,总之通过这次课程设计自己还是有了不小的收获与提高。6 参考文献1 SOPCIIEDA实验指导书(第二版)2 SOPCII使用手册(第二版)3 4 EDA技术基础. 谭会生编著. 湖南大学出版社,20045 EDA技术实用教程(第三版),潘松、黄继业编著 ,科学出版社 ,20107附录附录一 VHDL程序清单library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity zjh is port( Clk : in std_logic; -时钟输入 S8 : in std_logic; -复位输入 S1,S2 : in std_logic; -Change Hour, Minute S3,S4,S5 : in std_logic; -Change Year, Month and Day spk : out std_logic; -蜂鸣器 led : out std_logic_vector(3 downto 0); -整点输报时输出 Display : out std_logic_vector(7 downto 0); -七段码管显示输出 SEG_SEL : buffer std_logic_vector(2 downto 0); -七段码管扫描驱动 keyc : out std_logic_vector(3 downto 0); keyr : out std_logic_vector(15 downto 0); K1 : in std_logic -显示切换end zjh;architecture behave of zjh is signal Disp_Temp : integer range 0 to 15; signal Disp_Decode : std_logic_vector(7 downto 0); signal SEC1,SEC10 : integer range 0 to 9; signal MIN1,MIN10 : integer range 0 to 9; signal HOUR1,HOUR10 : integer range 0 to 9; signal Year1,Year10 : integer range 0 to 9; signal Month1,Month10: integer range 0 to 9; signal Day1,Day10 : integer range 0 to 9; signal Music_Count : std_logic_vector(2 downto 0); signal Clk_Count1 : std_logic_vector(13 downto 0); -产生1Hz时钟的分频计数器 signal Clk1Hz : std_logic; signal led_count : std_logic_vector(2 downto 0); signal led_display : std_logic_vector(3 downto 0); signal cdount : std_logic_vector(3 downto 0); signal dount : std_logic_vector(12 downto 0); signal s : std_logic_vector(3 downto 0); signal m,d,y : integer range 0 to 31; begin process(Clk) begin if(Clk'event and Clk='1') then if(Clk_Count1<10000) then Clk_Count1<=Clk_Count1+1; else Clk_Count1<="00000000000001" end if; end if; end process; Clk1Hz<=Clk_Count1(13); process(Clk1Hz,S8) begin if(S8='0') then -系统复位 SEC1<=0; SEC10<=0; MIN1<=0; MIN10<=0; HOUR1<=0; HOUR10<=0; Year10 <= 1; Year1 <= 3; Month10 <= 0; Month1 <= 1; Day10 <= 0; Day1 <= 1; elsif(Clk1Hz'event and Clk1Hz='1') then -正常运行 if (K1= '1') then if(S3='0') then -调节年 if(Year1=9) then Year1<=0; Year10<=Year10+1; elsif(Year10=9 and Year1=9) then Year1<=0; Year10<=0; else Year1<=Year1+1; end if; end if; if(S4='0') then -调节月 if(Month1=9) then Month1<=0; Month10<=Month10+1; elsif(Month10=1 and Month1=2) then Month1<=0; Month10<=0; Year1<=Year1+1; else Month1<=Month1+1; end if; end if; if(S5='0') then -调节日 if(Day1=9) then Day1<=0; Day10<=Day10+1; elsif(Day10=3 and Day1=1) then Day1<=0; Day10<=0; Month1<=Month1+1; else Day1<=Day1+1; end if; end if; elsif (K1 = '0') then if(S1='0') then -调节小时 if(HOUR1=9) then HOUR1<=0; HOUR10<=HOUR10+1; elsif(HOUR10=2 and HOUR1=3) then HOUR1<=0; HOUR10<=0; Day1<=Day1+1; else HOUR1<=HOUR1+1; end if; elsif(S2='0') then -调节分钟 if(MIN1=9) then MIN1<=0; if(MIN10=5) then MIN10<=0; HOUR1<=HOUR1+1; else MIN10<=MIN10+1; end if; else MIN1<=MIN1+1; end if; end if; end if; if(SEC1=9) then SEC1<=0; if(SEC10=5) then SEC10<=0; if(MIN1=9) then MIN1<=0; if(MIN10=5) then MIN10<=0; if (HOUR10 >= 2 and HOUR1 >= 3) thenHOUR10 <= 0;HOUR1 <= 0;- Day += 1;if (Day10 = 3 and Day1 = 0) thenDay10 <= 0;Day1 <= 1;- Month += 1;if (Month10 = 1 and Month1 = 2) thenMonth10 <= 0;Month1 <= 1;- Year += 1;if (Year10 = 9 and Year1 = 9) thenYear10 <= 0; Year1 <= 0;end if;if (Year1 < 9) thenYear1 <= Year1 + 1;elsif (Year1 = 9) thenYear10 <= Year10 + 1;Year1 <= 0;end if;end if;if (Month1 < 9) thenMonth1 <= Month1 + 1;elsif (Month1 = 9) thenMonth10 <= Month10 + 1;Month1 <= 0;end if;end if;if (Day1 < 9) thenDay1 <= Day1 + 1;elsif (Day1 = 9) thenDay10 <= Day10 + 1;Day1 <= 0;end if;elsif (HOUR1 < 9) thenHOUR1 <= HOUR1 + 1;elsif (HOUR1 = 9) thenHOUR1 <= 0;HOUR10 <= HOUR10 + 1;end if; else MIN10<=MIN10+1; end if; else MIN1<=MIN1+1; end if; else SEC10<=SEC10+1; end if; else SEC1<=SEC1+1; end if; end if; end process; process(Clk) begin if(Clk'event and Clk='1') then Music_Count<=Music_Count+1; if(MIN10=5 and MIN1=9 and SEC10=5 and SEC1=0) then -在59分50秒开始提示 if(SEC1 MOD 2)=0) then -在偶数秒开始发声 SPK<=Music_Count(2); -嘀 else SPK<='0' end if; elsif(MIN10=0 and MIN1=0 and SEC10=0 and SEC1=0) then SPK<=Music_Count(1); -嗒 else SPK<='0' end if; end if; end process; process(Clk) begin if(Clk1hz'event and Clk1hz='1') then if(MIN10=5 and MIN1=9 and SEC10=5 and SEC1>4) then -在59分55秒开始提示 led_Count<=led_Count+1; else led_count<="000" end if; end if; end process; process(led_count) begin case (led_count) is when "000"=>led_display<="0000" when "001"=>led_display<="1001" when "010"=>led_display<="0110" when "011"=>led_display<="1010" when "100"=>led_display<="0101" when "101"=>led_display<="1111" when others=>led_display<="0000" end case; led<=led_display; end process; process(SEG_SEL) beginif (K1 = '1') then case (SEG_SEL+1) iswhen "000"=>Disp_Temp<=Year10;when "001"=>Disp_Temp<=Year1;when "010"=>Disp_Temp<=10;when "011"=>Disp_Temp<=Month10;when "100"=>Disp_Temp<=Month1;when "101"=>Disp_Temp<=10;when "110"=>Disp_Temp<=Day10;when "111"=>Disp_Temp<=Day1; end case;elsif (K1 = '0') then case (SEG_SEL+1) iswhen "000"=>Disp_Temp<=HOUR10;when "001"=>Disp_Temp<=HOUR1;when "010"=>Disp_Temp<=10;when "011"=>Disp_Temp<=MIN10;when "100"=>Disp_Temp<=MIN1;when "101"=>Disp_Temp<=10;when "110"=>Disp_Temp<=SEC10;when "111"=>Disp_Temp<=SEC1; end case;end if; end process; process(Clk) begin if(Clk'event and Clk='1') then -扫描累加 SEG_SEL<=SEG_SEL+1; Display<=Disp_Decode; end if; end process; process(Disp_Temp) -显示转换 begin case Disp_Temp is when 0=>Disp_Decode<="00111111" -0 when 1=>Disp_Decode<="00000110" -1 when 2=>Disp_Decode<="01011011" -2 when 3=>Disp_Decode<="01001111" -3 when 4=>Disp_Decode<="01100110" -4 when 5=>Disp_Decode<="01101101" -5 when 6=>Disp_Decode<="01111101" -6 when 7=>Disp_Decode<="00000111" -7 when 8=>Disp_Decode<="01111111" -8 when 9=>Disp_Decode<="01101111" -9 when 10=>Disp_Decode<="01000000" - when others=>Disp_Decode<="00000000" -全灭 end case; end process; process(clk) -显示时序控制 begin if clk'event and clk='1' then