收藏 分销(赏)

fpga数字钟专业课程设计方案报告.docx

上传人:a199****6536 文档编号:2798358 上传时间:2024-06-06 格式:DOCX 页数:29 大小:249.13KB 下载积分:10 金币
下载 相关 举报
fpga数字钟专业课程设计方案报告.docx_第1页
第1页 / 共29页
fpga数字钟专业课程设计方案报告.docx_第2页
第2页 / 共29页


点击查看更多>>
资源描述
课程设计汇报 设计题目:基于FPGA数字钟设计 班级:电子信息工程1301 学号:3638 姓名:王一丁 指导老师:李世平 设计时间:1月 摘要 EDA(Electronic Design Automation)电子设计自动化,是以大规模可编程器件为设计载体,以硬件描述语言为系统逻辑描述关键表示方法,经过相关软件,自动完成软件方法设计得电子系统到硬件系统,最终形成集成电子系统或专用集成芯片。此次课程设计利用Quartus II 为设计软件,VHDL为硬件描述语言,结合所学知识设计一个多功效时钟,含有显示年、月、日、时、分、秒显示,计时,整点报时,设定时间等功效。利用硬件描述语言VHDL 对设计系统各个子模块进行逻辑描述,采取模块化思想完成顶层模块设计,经过软件编译、逻辑化简、逻辑综合优化、逻辑仿真、最终完成此次课程设计任务。 关键词:EDA VHDL语言 数字钟 目 录 摘要 1 课程设计目标 2 课程设计内容及要求 2.1 设计任务 2.2 设计要求 3 VHDL程序设计 3.1方案论证 3.2 系统结构框图 3.3设计思绪和方法 3.3.1 状态控制模块 3.3.2 时分秒模块 3.3.3 年月日模块 3.3.4 显示模块 3.3.5脉冲产生模块 3.3.6 扬声器和闹钟模块 3.4 RTL整体电路 4 系统仿真和分析 5 课程设计总结,包含.收获、体会和提议 6 参考文件 1 课程设计目标 (1)经过设计数字钟熟练掌握EDA软件(QUARTUS II)使用方法,熟练进行设计、编译,为以后实际工程问题打下设计基础。 (2)熟悉VHDL 硬件描述语言,提升分析、寻求和排除电子设计中常见故障能力。 (3)经过课程设计,锻炼书写有理论依据、实事求是、文理通顺课程设计汇报。 2 课程设计内容及要求 2.1 设计任务 (1)6个数字显示器显示时分秒,setpin按键产生一个脉冲,显示切换为年月日。 (2)第二个脉冲可预置年份,第三个脉冲能够预置月份,依次第四、 五、六、七个脉冲到来时分别能够预置时期、时、分、秒,第八个脉冲到来后预置结束正常从左显示时分秒。 (3)up为高时,upclk有脉冲抵达时,预置位加一,不然减一。 2.2 设计要求 (1)在基础功效基础上,闹钟在整点进行报时,产生一定时长高电平。 (2)实现闹钟功效,可对闹钟时间进行预置,当达成预置时间时进行报时。 3 VHDL程序设计 3.1方案论证 该数字钟能够实现:计时功效、整点报时、闹钟和预置时间功效,所以时钟系统可分为5个模块:功效选择模块、时分秒计数模块、年月日计数模块、显示模块、扬声器模块、脉冲产生模块。 (1) 功效选择模块是有状态机组成,功效为依次进行、设置时间、设置闹钟时间。 调整工作状态:数字钟初始状态显示时分秒,在setpin按键产生一个脉冲,显示切换为年月日。 设置时间:第二个脉冲可预置年份,第三个脉冲能够预置月份,依次第四、 五、六、七个脉冲到来时分别能够预置时期、时、分、秒。第八个脉冲到来后,预置结束恢复初始状态,正常显示时分秒。 设置闹钟时间:闹钟在setpin1按键产生第一个脉冲时设定闹钟时,第二个脉冲设定分,第三个脉冲设定秒,第四个脉冲恢复显示时分秒。 (2)时分秒计数模块包含正常计时、闹钟、整点报时三个功效。 正常计时功效经过软件编写,60进制秒计数器,60进制分计数器,24进制时计数器。时分秒计数器含有清0、置数、进位和计数功效。其中reset为清0信号,当reset为0时,时分秒计数器清0。当set产生第四个脉冲后,连续产生set信号使分秒计数器依次进行置数。以upclk为时钟,经过up对预置位进行控制,当up为高时且upclk有脉冲到来时,预置位加一,不然减一。当set产生第八个脉冲时,数字钟恢复时分秒显示。 闹钟功效是在正常计数功效上拓展,分为闹钟时间预置和闹钟响应两个部分。闹钟时间预置功效:当set1连续产生脉冲时,依次对闹钟时分秒位进行预置。以upclk为时钟,经过up对预置位进行控制,当up为高时且upclk有脉冲到来时,预置位加一,不然减一。当set1产生第四个脉冲时,数字钟恢复时分秒显示。和此同时在程序中增添变量时计时功效能够连续运行。闹钟响应功效:经过预置后,储存变量和计时器模块时、分、秒进行比对,当初、分、秒相同时,模块产生一个一段时间高电平,传输给闹钟响应模块。 整点报时功效:当计数器中分位等于59,秒位等于59时,模块产生一段高电平,输出给扬声器模块进行报时。 (3) 年月日计数模块分为年月日计数功效,年月日预置数功效。 年月日计数功效:以时位进位脉冲为计时脉冲,闰年二月份为29天,一般年二月份为28天。一月、三月、五月、七月、八月、十月、十二月为31天,四月、六月、九月、十一月为30天。 年月日预置数功效:当set产生第一个脉冲后,依次进行年月日数器置数。以upclk为时钟,经过up对预置位进行控制,当up为高时且upclk有脉冲到来时,预置位加一,不然减一。 (4) 显示模块:以时分秒,年月日模块输出、状态标志为输入信号,经过状态控制模块产生状态标志对显示模块进行控制,显示计时、预置时不一样状态。 (5)扬声器模块:输入信号为分位、秒位和状态信号,当计时时钟抵达整点是输出高电平,其它时刻输出低电平。 (6)脉冲产生模块:对输入信号进行1000分频,产生周期为一秒时钟信号,用于数字钟时钟输入。 3.2系统结构框图 3.3设计思绪和方法 3.3.1 状态控制模块 状态控制模块实现对各个功效模块整体设计,包含对时间和日期显示和调整,闹钟显示和调整等控制操作。状态机输入为setpin,setpin1,upclk。状态机状态有11种状态。:闹钟设置时位; :闹钟设置分位; :闹钟设置秒位; :时钟显示时分秒;:时钟显示年月日; :钟设置年; :时钟设置月; :时钟设置日; :时钟设置时; :时钟设置分; :设置秒 在产生如上状态同时产生Tlock,flag状态标志,此标志用来进行时钟设置、闹钟设置和显示控制。 RTL 电路图 实现代码以下: process(upclk) begin if (upclk='1' and upclk'LAST_VALUE='0')then state<=next_state; -- 实现实状况态变换 end if; end process; process(state,setpin,setpin1) begin next_state<=state; case(state) is when s0 => Tlock<="0000"; flag<='1'; if(setpin1='1' and setpin1'LAST_VALUE='0')then next_state<=g0; end if; if(setpin='1' and setpin'LAST_VALUE='0') then next_state<=s1; end if; when s1=> Tlock<="0001"; flag<='1'; if(setpin1='1' and setpin1'LAST_VALUE='0')then next_state<=g0;end if; if(setpin='1' and setpin'LAST_VALUE='0') then next_state<=s2;end if; when s2=> Tlock<="0010"; flag<='1'; if(setpin1='1' and setpin1'LAST_VALUE='0')then next_state<=g0;end if; if(setpin='1' and setpin'LAST_VALUE='0') then next_state<=s3;end if; when s3=> Tlock<="0011"; flag<='1'; if(setpin1='1' and setpin1'LAST_VALUE='0')then next_state<=g0;end if; if(setpin='1' and setpin'LAST_VALUE='0') then next_state<=s4;end if; when s4=> Tlock<="0100"; flag<='1'; if(setpin1='1' and setpin1'LAST_VALUE='0')then next_state<=g0;end if; if(setpin='1' and setpin'LAST_VALUE='0') then next_state<=s5;end if; when s5=> Tlock<="0101"; flag<='1'; if(setpin1='1' and setpin1'LAST_VALUE='0')then next_state<=g0;end if; if(setpin='1' and setpin'LAST_VALUE='0') then next_state<=s6; end if; when s6=> Tlock<="0110"; flag<='1'; if(setpin1='1' and setpin1'LAST_VALUE='0')then next_state<=g0;end if; if(setpin='1' and setpin'LAST_VALUE='0') then next_state<=s7;end if; when s7=> Tlock<="0111"; flag<='1'; if(setpin1='1' and setpin1'LAST_VALUE='0')then next_state<=g0;end if; if(setpin='1' and setpin'LAST_VALUE='0') then next_state<=s0; end if; when g0=> Tlock<="1000"; flag<='0'; if(setpin1='1' and setpin1'LAST_VALUE='0')then next_state<=g1;end if; if(setpin='1' and setpin'LAST_VALUE='0') then next_state<=s0;end if; when g1=> Tlock<="1001"; flag<='0'; if(setpin1='1' and setpin1'LAST_VALUE='0')then next_state<=g2;end if; if(setpin='1' and setpin'LAST_VALUE='0') then next_state<=s0; end if; when g2=> Tlock<="1010"; flag<='0'; if(setpin1='1' and setpin1'LAST_VALUE='0')then next_state<=s0;end if; if(setpin='1' and setpin'LAST_VALUE='0') then next_state<=s0;end if; when others=> next_state<=s0; end case; end process; 3.3.2 时分秒模块 时分秒模块输入为ce(使能端),clk0(系统输入时钟),clk1(upclk时钟),flag(标志位),lock(状态位),up(预置位增减控制),ov(进位位),op(闹钟和扬声器响应)。 时分秒模块RTL电路图 时钟选择方法:在初始状态和显示年月日状态下,时分秒模块时钟输入为系统时钟输入(clk0),在其它状态下,时分秒模块时钟输入为(upclk时钟)用来进行置位。 实现代码入下: process(lock,clk0,clk1) begin if(lock="0000" or lock="0001")then clk<=clk0; --正常计数时选择clk0 else clk<=clk1; --预置时候clk1 end if; end process; 时钟计时功效,在显示年月日,时分秒状态时,时钟正常计数。当数字钟处于置数状态时,年、月、日、时、分、秒时钟停止计时,各个位显示预置数。在闹钟预置功效实现同时,经过增添变量,在设置闹钟同时确保时钟正常计数,在闹钟预置结束后,恢复到初始时钟显示。 3.2.3 年月日模块 年月日模块分为日期增加和日期减小两个部分,日期增加:在显示时分秒,显示年月日和设置完秒位状态下,假如是二月,经过函数判定是否为闰年,其它月份对大小月进行判定,大月为31天,小月为30天,代码以下: if(clk'event and clk='1')then if(ce='1')then if(lock="0000")or(lock="0001")or(lock="0100"and up='1')then if(mon0="0010"and mon1="0000") then Feb_add_day(Td0,Td1,tempy0,tempy1,date0,date1); elsif((mon0="0001"and mon0="0000")or(mon0="0011")or(mon0="0101") or(mon0="0111")or(mon0="1000")or(mon0="0000"and mon1="0001")or(mon0="0010"and mon1="0001"))then oddmonth_add_day(Td0,Td1,date0,date1); else evenmonth_add_day(Td0,Td1,date0,date1); end if; end if; 日期降低同理,代码以下: if(lock="0100"and up='0')then if(mon0="0010"and mon1="0000")then Feb_add_day(Td0,Td1,tempy0,tempy1,date0,date1); elsif((mon0="0001"and mon1="0000")or(mon0="0011")or(mon0="0101") or(mon0="0111")or(mon0="1000")or(mon0="0000"and mon1="0001") or(mon0="0010"and mon1="0001"))then oddmonth_sub_day(Td0,Td1,date0,date1); else evenmonth_sub_day(Td0,Td1,date0,date1); END IF; end if; end if; end if; 当以日位进位为输入,当存在输入脉冲时,经过函数对月份进行加减,代码以下: begin if(clk'event and clk='1')then if(ce='1')then if(lock="0000")or (lock="0001")or (lock="0011"and up='1')then add_month(Tm0,Tm1,mon0,mon1); end if; if(lock="0011"and up='0')then sub_month(Tm0,Tm1,mon0,mon1); end if; if (lock="0000")or (lock="0001") then if(mon0="0010"and mon1="0001")then sub_year(Ty0,Ty1,year0,year1); end if; end if; if(lock="0010"and up='1')then add_year(Ty0,Ty1,year0,year1); end if; if(lock="0010"and up='0')then sub_year(Ty0,Ty1,year0,year1); end if; end if; end if; 3.2.4 显示模块 显示模块输入为年、月、日、时、分、秒、lock(状态标志),经过if语句,状态机一共提供11钟状态。在不一样状态下,给显示模块年月日时分秒不一样输入,从而得到要求显示。 显示电路RTL电路 代码以下: process(lock,sec0,sec1,min1,min0,hour1,hour0,date0,date1,mon0,mon1,year0,year1) begin if(lock="0000")then a0<=sec0;a1<=sec1;b0<=min0;b1<=min1;c0<=hour0;c1<=hour1; end if; if(lock="0001")then a0<=date0;a1<=date1;b0<=mon0;b1<=mon1;c0<=year0;c1<=year1; end if; if(lock="0101")or(lock="1000")then a0<="1111";a1<="1111";b0<="1111";b1<="1111";c0<=hour0;c1<=hour1; end if; if(lock="0110")or(lock="1001")then a0<="1111";a1<="1111";b0<=min0;b1<=min1;c0<="1111";c1<="1111"; end if; if(lock="0111")or(lock="1010")then a0<=sec0;a1<=sec1;b0<="1111";b1<="1111";c0<="1111";c1<="1111"; end if; if(lock="0010")then a0<="1111";a1<="1111";b0<="1111";b1<="1111";c0<=year0;c1<=year1; end if; if(lock="0011")then a0<="1111";a1<="1111";b0<=mon0;b1<=mon1;c0<="1111";c1<="1111"; end if; if(lock="0100")then a0<=date0;a1<=date1;b0<="1111";b1<="1111";c0<="1111";c1<="1111"; end if; end process; end led_disp_arc; 3.2.5脉冲发生模块(分频电路) 脉冲发生电路将提供1000hz频率分频成1hz(供系统时钟)。f1000为1000hz输入,second_wave为分频输出。 分频器RTL电路 代码以下: process(f1000,cnt) begin if(f1000'event and f1000='1')then if(cnt="00000011")then cnt<="";second_wave<=not second_wave; else cnt<=cnt+'1'; end if; end if; end process; end second_wave_arc; 3.2.6 扬声器模块 模块输入为clk(系统时钟),op(响应信号),vcc(闹钟使能端),ala(高电平输出)。当vcc为高时,且当op有响应信号输入(高),闹钟产生一定时长高电平。 闹钟RTL电路 代码以下: signal temp1:std_logic_vector(3 downto 0); begin process(op,vcc,clk) begin if clk'event and clk='1' then if(vcc='1')then if(temp1="1111")then ala<=not ala; else temp1<=temp1+'1'; ala<='1'; end if; end if; end if; end process; end alarm_arc; 3.3整体RTL电路 4 系统仿真和分析 4.1对基础要求仿真 初态设置:setpin1=0;up=0;setpin置连续8个脉冲,f1000为频率为1000hz方波。 分析:在setpin第一次脉冲到来时,显示年月日,因为数字钟是初始状态所以年月日均为0。Setpin。第二次脉冲到来时对时进行预置数,因为up=0,所以设置时位,时位在不停地减小,在后面各位预置过程中,每一位预置过程全部是减小。第三次脉冲来到是对分位进行预置,第四次脉冲到来时对秒位进行预置。第四次脉冲到来时对年进行预置,第五次脉冲到来时对月进行预置,第六次脉冲到来时对日进行预置。第七次脉冲到来时,数字钟显示时分秒,从仿真结果能够看出来,此时时钟是从预置时间开始计时,第八次脉冲到来时,此时时钟显示是年月日,此时显示年月日为预置年月日。 从上述分析能够看出,经过仿真程序基础达成数字钟基础要求,系统可靠。 4.2对闹钟状态转换仿真 初始设置:初态设置:setpin1设计一个脉冲;up=0;setpin置连续2个脉冲,f1000为频率为1000hz方波。 当第一个setpin脉冲到来时,显示年月日,第二个setpin脉冲来临时时钟对年进行预置,以后setpin1第一个脉冲到来,时钟状态转为对闹钟时间设置,达成试验要求。 4.3对闹钟功效仿真 初始设置:初态设置:setpin1设计三个脉冲;up=0;f1000为频率为1000hz方波。 数字钟原状态显示时分秒,因为未进行初始化,所以时分秒从0开始计时,当setpin1第一个脉冲到来时,数字钟对闹钟时刻时位进行预置,当setpin1第二个脉冲到来时,数字钟对闹钟时刻分位进行预置,当setpin1第三个脉冲到来时,数字钟对闹钟时刻秒位进行预置,当第四个脉冲到来是恢复显示时分秒,此时时分秒已经计数到51秒,符合预期,在设置闹钟同时,时钟依旧计数,达成要求。 同时从初始时刻,闹钟扬声器产生一定时长高电平能够看出整点报时功效良好,达成设计要求。 5 课程设计总结(收获、体会和提议) 此次VHDL设计数字钟定义了三种类型端口,分别是in、out、buffer。In和out端口使用简单,buffer端口含有回读功效,因为buffer类型端口不能连接到其它类型端口上,所以不利于子模块原件例化,不利于大型设计。 进程(Process)是VHDL中最为关键部分,在此次设计中。我出现了对于时钟引入,输出多驱动,一个进程中不许可出现两个时钟沿触发错误,这些错误在未来设计中全部是应该避免。次序语句如IF语句、CASE语句、LOOP语句、变量赋值语句等必需出现在进程、函数或子程序内部,而不能单独出现在进程之外。 此次试验让我对VHDL 语言有了更深认识,对语言利用愈加熟悉,为未来实际应用打下了良好基础。因为试验室条件限制,并没有将程序下载到实际器件中观察现象,只是经过软件对系统进行仿真,期望以后能够机会接触并使用实际器件。 6 参考文件 1. 吴廷鑫. 基于FPGA多功效数字钟设计[J]. 科技经济市场, , (5): 1-5 2.徐大诏. 基于FPGA实现数字钟设计[J]. 信息技术, , (12): 101-104 3.张子刚, 卢戈, 田鹏. 基于VHDL数字时钟设计[J]. 气象水文海洋仪器, , (2): 10-14 4.樊永宁, 张晓丽. 基于VHDL多功效数字钟设计[J]. 工矿自动化, , (3): 92-94 5.江翠云 基于CPLD和VHDL数字钟设计[期刊论文]-硅谷(2)
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服