logo资料库

东北大学EDA数字钟课程设计报告.doc

第1页 / 共50页
第2页 / 共50页
第3页 / 共50页
第4页 / 共50页
第5页 / 共50页
第6页 / 共50页
第7页 / 共50页
第8页 / 共50页
资料共50页,剩余部分请下载后查看
一、 课程设计目的
掌握利用可编程逻辑器件和EDA设计工具进行电子系统设计的方法,内容包括:
二、设计内容和要求
三、设计思路
1、普通计数器(时、分、秒、月、年计数器)设计
2、可变进制计数器(天计数器)设计
3:主控模块设计
4:星期模块设计
5:闹钟模块
6:整点报时功能的实现
四、仿真与分析
1:六十进制计数器部分(秒、分模块)
(1)Set 为0:计数器正常计数
(2)Set 为1 :计数器进入调节状态
(3)Set 为1 :计数器进入调节状态
(4) 计数器清零图
2:二十四进制计数器部分(小时模块)
3:十二进制计数器部分(月模块)
4:一百进制计数器部分(年模块)
5:可变进制计数器模块(天模块)
(1):sel=“00”
(2):sel=“01”
(3):sel=“10”
(4):sel=“11”
6:主控部分
(1)平年闰年、大小月部分验证
(2)状态机验证部分
五、器件编程下载及设计结果
1、Ucf管脚映射文件
2、经过下载验证要求内容全部完成,自己增加的星期显示、整点报时、闹钟定时等功能也都圆满完成。
六、课程设计总结、收获、体会和建议
七、参考文献
八、程序清单
1:顶层模块
2:主控模块
3:秒、分计数模块
4:小时计数模块
5:天计数模块
6:月计数模块
7:年计数模块(两个计数器100进制)
8:星期计数模块
9:定时器模块
九、附录
1 课 程 设 计 报 告 设计题目:用VHDL语言实现数字钟的设计 班 级: 电子0903班 学 号:20092735 姓 名:孙东征 指导教师:李世平、李宁 设计时间:2011 年 12 月
2 摘 要 数字钟是一种用数字电路技术实现时、分、秒计时的钟表。与机械钟相比具 有更高的准确性和直观性,具有更长的使用寿命,已得到广泛的使用。数字钟的 设计方法有许多种,本设计采用赛林思公司的 FPGA 作为硬件平台、QUARTUSII 作为编写程序和仿真的平台,ISE 来编译程序并实现管教锁定和下载的软件平台 来实现数字钟。 本 设 计 的 程 序 用 VHDL 语 言 编 写 , 由 本 人 独 立 设 计 完 成 。 整 体 采 用 TOP-TO-DOWN 设计思路。最顶层采用原件例化的方法,各个模块内部采用进程和 状态机来设计完成。主要电路为:主控状态机模块、秒计数模块、分计数模块、 时计数模块、天计数模块、月计数模块、年计数模块、星期计数模块、定时模块。 关键词:计数器,数字钟,状态机,FPGA,EDA,VHDL,原件例化
3 目 录 一、 课程设计目的 ............................................................................................................................4 二、设计内容和要求 ..........................................................................................................................4 三、设计思路..................................................................................................................................... 4 1、普通计数器(时、分、秒、月、年计数器)设计..........................................6 2、可变进制计数器(天计数器)设计..................................................................6 3:主控模块设计......................................................................................................7 4:星期模块设计......................................................................................................9 5:闹钟模块............................................................................................................10 6:整点报时功能的实现........................................................................................10 四、仿真与分析................................................................................................................................10 1:六十进制计数器部分(秒、分模块)............................................................11 2:二十四进制计数器部分(小时模块)............................................................13 3:十二进制计数器部分(月模块)....................................................................13 4:一百进制计数器部分(年模块)....................................................................14 5:可变进制计数器模块(天模块)....................................................................14 6:主控部分............................................................................................................16 (1)平年闰年、大小月部分验证....................................................................................................16 (2)状态机验证部分........................................................................................................................ 17 五、器件编程下载及设计结果........................................................................................................ 19 1、UCF 管脚映射文件............................................................................................. 19 2、经过下载验证要求内容全部完成,自己增加的星期显示、整点报时、闹钟 定时等功能也都圆满完成。..................................................................................20 六、课程设计总结、收获、体会和建议.........................................................................................20 七、参考文献................................................................................................................................... 21 八、程序清单................................................................................................................................... 22 1:顶层模块............................................................................................................22 2:主控模块............................................................................................................29 3:秒、分计数模块................................................................................................35 4:小时计数模块....................................................................................................37 5:天计数模块........................................................................................................40 6:月计数模块........................................................................................................42 7:年计数模块(两个计数器 100 进制)............................................................44 8:星期计数模块....................................................................................................46 9:定时器模块........................................................................................................47 九、附录........................................................................................................................................... 49
4 一、 课程设计目的 掌握利用可编程逻辑器件和 EDA 设计工具进行电子系统设计的方法,内容包括: (1)VHDL 程序设计、输入——在 ise 平台上用 VHDL 描述系统的功能 (2)逻辑综合——将源程序编译后,为设计系统选择一个电路实现方案,按照 这个方案进行逻辑综合和优化,生成 1 个电路网表文件 (3)功能仿真——检查自己的设计是否达到和完成要求的逻辑功能 (4)设计实现——布局、布线及配置,最后生成可以写到芯片中的目标文件 (5)时序仿真——是适配到选定的芯片后进行的仿真,它模拟芯片的实际动作, 仿真时间模型严格将门级延时计算在内,可以分析出竞争与冒险,时序仿真验证 过的电路与实际电路基本上已致。 (6)器件编程——对器件编程下载 二、设计内容和要求 设计实现一个具有带预置数的数字钟,具有显示年月日时分秒的功能。用 6 个数码管显示时分秒,set 按钮产生第一个脉冲时,显示切换年月日,第 2 个脉 冲到来时可预置年份,第 3 个脉冲到来时可预置月份,依次第 4、5、6、7 个脉 冲到来时分别可预置日期、时、分、秒,第 8 个脉冲到来后预置结束,正常工 作,显示的是时分秒。Up 为高电平时,upclk 有脉冲到达时,预置位加 1.否则 减 1,还可以在此基础上增加其它功能。 三、设计思路 本设计采用 top-down 模式设计。下面介绍一下其优点。
5 自顶而下(TOP TO DOWN)的层次化设计方法在现代 EDA 设计中有着明显的 优势,越来越受到设计者的欢迎。对于一个复杂的设计系统,运用层次化设计方 法,使设计课题进一步细化,分块设计,条理清晰。另外,在调试时可采用逆向 调试方式,即从模块调试向总体调试方向开展调试工作,使设计中出现的问题在 模块级就能发现,及时处理,这样就会使一个复杂的设计变得容易调试,缩短了 设计时间。 层次化设计方法:开始设计时,先设计出一个顶层总框图(一般称之为顶层 图),该框图是由若干个具有特定功能的源模块组成。下一步是对这些不同功能 的模块进行设计,产生这些模块的原理图文件或 VHDL 源文件。对于有些功能复 杂的模块,全部使用元件库中的元器件设计仍显复杂,因此还可以将该模块继续 化分为若干个功能子模块,这样就形成模块套模块的层次化设计方法。这种方法 也称之为自顶向下的系统设计方法。 下面是我最初设计时,设计的总体框图。 (图 3-1) 从图 3-1 中可以清晰的看出,系统由 8 个模块组成,其中主控模块负责各个模块 之间的调度、分析计算数字钟的状态、给出相应的控制信号。各个计数器功能相 似,都具有计数、输出 DCB 码、双向调节计数状态的功能。但是天计数器比较特 殊,后面会着重介绍。 主 控 模 块 分 计 数 器 时 计 数 器 天 计 数 器 月 计 数 器 秒 计 数 器 年 计 数 器 星 期 计 数 器 定 时 器
6 1、普通计数器(时、分、秒、月、年计数器)设计 (图 3-1-1) 此类计数器计数进制都固定不变因此设计相对来说比较简单。 当 set 端为 0 时表示不对计数器进行设置,让计数器使用 clk 作为计数时钟。 Set 为 1 时表示要对计数器进行设置,让计数器使用 up_down_clk 作为计数时钟。 Up_down=‘1’表示向上加计数,Up_down=‘0’表示向下减计数。 主要有以下几点要求。 1):计数功能; 2):DCB 码输出计数状态功能; 3):加减计数方式可调节; 4):计数时钟可变; 5):清零功能; 2、可变进制计数器(天计数器)设计 多了两个引脚 (图 3-1-2) 这种计数器的设计要求比较高,因为不同“月”中“天”的数量是不同的。 比如说“大月”就有 31“天”, “小月”有 30“天”,平年“二月”有 28“天”,
7 而闰年“二月”有 29“天”。所以天计数器应该具备进制可变的性能,进制只有 四种。现在就出现两种方法来确定计数器进制,(1):将年、月的 BCD 输出引到 天计数器端,可让天计数器自己判断自己应该处于何种进制;(2):将计算的任 务交给主控制模块,天计数器模块只负责接收主控模块发回来的信息来决定计数 器进制。第一种方法不仅增加了此模块设计的复杂性、增加了输入引脚数而且还 增加了模块之间的耦合度,这是在层次化设计时的大忌,而第二种方法只需在此 模块上添加两个引脚然后在模块内部只需根据这两个引脚来选择进制数。很显然 第二种方法要优越于第一种方法。因此选择第二种方法。 此模块主要有以下几点要求。 1):计数功能; 2):DCB 码输出计数状态功能; 3):加减计数方式可调节; 4):计数时钟可变; 5):清零功能; 6):可变计数进制功能; 3:主控模块设计 给各 模块 的调 节信号 (图 3-1-3) 主控模块主要负责整个系统的调度,它是整个系统的核心。主控模块接收外
8 界的输入并把相应的输入并分析响应的输入把控制信息送给各个模块。由于题目 要求以用 set 的脉冲个数来确定用户的调节状态,所以此部分应该用状态机来设 计完成。状态机设计程序结构清晰易于编写和阅读。根据状态的不同来给出不同 控制的信号。 对于判断平年和闰年我采用了函数调用的方法,在 WORK 库里写了一个函 数 function judge_year 这个函数的输入为年信号的位矢量,返回值为 boolean 型, true 代表为闰年,false 为平年。具体的判断方法如下:先判断年的十位和个位是 不是 0 如果是 0 则为整百的年,那么把千位和百位组成一个两位数 a,判断 a 能 不能被 4 整除,但是除法在 VHDL 中不可综合,所以我想出了一种方法,将 a 转化成 std_logic_vecotr 型,然后判断它的低两位是不是 0,若果是 0 则能被 4 整 除则本年是闰年;若果不是整百年则按照上面方法转化成 std_logic_vecotr 型, 同样判断是否能被 4 整除,如能被 4 整除则为闰年。 具体函数如下: function judge_year(signal :std_logic_vector(3 downto 0); year_thousand year_hundred signal year_ten signal signal year_one )return boolean is :std_logic_vector(3 downto 0); :std_logic_vector(3 downto 0); :std_logic_vector(3 downto 0) downto 0); downto 0); variable i_thousand,i_hundred,i_ten,i_one:integer range 0 to 9; variable year variable logic_year :integer range 0 to 9999; :std_logic_vector(10 variable year1 variable logic_year1 :integer range 0 to 99; :std_logic_vector(6 begin i_thousand:=conv_integer(year_thousand); i_hundred:=conv_integer(year_hundred); i_ten:=conv_integer(year_ten); i_one:=conv_integer(year_one); year:=i_thousand*1000+i_hundred*100+i_ten*10+i_one; year1:=i_thousand*10+i_hundred; logic_year:=conv_std_logic_vector(year,11); logic_year1:=conv_std_logic_vector(year1,7); -----judge if the year is a number that can be divided by 100 if(i_ten=0 and i_one=0)then if (logic_year1(0)='0'and logic_year1(1)='0')then return true; else return false; end if; return true; else return false; end if; end judge_year; elsif(logic_year(0)='0' and logic_year(1)='0')then 对于“大小月”的判断同样是在 WORK 库里写了个函数 judge_month 具体函 数在代码部分有详细注释。
分享到:
收藏