已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用vhdl语言实现数字种的设计 用vhdl语言实现数字钟的设计 2011年12月21日一、eda课程设计的目的与任务(一)、掌握利用可编程逻辑器件和eda设计工具进行电子系统设计的方法,内容包括:(1)vhdl程序设计、输入在ise平台上用vhdl描述系统的功能(2)逻辑综合将源程序编译后,为设计系统选择一个电路实现方案,按照这个方案进行逻辑综合和优化,生成1个电路网表文件(3)功能仿真检查自己的设计是否达到和完成要求的逻辑功能(4)设计实现布局、布线及配置,最后生成可以写到芯片中的目标文件(5)时序仿真是适配到选定的芯片后进行的仿真,它模拟芯片的实际动作,仿真时间模型严格将门级延时计算在内,可以分析出竞争与冒险,时序仿真验证过的电路与实际电路基本上已致。(6)器件编程对器件编程下载(7)测试二、eda课程设计的要求设计实现一个具有带预置数的数字钟,具有显示年月日时分秒的功能。用6个数码管显示时分秒,set按钮产生第一个脉冲时,显示切换年月日,第2个脉冲到来时可预置年份,第3个脉冲到来时可预置月份,依次第4、5、6、7个脉冲到来时分别可预置日期、时、分、秒,第 8个脉冲到来后预置结束,正常工作,显示的是时分秒。up为高电平时,upclk有脉冲到达时,预置位加1.否则减1,还可以在此基础上增加其它功能。用vhdl语言实现数字钟的设计摘要随着it行业的不断发展eda技术在很多行业得到了广泛的应用,在很多大学也开设了相应的课程,但只有理论知识不足以应对实际项目的开发,不足以胜任更加庞大的系统开发。本次课程设计旨在提高学生的实际动手能力和解决问题的能力。本文在该项目的实际设计中,就整体框架的设计,软件的开发,仿真,下载,调试等过程进行了一一验证。在数字钟的设计中应用了元件例化的整体思路实现,实现过程可分为分频,时分秒计数,时分秒置数,年月日计数,年月日置数共五个部分,其中在年月日的计数中应用状态机的计数方法实现设计。关键字:vhdl,元件例化,数字钟目录一、 eda课程设计的目的与任务二、 eda课程设计的要求三、 摘要第一章 系统方案11.1设计思路第二章 各个模块实现2.1分频模块2.2时分秒计数模块2.3时分秒置数模块2.4年月日计数模块2.5年月日置数模块2.6元件例化整体模块第三章 整体电路图3.1 quartus生成的整体电路图第四章 课程设计总结第五章 实验代码5.1实验代码 第一章 系统方案1.1设计思路vhdl数字钟的设计可采用多种设计方法,各个设计方法各有其优缺点。一, 采用一个结构体,多个进程的设计方法。其优点是速度快,但是一个结构体,各个进程的逻辑关系比较复杂,而且代码的可读性,可移植性较差。二, 状态机的设计方法,状态机结构简单,当各个状态之间的转换不易处理。三, 元件例化的设计方法,元件例化使各个模块之间分得更加有层次,易于读,缺点有可能使各个模块之间存在逻辑关系的冲突。本此设计,主要采用了元件例化的设计方法,在年月日计数模块采用了状态机的设计方法实现。第二章 各个模块的实现2.1分频模块直接将实验箱的频率用于数字钟的计数,可能会导致错误,实验箱直接给出的1hz频率可能不够稳定,故需要将1khz的频率输出进行1000分频。本模块直接采用单进程实现设计,本模块还包括一个置数脉冲的设置upd0,upd0按下一次lock加1,lock为000时显示时分秒,为001时显示年月日,为010对年进行置数,为011对月进行置数,为100对日进行置数,为101对时进行置数,为110对分进行置数,为111对秒进行置数,lock,也连接着后面四个计数,置数,模块的lock,以进行模块显示的选择。f10设置的周期为5ns,在2.5us处实现1000分频,1000分频后的f_clk连接时分秒,年月日计数模块的计数时钟,置数时钟则直接输入,连接两个置数模块。以下程序是实体部分entity lo_cov is port( upd0 : in std_logic; /置数脉冲输入 f10 : in std_logic; /1khz时钟输入 f_clk : out std_logic; /分频时钟输出 lock : out std_logic_vector(2 downto 0) /输入脉冲的选择 );end lo_cov;以下是分频模块的仿真图像,2.2 时分秒计数模块时分秒可选用多进程或者单进程的方法,多进程速度快,但是结构复杂。故本设计选用单进程方法。当秒计数到59时向分进位,分计到59且秒为59时向时进位,当计到23时59分59秒时向天进位,同时对时分秒进行清零。程序中主要使用了if elsif end if;的语句。最后验证表明此设计方法可实现题目要求的功能。以下是程序的实体部分entity s_m_hour is port( clk0,clk1 : in std_logic; -clk0工作时钟,clk1预置脉冲 lock : in std_logic_vector(2 downto 0); /置数显示切换 s0,s1 : out std_logic_vector(3 downto 0); /秒的地位高位 m0,m1 : out std_logic_vector(3 downto 0); /分的低位高位 h0,h1 : out std_logic_vector(3 downto 0); /时的低位高位 co : out std_logic;-hour产生进位 en : in std_logic /使能端 ); end s_m_hour;以下是仿真的电路图2.3时分秒置数模块时分秒置数模块不同于计数模块,置数模块我选用了另一个置数时钟,也可以说是置数脉冲。时分秒置数有使能端口en(高有效),置数使能端口tn,通过tn(tn=0时置数是减1模式,tn=1时是加1模式)判定是加1还是减1。当输入长度为三位的lock为101时对时进行置数,当lock为110时对分进行置数,当lock为111时对秒进行置数。时分秒的置数实现方式可有多种方法,可用状态机,多进程和单进程等方法实现,相比于别的设计方法,单进程的设计方法易于实现,没有复杂的对应关系,而且本功能的实现不许过于复杂的逻辑关系。本设计使用了单进程 内部使用嵌套的if elsif end if 语句实现预期的功能。以下是该功能的输入输出端口:entity s_m_yuz1 isport( clk0,clk1 : in std_logic; -clk0工作时钟,clk1预置脉冲 lock : in std_logic_vector(2 downto 0); -置数选择 s0,s1 : out std_logic_vector(3 downto 0);-秒输入端口 m0,m1 : out std_logic_vector(3 downto 0);-分输入端口 h0,h1 : out std_logic_vector(3 downto 0);-时输入端口 tn : in std_logic; -tn=1预置数加1,tn=0预置数减1 en : in std_logic -使能端口,高有效 );end s_m_yuz1;以下分别是时分秒的置数仿真波形图对时进行置数的功能仿真波形图对分的置数的功能仿真波形图对秒的置数的功能仿真波形图2.4年月日计数模块年月日的计数模块与时分秒的计数模块稍有不同,年月日需要考虑闰年2月份的情况,闰年到来时2月份为29天,其他情况2月份为28天。本设计同样可采用多种设计方法,由于出现不同月份的天数有可能天数不一样的情况,故本设计采用状态机的设计方法实现,每个月份作为一个状态,采用了两个进程的设计方法,一个为组合逻辑设计,另一个为时序控制进程,已达到最优化,同时设计了进位脉冲,当计满12个月时向年产生进位,年数加1。以下是实体部分entity daymony1 is port( clk0,clk1 : in std_logic; da0,da1 : out std_logic_vector(3 downto 0); mo0,mo1 : out std_logic_vector(3 downto 0); ya0,ya1 : out std_logic_vector(3 downto 0); co : out std_logic; -月向年产生进位的进位端 en : in std_logic; lock : in std_logic_vector(2 downto 0) ); end daymony1;以下是年月日计数功能仿真波形2.5年月日置数模块 年月日置数模块不同于时分秒的置数模块,在年月日的置数模块中我们需要考虑闰年相对应的闰月的情况,就会出现不同的年份对应的2月的天数的不同,其他的可将1,3,5,7,8,10,12归成一类,这几个月每个月的天数是31天,而4,6,9,11这几个月又归为一类,每个月有30天,二月分为特殊的一类,视是否为闰年而定天数,闰年有29天,非闰年为28天。en使能端,高有效。tn为置数模式的选择控制端,tn=1时置数处于加1模式,tn=0置数处于减1模式,lock为置数对象的选择。lock=010时对年进行置数,lock=011时对月进行置数,lock=100时对天进行置数。本设计对于本模块使用了单进程,内部使用了if elsif end if; 语句实现预期的功能。以下是该置数模块的实体部分:entity yuzhis isport( clk1,tn : in std_logic; -clk1为置数时钟,tn=1置数处于加模式 en : in std_logic; -使能端口 lock : in std_logic_vector(2 downto 0); -置数的对象选择 da0,da1 : out std_logic_vector(3 downto 0); mo0,mo1 : out std_logic_vector(3 downto 0); ya0,ya1 : out std_logic_vector(3 downto 0) ); end yuzhis;对年进行置数的功能仿真波形对月进行置数功能的仿真波形对天进行置数功能的仿真波形2.6元件例化模块 该模块将分立的五个模块连接起来,运用端口映射的方式,将各个模块通过相应的信号线相连,这也是一个容易出现问题的地方,很容易造成连接失败。f10为实验箱频率输入,tn直接与各个两个置数端口的tn相连,upd0为输入脉冲,直接与分频模块的upd0相连,同时分频模块的lock对其进行计数。以下是实体部分:entity digital_clock is port(clk1 : in std_logic;upd0 : in std_logic;f10 : in std_logic;tn : in std_logic;en : in std_logic;h_year : out std_logic_vector(3 downto 0); -数码管的显示h_year1 : out std_logic_vector(3 downto 0);m_mon : out std_logic_vector(3 downto 0);m_mon1 : out std_logic_vector(3 downto 0);s_day : out std_logic_vector(3 downto 0);s_day1 : out std_logic_vector(3 downto 0);end digital_clock;第三章 整体电路图此部分为此设计的整个电路部分,用quartus连接完成。第四章 课程设计总结本次设计为运用eda技术,用vhdl设计数字钟。数字钟在我们的生活中并不少见,这一次我真正的深入的用所学的知识去联系生活中的事情,将理论与实际结合,在学习的同时也激发了我们的学习兴趣。在这三天的课程设计中,并不枯燥,在调试的过程发现了不少问题,比如逻辑关系的不明确很容易造成设计的失败,又如在元件例化的过程中出现逻辑关系上的冲突,逻辑关系上的冲突看似简单,但真正的找出问题在什么地方并不容易。虽然问题最终没有得以解决,但在这个过程中学会了找问题的方法,解决问题的方法。在设计的过程中更应该细心,每一步的不注意,就有可能导致整个系统的连接失败。这些都是将来我们走上社会,进入企业所会面对的的问题。在学校我们学到的东西更多的是偏向理论基础的知识,每一次实践的机会,都会对我们的的学习上有进一步的提高,珍惜每一次课程设计的机会。本次设计虽然没有获得很好的成绩,但是在其中学到知识才是最重要的,通过本次课程设计大大提高了对于eda技术的理解,对以后进一步的学习有很大的帮助。第五章 实验代码以下分别是时分秒计数,时分秒置数,年月日计数,年月日置数,分频及例化共六个模块的实验代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;- uncomment the following lines to use the declarations that are- provided for instantiating xilinx primitive components.-library unisim;-use unisim.vcomponents.all;entity s_m_hour is port( clk0,clk1 : in std_logic; -clk0工作时钟,clk1预置脉冲 lock : in std_logic_vector(2 downto 0); -工作模式选择 s0,s1 : out std_logic_vector(3 downto 0); m0,m1 : out std_logic_vector(3 downto 0); h0,h1 : out std_logic_vector(3 downto 0); co : out std_logic;-_vector(2 downto 0); -hour产生进位 en : in std_logic );end s_m_hour;architecture behavioral of s_m_hour issignal ts0 : std_logic_vector(3 downto 0):=0100;signal ts1 : std_logic_vector(3 downto 0):=0101;signal tm0 : std_logic_vector(3 downto 0):=1001;signal tm1 : std_logic_vector(3 downto 0):=0101;signal th0 : std_logic_vector(3 downto 0):=0011;signal th1 : std_logic_vector(3 downto 0):=0010;signal clk : std_logic;signal cc : std_logic;begins0=ts0;s1=ts1;m0=tm0;m1=tm1;h0=th0;h1=th1;co=cc;process(clk,en) begin if en=1then if lock=000or lock=001then clk=clk0; else clk=clk1; end if; end if;end process; process(clk0,lock,en) begin if en=1then if lock=000then if clk0event and clk0=1then if ts1=0101 and ts0=1001then ts1=0000;ts0=0000;- end if; elsif ts0=1001then ts0=0000;ts1=ts1+1; else ts0=ts0+1; -如果ts0不等于9则ts1保持不变 end if; if ts0=1001and ts1=0101then if tm1=0101and tm0=1001 then tm1=0000;tm0=0000; - end if; elsif tm0=1001then tm0=0000;tm1=tm1+1; else tm0=tm0+1; end if; end if; if ts0=1001and ts1=0101and tm0=1001and tm1=0101 then if th1=0010and th0=0011then th1=0000;th0=0000; cc=1; elsif th0=1001then th0=0000;th1=th1+1; else th0=th0+1;cc=0; end if; end if; end if; end if; end if; end process; end behavioral;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;- uncomment the following lines to use the declarations that are- provided for instantiating xilinx primitive components.-library unisim;-use unisim.vcomponents.all;entity s_m_yuz1 isport( clk0,clk1 : in std_logic; -clk0工作时钟,clk1预置脉冲 lock : in std_logic_vector(2 downto 0); s0,s1 : out std_logic_vector(3 downto 0); m0,m1 : out std_logic_vector(3 downto 0); h0,h1 : out std_logic_vector(3 downto 0); tn : in std_logic; -tn=1预置数加1,tn=0预置数减1 en : in std_logic );end s_m_yuz1;architecture behavioral of s_m_yuz1 issignal ts10 : std_logic_vector(3 downto 0):=0100;signal ts11 : std_logic_vector(3 downto 0):=0101;signal tm10 : std_logic_vector(3 downto 0):=1001;signal tm11 : std_logic_vector(3 downto 0):=0101;signal th10 : std_logic_vector(3 downto 0):=0011;signal th11 : std_logic_vector(3 downto 0):=0010;begins0=ts10;s1=ts11;m0=tm10;m1=tm11;h0=th10;h1=th11;process(clk1,lock,tn) begin if en=1 then if clk1event and clk1=1then -选择置数时钟为clk1 if lock=101and tn=0then -对时进行置数(减1) if th10=0000and th11=0000 then th10=0011;th11=0010; elsif th10=0000 and (th11=0010or th11=0001)then th10=1001;th11=th11-1; end if; elsif lock=101 and tn=1then -对时置数加1 if th10=1001then th10=0000;th11=th11+1; else th10=th10+1;th11=th11; end if; if th11=0010and th10=0011then th11=0000;th10=0000; end if; elsif lock=110and tn=0then-对分进行置数减1 if tm10=0000then tm10=1001;tm11=tm11-1; else tm10=tm10-1;tm11=tm11; end if; if tm10=0000and tm11=0000then tm11=0101; end if; elsif lock=110 and tn=1then-对分置数加1 if tm10=1001then tm10=0000;tm11=tm11+1; else tm10=tm10+1; tm11=tm11; end if; if tm11=0101and tm10=1001 then tm11=0000;end if; elsif lock=111and tn=0then -对秒进行置数减1 if ts10=0000then ts10=1001;ts11=ts11-1; else ts10=ts10-1;ts11=ts11; end if; if ts10=0000and ts11=0000then ts11=0101; end if; elsif lock=111and tn=1then-对秒进行置数加1 if ts10=1001then ts10=0000;ts11=ts11+1; else ts10=ts10+1; ts11=ts11; end if; if ts11=0101and ts10=1001 then ts11=0000;ts10=0000; end if; end if; end if; end if; end process;end behavioral;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;- uncomment the following lines to use the declarations that are- provided for instantiating xilinx primitive components.-library unisim;-use unisim.vcomponents.all;entity daymony1 is port( clk0,clk1 : in std_logic; da0,da1 : out std_logic_vector(3 downto 0); mo0,mo1 : out std_logic_vector(3 downto 0); ya0,ya1 : out std_logic_vector(3 downto 0); co : out std_logic; en : in std_logic; lock : in std_logic_vector(2 downto 0) ); end daymony1;architecture behavioral of daymony1 is type state is(jou,fer,mar,apr,may,jun,jul,aug,set,oct,nob,dec);signal mon: state;signal dat0 : std_logic_vector(3 downto 0):=0110;signal dat1 : std_logic_vector(3 downto 0):=0001;signal mon0 : std_logic_vector(3 downto 0):=0010;signal mon1 : std_logic_vector(3 downto 0):=0001;signal yea0 : std_logic_vector(3 downto 0):=0001;signal yea1 : std_logic_vector(3 downto 0):=0001;signal o : std_logic_vector(11 downto 0);signal clk : std_logic;beginda0=dat0;da1=dat1;mo0=mon0;mo1=mon1;ya0=yea0;ya1=yea1;co=o(11);process(clk0,clk1,en,lock) begin if en=1then if lock=000or lock=001then clk=clk0; -选择正
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 郴州文物百颂作者:湖南省郴州市五岭大道陈友训
- 2024届安徽省马鞍山市高三1月月考(期末)数学试题
- 搽剂产业链招商引资的调研报告
- 手提包式公文包产业深度调研及未来发展现状趋势
- 可生物降解的盘子产业运行及前景预测报告
- 食品安全与预制菜管理方案
- 公文箱产业运行及前景预测报告
- 高层建筑配电室消防方案
- 轨道交通工程验收实施方案
- 网络安全及保密培训
- 精益工厂布局及精益物流规划课件
- 《新时代劳动教育》-02新时代劳动价值观课件
- 2023年口腔医学期末复习-牙周病学(口腔医学)考试历年真题荟萃带答案
- 多元智能测试题及多元智能测试量表
- 【典型案例】长江流域浙江的历史发展:人民群众是社会物质财富的创造者
- 完整版平安基础性向测试智商测试题及问题详解
- 《疾病与人类健康》
- 车辆技术档案范本(一车一档)
- 人工智能智慧树知到答案章节测试2023年复旦大学
- 初中物理知识点手册大全(挖空+答案)
- JJG 852-2019中子周围剂量当量(率)仪
评论
0/150
提交评论