基于VHDL语言实现数字电子钟的设计
- 格式:doc
- 大小:179.00 KB
- 文档页数:11
基于VHDL的数字电路综合设计一、引言数字电路设计是计算机科学中的一个重要领域,也是电子工程中的核心内容之一。
在数字电路设计中,经常会用到VHDL语言进行功能仿真和硬件实现,本文将介绍基于VHDL的数字电路综合设计。
二、VHDL语言简介VHDL是VHSIC硬件描述语言(Very High Speed Integrated Circuit Hardware Description Language)的缩写,是一种描述数字系统的硬件设计语言。
VHDL支持复杂的设计和测试,并具有高度的可重用性和可扩展性,因此被广泛应用于数字电路设计。
VHDL语言包含结构体、函数、过程、运算符等元素,允许用户在设计过程中进行各种模拟和优化,支持从最基本的逻辑门直到复杂的微处理器设计。
同时,VHDL可以在不同的电脑平台上使用,并且可以与其他软件工具进行无缝集成。
三、数字电路综合设计流程数字电路综合设计是指将高级语言的描述转换为符合硬件描述语言规范的电路图。
数字电路综合设计流程如下:1.设计规范:对电路进行功能分析和描述,包括输入、输出、功能、时序等方面。
2.编写VHDL代码:根据设计规范编写VHDL代码,包括模块实例化、输入输出端口定义、内部信号定义、电路描述等。
3.逻辑综合:将VHDL代码进行逻辑综合,将代码转换为门级电路,通常采用的软件工具是DC综合器。
4.布局布线:将逻辑综合得到的门级电路进行布局布线,得到网表电路。
5.时序分析:对网表电路进行时序分析,保证电路能够在设定的时间内完成给定的操作。
6.物理综合:根据时序分析结果对网表电路进行物理综合,将电路布局在芯片上,并定义技术参数。
7.后仿真:对综合后的电路进行后仿真,验证电路设计是否符合原始设计要求。
四、综合设计工具的选择数字电路综合设计需要使用多种工具,主要涉及到硬件描述语言编写工具、逻辑综合工具、布局布线工具、笔画校验工具和后仿真工具等。
常见的综合设计工具有:1.VHDL编译器和仿真器:VHDL编译器和仿真器是支持VHDL语言的电路设计工具,可以实现VHDL语言的编写和电路仿真功能。
电子科技大学UNIVERSITY OF ELECTRONIC SCIENCE AND TECHNOLOGY OF CHINA数字逻辑设计实验报告实验题目:电子秒表学生姓名:指导老师:一、实验内容利用FPGA设计一个电子秒表,计时范围00.00 ~ 99.00秒,最多连续记录3个成绩,由两键控制。
二、实验要求1、实现计时功能:域值范围为00.00 ~ 99.00秒,分辨率0.01秒,在数码管上显示。
2、两键控制与三次记录:1键实现“开始”、“记录”等功能,2键实现“显示”、“重置”等功能。
系统上电复位后,按下1键“开始”后,开始计时,记录的时间一直显示在数码管上;按下1键“记录第一次”,次按1键“记录第二次”,再按1键“记录第三次”,分别记录三次时间。
其后按下2键“显示第一次”,次按2键“显示第二次”,再按2键“显示第三次”,数码管上分别显示此前三次记录的时间;显示完成后,按2键“重置”,所有数据清零,此时再按1键“开始”重复上述计时功能。
三、设计思路1、整体设计思路先对按键进行去抖操作,以正确的得到按键信息。
同时将按键信息对应到状态机中,状态机中的状态有:理想状态、开始状态、3次记录、3次显示、以及其之间的7次等待状态。
因为需要用数码管显示,故显示的过程中需要对数码管进行片选和段选,因此要用到4输入的多路选择器。
在去抖、计时、显示的过程中,都需要用到分频,从而得到理想频率的时钟信号。
2、分频设计该实验中有3个地方需要用到分频操作,即去抖分频(需得到200HZ时钟)、计时分频(需得到100HZ时钟)和显示分频(需得到25kHZ时钟)。
分频的具体实现很简单,需首先算出系统时钟(50MHZ)和所需始终的频率比T,并定义一个计数变量count,当系统时钟的上升沿每来到一次,count就加1,当count=T时就将其置回1。
这样只要令count=1~T/2时clk=‘0’,count=T/2+1~T时clk=‘1’即可。
基于VHDL数字电子钟的设计与实现摘要:本课程设计完成了数字电子钟的设计,数字电子钟是一种用数字显示秒、分、时的计时装置,由于数字集成电路技术的发展和采用了先进的石英技术,它使数字钟具有走时准确、性能稳定、携带方便等优点。
数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活带来极大的方便。
在这里我们将已学过的比较零散的数字电路的知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路的能力。
关键词:电子钟;门电路及单次按键;琴键开关目录第一章引言----------------------------------------------------------------11.1 课题的背景、目的------------------------------------------11.2 课程设计的内容------------------------------------------1 第二章EDA与VHDL简介--------------------------------------------------22.1 EDA的介绍---------------------------------------------22.2 VHDL的介绍--------------------------------------------32.2.1 VHDL的用途与优点-----------------------------------------------------------------32.2.2 VHDL的主要特点----------------------------------------------------------------------2.2.3 用VHDL语言开发的流程------------------------------------------------------------ 第三章数字电子钟的设计方案------------------------------------------63.1秒脉冲发生器--------------------------------------------73.2可调时钟模块--------------------------------------------83.3校正电路------------------------------------------------83.4闹铃功能------------------------------------------------103.5日历系统------------------------------------------------11 第四章结束语---------------------------------------------------------------134.1致谢----------------------------------------------------144.2参考文献------------------------------------------------151引言随着科学技术的不断发展,人们对时间计量的精度要求越来越高。
关于VHDL中的时钟是不是可综合的问题1。
VHDL综合器中把通过边沿触发其他信号的东西统统定义为时钟信号。
比如说,一个信号B的变化需要A的下降沿来触发,那么在相应的进程中就把A看作是时钟信号,即使A可能只变化了这一次。
2。
明确了1,就来看2。
任意一个信号或者变量只能有一个时钟驱动。
多时钟驱动的信号或变量会在综合时报错。
比如说,如下语句在一个进程中:if (clk'event and clk = '1') thenB <= '1';end if;if (A'event and A = '0') thenB < = '0';end if;这里面的B就叫做被时钟clk和时钟A同时驱动了,虽然我们平时不习惯把A 也叫做时钟,但是它在综合时似确实被这样认为的。
因此,这就要求我们在写程序之前,要把所有的信号都拼尽全力的用不多于一个时钟来驱动,当然不用时钟也是可以的。
同时也引申出一点,就是一个进程的敏感表表示的是进程间的驱动关系,这个需要极其认真地考虑,要弄清楚进程间究竟是用什么通信的,尤其牵扯到时钟的时候,到搞懂究竟是哪个时钟触发了信号。
切不可随意添加信号,在仿真时可能问题不大,但是综合的时候可能会有大问题。
这个从物理上也好理解,一个又边沿触发的信号物理上就是用一个D触发器实现的,无论这个触发信号是变化很长时间还是只变化一次,只要是牵扯到检测边沿,就需要一个D触发器。
而一个信号只能对应一个D触发器,一个D触发器只能由一个时钟驱动,所以以上语句是无法综合的。
也就是说,两个时钟同时触发的D触发器现阶段无法实现。
为什么无法实现呢?留个问题。
3。
使用异步电路只有如下一种书写方式可以综合:process(clk,reset)beginif (reset = '1') thenB <= '1';elsif (clk'event and clk = '0') thenB < = '0';end if;end process;下面的语句会在综合中报错:process(clk,reset)beginif (reset = '1') thenB <= '1';end if;if (clk'event and clk = '0') thenB < = '0';end if;end process;报的错误是同步时钟前面存在异步信号。
课程设计报告设计题目:用VHDL语言实现数字钟的设计班级:学号:姓名:指导老师:设计时间:摘要本设计是基于VHDL语言的数字钟,硬件平台是Xilinx的Virtex2系列FPGA 开发板。
该数字钟具备预置年月日时分秒的功能,通过按键还可以改变数字钟显示的内容和进入不同的设置状态,并通过加减按键调整系统时间。
在整个VHDl数字电路系统中,采用层次化设计方法,自顶向下进行设计。
设计中根据系统的功能要求合理划分出层次,进行分级设计和仿真验证,将较为复杂的数字系统逻辑简化为基本的模型从而降低实现的难度。
工程中底层实体实现了年月日、时分秒的双向计数器功能,另外还单独设计了系统的时钟模块,用来生成周期为125Hz的按键扫描时钟和周期为1Hz单位脉冲时钟。
为了消除按键的抖动,为此设计了按键消抖模块,采用了状态机来对按键进行消抖。
为了实现根据年份和月份对当前月的天数的判断逻辑,采用了函数对该逻辑进行分析,给出正确的判断结果。
为了提高利用率,在工程中建立了一个包集文件,对底层实体进行了统一封装,方便顶层的调用。
底层的所有实体系统的顶层主要完成了底层的元件例化,主控状态机对系统的状态转换进行控制,按键响应和时钟重新分配电路则完成了整个系统的控制逻辑。
关键词:层次化设计,元件例化,函数,状态机目录摘要 (2)一、课程设计目的 (4)二、课程设计内容及其要求 (4)三、VHDL程序设计 (5)1.设计方案论证 (5)2.设计思路与方法 (6)3.VHDL源代码及其仿真结果 (7)1、六进制可逆计数器 (7)2、十进制可逆计数器, (9)3、十二进制可逆计数器, (11)4、二十四进制可逆计数器 (13)5、天数计数器 (16)6、判断闰年和月份 (18)7、时钟分频模块 (22)8、按键消抖模块 (24)9、程序包 (27)10、顶层实体(主控状态机) (29)四、编程下载 (38)五、课程设计总结 (38)六、参考文献 (38)一、课程设计目的诞生于1983年的VHDL语言,在1987年被美国国防部和IEEE指定为标准硬件描述语言。
VHDL语言实现数字电路设计数字电路是由逻辑门、寄存器以及其他数字组件组成的电子系统,用于处理和传输数字信号。
VHDL(Very High-Speed Integrated Circuit Hardware Description Language)是一种硬件描述语言,用于描述数字电路和系统。
通过使用VHDL语言,我们可以实现数字电路的设计,从而满足各种需求。
VHDL语言提供了一种结构化的设计方法,允许设计者描述硬件电路的结构、功能以及时序行为。
以下是一些常见的数字电路设计任务,以及如何使用VHDL语言来实现它们。
1. 门电路设计门电路是最简单的数字电路之一,由逻辑门组成。
使用VHDL语言,我们可以通过描述逻辑门的输入和输出来实现门电路的设计。
例如,我们可以使用VHDL语言描述一个与门:```vhdlentity AND_gate isport (A, B : in bit;Y : out bit);end entity AND_gate;architecture dataflow of AND_gate isbeginY <= A and B;end architecture dataflow;```在这个例子中,我们定义了一个输入端口A和B,以及一个输出端口Y。
在architecture部分,我们使用VHDL语言描述了Y的逻辑值为A和B的逻辑与。
2. 时序逻辑电路设计时序逻辑电路是根据时钟信号进行操作和状态转换的电路。
使用VHDL语言,我们可以描述时序逻辑电路的行为和状态变化。
例如,我们可以使用VHDL语言描述一个触发器:```vhdlentity D_flip_flop isport (D, CLK : in bit;Q : out bit);end entity D_flip_flop;architecture behavior of D_flip_flop issignal Q_temp : bit;beginprocess(CLK)beginif CLK'event and CLK = '1' thenQ_temp <= D;end if;end process;Q <= Q_temp;end architecture behavior;```在这个例子中,我们定义了一个输入端口D和CLK,以及一个输出端口Q。
一、设计题目:基于VHDL语言的电子秒表设计(可调时,有闹钟、定时功能)二、设计目的:⑴掌握较复杂的逻辑设计和调试⑵学习用原理图+VHDL语言设计逻辑电路⑶学习数字电路模块层次设计⑷掌握QuartusII软件及Modelsim软件的使用方法三、设计内容:(一)设计要求1、具有以二十四小时计时、显示、整点报时、时间设置和闹钟的功能。
2、设计精度要求为1S。
(二).系统功能描述1 . 系统输入:系统状态及校时、定时转换的控制信号为k、set、ds;时钟信号clk,采用实验箱的50MHz;系统复位信号为reset。
输入信号均由按键产生。
系统输出:8位LED七段数码管显示输出,蜂鸣器声音信号输出。
多功能数字钟系统功能的具体描述如下:2. 计时:set=1,ds=1工作状态下,每日按24h计时制计时并显示,蜂鸣器无声,逢整点报时。
3. 校时:在set=0,ds=0状态下,按下“k键”,进入“小时”校准状态,之后按下“k键”则进入“分”校准状态,继续按下“k键”则进入“秒校准”状态,之后如此循环。
1)“小时”校准状态:在“小时”校准状态下,显示“小时”数码管以1Hz的频率递增计数。
2)“分”校准状态:在“分”校准状态下,显示“分”的数码管以1Hz的频率递增计数。
3)“秒”复零状态:在“秒复零”状态下,显示“分”的数码管以1Hz的频率递增计数。
4. 整点报时:蜂鸣器在“59”分钟的第50—59,以1秒为间隔分别发出1000Hz,500Hz的声音。
5. 显示:采用扫描显示方式驱动8个LED数码管显示小时、分、秒。
闹钟:闹钟定时时间到,蜂鸣器发出交替周期为1s的1000Hz、500Hz的声音,持续时间为一分钟;6. 闹钟定时设置:在set=0,ds=1状态下,按下“k”,进入闹钟的“时”设置状态,之后按下“k键”进入闹钟的“分”设置状态,继续按下“k 键”则进入“秒”设置状态, 之后如此循环。
1)闹钟“小时”设置状态:在闹钟“小时”设置状态下,显示“小时”的数码管以1Hz 的频率递增计数。
电子科技大学成都学院学院指导教师模值12计数器,分频器设计二、实验目的1、了解二进制计数器的工作原理。
2、时钟在编程过程中的作用。
3、学习数控分频器的设计、分析和测试方法。
4、了解和掌握分频电路实现的方法。
5、掌握EDA技术的层次化设计方法。
三、实验原理(1)二进制计数器中应用最多、功能最全的计数器之一,含异步清零和同步使能的加法计数器的具体工作过程如下:在时钟上升沿的情况下,检测使能端是否允许计数,如果允许计数(定义使能端高电平有效)则开始计数,否则一直检测使能端信号。
在计数过程中再检测复位信号是否有效(低电平有效),当复位信号起作用时,使计数值清零,继续进行检测和计数。
其工作时序如下图所示:(2)数控分频器的功能就是当输入端给定不同的输入数据时,将对输入的时钟信号有不同的分频比,数控分频器就是用计数值可并行预置的加法计数器来设计完成的,方法是将计数溢出位与预置数加载输入信号相接得到。
(1)“模值12计数器的设计”的实验要求完成的任务是在时钟信号的作用下,通过使能端和复位信号来完成加法计数器的计数。
实验中时钟信号使用数字时钟源模块的1HZ信号,用一位拨动开关K1表示使能端信号,用复位开关S1表示复位信号,用LED模块的LED1~LED4来表示计数的二进制结果。
实验L ED 亮表示对应的位为‘1’,LED灭表示对应的位为‘0’。
通过输入不同的值模拟计数器的工作时序,观察计数的结果。
实验箱中的拨动开关、与FPGA 的接口电路,LED 灯与FPGA 的接口电路以及拨动开关、LED 与F PGA 的管脚连接在实验一中都做了详细说明,这里不在赘述。
数字时钟信号模块的电路原理如下图所示,其时钟输出与F PGA 的管脚连接表如下图所示:信号名称对应FPGA 管脚名说明DIGITAL-CLK C13 数字时钟信号送至FPGA 的C13按键开关模块的电路原理如下图所示:按键开关的输出与F PGA 的管脚连接表如下图所示:五、实验步骤(一)模值12计数器的设计1、建立工程文件1)运行QUARTUSII 软件。
北邮数字逻辑课程设计实验报告(可编辑)(文档可以直接使用,也可根据实际需要修改使用,可编辑推荐下载)实验四:电子钟显示一、实验目的(1)掌握较复杂的逻辑设计和调试。
(2)学习用原理图+VHDL语言设计逻辑电路。
(3)学习数字电路模块层次设计。
(4)掌握ispLEVER 软件的使用方法。
(5)掌握ISP 器件的使用。
二、实验所用器件和设备在系统可编程逻辑器件ISP1032 一片示波器一台万用表或逻辑笔一只TEC-5实验系统,或TDS-2B 数字电路实验系统一台三、实验内容数字显示电子钟1、任务要求(1)、时钟的“时”要求用两位显示;上、下午用发光管作为标志;(2)、时钟的“分”、“秒”要求各用两位显示;(3)、整个系统要有校时部分(可以手动,也可以自动),校时时不能产生进位;(4)*、系统要有闹钟部分,声音要响5秒(可以是一声一声的响,也可以连续响)。
VHDL源代码:LIBRARY ieee;----主体部分-ENTITY clock isport(clk,clr,put,clk1 : in std_logic; -- clr 为清零信号,put 为置数脉冲,clk1 为响铃控制时钟choice : in std_logic; --用来选择时钟状态的脉冲信号lighthour : out std_logic_vector(10 downto 0);lightmin : out std_logic_vector(7 downto 0);lightsec : out std_logic_vector(7 downto 0); --输出显示ring : out std_logic); --响铃信号end clock;--60进制计数器模块ARCHITECTURE func of clock iscomponent counter_60port(clock : in std_logic;clk_1s : in std_logic;putust : in std_logic;clr : in std_logic;load : in std_logic;s1 : out std_logic_vector(3 downto 0);s10 : out std_logic_vector(3 downto 0);co : out std_logic);end component;--24进制计数器模块component counter_24port(clock : in std_logic;clk_1s : in std_logic;putust : in std_logic;clr : in std_logic;load : in std_logic;s1 : out std_logic_vector(3 downto 0);s10 : out std_logic_vector(6 downto 0));end component;signal sec,a:std_logic; --- 2 分频产生1s信号signal l1,l2,l3:std_logic; ---判定对时间三部分修改signal c1,c2:std_logic; ---进位信号signal load:std_logic_vector(1 downto 0);signal temp:integer range 0 to 2499;signal temp1:integer range 0 to 95; --计数信号signal sec_temp:std_logic_vector(7 downto 0);--总进程beginu1 : counter_60 port map (sec,sec,put,clr,l1,sec_temp(3 downto 0),sec_temp(7 downto 4),c1); u2 : counter_60 port map (c1,sec,put,clr,l2,lightmin(3 downto 0),lightmin(7 downto 4),c2);u3 : counter_24 port map (c2,sec,put,clr,l3,lighthour(3 downto 0),lighthour(10 downto 4)); lightsec(7 downto 0)<=sec_temp(7 downto 0);--状态转换process (choice)beginif (choice'event and choice='1') thencase load iswhen "00" => l1<='0'; --非修改状态l2<='0';l3<='0';load<="01";when "01" => l1<='0'; --此状态下对小时进行修改l2<='0';l3<='1';load<="10";when "10" => l1<='0'; --此状态下对分钟进行修改l2<='1';l3<='0';load<="11";when others => l1<='1'; --此状态下对秒进行修改l2<='0';l3<='0';load<="00";end case;end if;end process;--计数进程process(clk)beginif (clk'event and clk='1') then --分频if (temp=2499) thentemp <= 0;sec<=not sec;elsetemp <= temp+1;end if;end if;end process;--响铃进程process(clk1)beginif(clk1'event and clk1='1') thenif (temp1=95) thentemp1<=0;a<=not a;elsetemp1<=temp1+1;end if;end if;end process;ring<=a when (c2='1' and sec_temp<5 and sec='1') else --5s整点响铃'0';end func;library IEEE;entity counter_60 isport (clock : in std_logic; --计数信号,即低位的进位信号或时钟脉冲信号clk_1s : in std_logic; --周期1s 的时钟信号putust : in std_logic; --调表置数信号clr : in std_logic; --清零load : in std_logic; --判定信号s1 : out std_logic_vector(3 downto 0); --计数器的个位s10 : out std_logic_vector(3 downto 0); --计数器的十位co : out std_logic );end counter_60;if(load=1 ) --防止脉冲产生进位co_ temp<=’0’;architecture func of counter_60 issignal s1_temp: std_logic_vector(3 downto 0);signal s10_temp : std_logic_vector(3 downto 0);signal clk,co_temp : std_logic;beginclk<=clock when load='0' elseputust;process (clk,clr)beginif (clr='1') thens1_temp <= "0000";s10_temp <= "0000";elsif (clk'event and clk='1')then --进位判断if (s1_temp=9) thens1_temp <= "0000";if (s10_temp=5) thens10_temp <= "0000";co_temp<='1';elseco_temp<='0';s10_temp <= s10_temp+1;end if;elseco_temp<='0';s1_temp <= s1_temp+1;end if;end process;s1 <= s1_temp when (clk_1s='1'or load='0') else"1111";s10 <= s10_temp when (clk_1s='1' or load='0') else"1111";co <= co_temp when (load='0') else'0';end func;library IEEE;--24进制计数器entity counter_24 isport(clock : in std_logic; --计数信号clk_1s : in std_logic; --周期1s 的时钟信号putust : in std_logic;clr : in std_logic; --清零信号load : in std_logic; --判定信号s1 : out std_logic_vector(3 downto 0); --计数器的个位s10 : out std_logic_vector(6 downto 0)); --计数器的十位end counter_24;architecture func of counter_24 issignal s1_temp : std_logic_vector(3 downto 0);signal s10_temp : std_logic_vector(1 downto 0);signal clk : std_logic;beginclk<=clock when load='0' elseprocess (clk,clr)beginif (clr='1') thens1_temp <= "0000";s10_temp <= "00";elsif (clk'event and clk='1') thenif (s1_temp=3 and s10_temp=2) then s1_temp <= "0000";s10_temp <= "00";elsif (s1_temp=9) thens1_temp<="0000";s10_temp<=s10_temp+1;elses1_temp <= s1_temp+1;end if;end if;end process;--显示进程process(s10_temp)beginif (clk_1s='1' or load='0') thencase s10_temp iswhen "00" => s10<="1111110";when "01" => s10<="0110000";when "10" => s10<="1101101";when others => null;end case;elses10<="0000000";end if;end process;s1 <= s1_temp when (clk_1s='1' or load='0') else"1111";end func;四、实验小结:注意当时钟处于被修改状态时,即对时、分、秒的值进行修改时,不应产生进位,产生很多莫名其妙的错误,如修改后有进位(分钟为00)时,或者自行到整点响铃后,再次给脉冲会进位的情况。
本文由风中思念7贡献pdf文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
一、概述VHDL与数字电路设计一、概述二、VHDL语言三、用VHDL设计逻辑电路传统数字电路设计方法 EDA设计方法 PLD器件设计流程文本设计输入—VHDL程序设计数字电子技术的基本知识回顾组合逻辑电路编码器、译码器、数据选择器、加法器、数值比较器等传统设计方法传统的设计方法是基于中小规模集成电路器件进行设计(如74系列及其改进系列、CC4000系列、 74HC系列等都属于通用型数字集成电路),而且是采用自底向上进行设计:(1)首先确定可用的元器件;(2)根据这些器件进行逻辑设计,完成各模块;(3)将各模块进行连接,最后形成系统;(4)而后经调试、测量观察整个系统是否达到规定的性能指标。
时序逻辑电路同步时序逻辑电路异步时序逻辑电路寄存器、移位寄存器、计数器、序列信号发生器 EDA设计方法EDA(Electronics Design Automation)即电子设计自动化技术,是利用计算机工作平台,从事电子系统和电路设计的一项技术。
EDA技术为电子系统设计带来了这样的变化:(1)设计效率提高,设计周期缩短;(2)设计质量提高;(3)设计成本降低;(4)能更充分地发挥设计人员的创造性;(5)设计成果的重用性大大提高,省去了不必要的重复劳动。
自顶向下的设计方法数字电路的EDA设计是基于PLD进行设计的,支持自顶向下的设计方法:(1)首先从系统设计入手,在顶层进行功能划分和结构设计;(2)然后再逐级设计底层的结构;(3)并在系统级采用仿真手段验证设计的正确性;(4)最后完成整个系统的设计,实现从设计、仿真、测试一体化。
传统设计方法 vs EDA设计方法传统设计方法自底向上手动设计软硬件分离原理图设计方式系统功能固定不易仿真难测试修改模块难移植共享设计周期长PLD器件设计流程(1)PLD开发系统包括硬件和软件两部分。
八、源代码及注释--电子节拍器--分频器组模块dividers源代码--分频器组模块通过对50MHz的外部时钟进行分频,--产生其他模块所需的各种时钟频率并输出,--有60Hz、5000Hz、3000Hz、1500Hz、1000Hz,分别用5个进程实现。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity dividers is --定义实体dividersport(clk : in std_logic; --外部时钟输入clk_out60: out std_logic; --60Hz频率输出clk_out5000 : out std_logic; --5000Hz频率输出clk_out3000 : out std_logic; --3000Hz频率输出clk_out1500 : out std_logic; --1500Hz频率输出clk_out1000 : out std_logic); --1000Hz频率输出end dividers;architecture div of dividers issignal tmp5000 : integer range 0 to 4999; --分频得5000hz 的计数器大小signal tmp3000 : integer range 0 to 8332; --3000hz 3x10^9=50x10^6x60 use 3000hz signal tmp1500 : integer range 0 to 16665; --1500hzsignal tmp1000 : integer range 0 to 49999; --1000hzsignal tmp60 : integer range 0 to 416666; --60hzsignal clktmp5000 : std_logic; --分频得5000hz 的时钟信号signal clktmp3000 : std_logic;signal clktmp1500 : std_logic;signal clktmp1000 : std_logic;signal clktmp60 : std_logic;beginp5000: process(clk) --分频得5000hz 的分频器进程beginif clk'event and clk='1' then --对50MHz进行10000分频得5000hz 的频率if tmp5000=4999 then --达到5000hz 的计数器大小时归零tmp5000<=0;clktmp5000<=not clktmp5000; --5000hz 的时钟信号翻转一次elsetmp5000<=tmp5000+1; ----未达到5000hz 的计数器模值时计数器加一end if;end if;end process p5000; --分频得5000hz 的分频器进程结束p1500: process(clk) --以下各分频器原理同上beginif clk'event and clk='1' thenif tmp1500=16665 thentmp1500<=0;clktmp1500<=not clktmp1500;elsetmp1500<=tmp1500+1;end if;end if;end process p1500;p1000: process(clk)beginif clk'event and clk='1' thenif tmp1000=49999 thentmp1000<=0;clktmp1000<=not clktmp1000;elsetmp1000<=tmp1000+1;end if;end if;end process p1000;p3000: process(clk)beginif clk'event and clk='1' thenif tmp3000=8332 thentmp3000<=0;clktmp3000<=not clktmp3000;elsetmp3000<=tmp3000+1;end if;end if;end process p3000;p60: process(clk)beginif clk'event and clk='1' thenif tmp60=416666 thentmp60<=0;clktmp60<=not clktmp60;elsetmp60<=tmp60+1;end if;end if;end process p60;clk_out5000 <= clktmp5000; --输出分频得到的5000hz 频率clk_out3000 <= clktmp3000;clk_out1500 <= clktmp1500;clk_out1000 <= clktmp1000;clk_out60 <= clktmp60;end div; ———————————————————————————————————————--电子节拍器--速度设置模块set_speed源代码--速度设置模块实现速度在40至120内连续可调library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;entity set_speed isport(clk60 : in std_logic; --分频器60hz时钟输入vadd : in std_logic; --加按键输入vdec : in std_logic; --减按键输入clear : in std_logic; --置位键输入beat_v : out std_logic_vector(6 downto 0); --速度输出v_out0 : out std_logic_vector(3 downto 0); --速度个位二进制输出(对应0号数码管)v_out1 : out std_logic_vector(3 downto 0); --速度十位二进制输出(对应1号数码管)v_out2 : out std_logic_vector(3 downto 0)); --速度百位二进制输出(对应2号数码管)end set_speed;architecture set of set_speed issignal cn : integer range 40 to 120; --速度记录信号signal change_a : std_logic; --加按键输入按下记录信号signal change_d : std_logic; --减按键输入按下记录信号signal count_add : integer:=0; --加按键输入按下时长记录信号signal count_dec : integer:=0; --减按键输入按下时长记录信号signal a10 : integer range 0 to 99; --速度减去百位的数的记录信号signal a0 : integer range 0 to 9; --速度个位记录信号signal a1 : integer range 0 to 9; --速度十位记录信号signal a2 : integer range 0 to 1; --速度百位记录信号beginprocess(clk60,vadd,vdec)beginif clk60'event and clk60='1' thenif (vadd='1') then --若加键按下change_a<='1'; --加按键输入按下记录信号置1count_add<=count_add+1; --加按键输入按下时长记录信号加1if (count_add>60 and cn<=115) then --加按键输入按下时长记录信号大于60--即加按键按下时长大于1s(长按)--若速度小于115cn<=cn+5; --则速度连加5count_add<=count_add-60; --同时加按键输入按下时长记录信号减60 elsif (count_add>60 and cn>115) then --若速度大于115cn<=120; --速度只能增加到设置的上限120count_add<=0; --加按键输入按下时长记录信号置0change_a<='0'; --加按键输入按下记录信号置0end if;elsif (vdec='1') then --原理同加按键change_d<='1';count_dec<=count_dec+1;if (count_dec>60 and cn>=45) thencn<=cn-5;count_dec<=count_dec-60;elsif (count_dec>60 and cn<45) thencn<=40;count_dec<=0;change_d<='0';end if;elsif(vadd='0' and vdec='0') then --检测到无键按下时if (change_a='1' and count_add<60 and cn<120 ) then --若加键按下--且加按键输入按下时长记录信号小于60(短按)--且速度小于120cn<=cn+1; --则速度加1count_add<=0;change_a<='0';elsif (change_a='1' and count_add>=60 ) then --若加键长按count_add<=0;change_a<='0';if (cn<=115 ) then --原理同上cn<=cn+5;elsif (cn>115 ) thencn<=120;end if;elsif (change_d='1' and count_dec<60 and cn>40 ) then --原理同加按键cn<=cn-1;count_dec<=0;change_d<='0';elsif (change_d='1' and count_dec>=60 ) thencount_dec<=0;change_d<='0';if (cn>=45 ) thencn<=cn-5;elsif (cn<45 ) thencn<=40;end if;end if;end if;if clear ='1' then --实现置位功能cn<=80;count_add<=0;count_dec<=0;end if;if cn>=100 thena2<=1;a10<=cn-100;elsea2<=0;a10<=cn;end if;a1<= a10/10;a0<= a10-a1*10;end if;end process;v_out2<=conv_std_logic_vector(a2,4); --将速度的百位(十进制)转换为二进制后输出v_out1<=conv_std_logic_vector(a1,4);v_out0<=conv_std_logic_vector(a0,4);beat_v<=conv_std_logic_vector(cn,7); --将速度(十进制)转换为二进制后输出end set;--电子节拍器--节拍型选择模块set_rhythm源代码--节拍型选择模块可设置的节拍有1/4、2/4、3/4、4/4、3/8、6/8可选,--通过sel 按键选择,送到2个数码管显示,并把选好的节拍型输出到相关模块。
教材:《VHDL硬件描述语言与数字逻辑电路设计》候伯亨 顾新西安电子科技大学参考书:《EDA与数字系统设计》李国丽等机械工业出版社一、多功能数字钟的设计1、数字系统设计问题设计一个能进行时、分、秒计时的12h制或24h制的数字钟,并具有定时与闹钟功能,能在设定的时间发出闹铃音,能非常方便地对时、分和秒进行手动调节,以校准时间,每逢整点.产生报时音报时。
其系统框图如图1-1所示。
1-1数字钟的系统框图2、设计提示此设计问题可分为主控电路、计数器模块和扫描显示三大部分,其中计数器部分的设计是已经非常熟悉的问题,只要掌握六十进制、十二进制的计数规律,用同步计数或异步计数都可以实现,扫描显示模块也已经介绍过,所以主控电路中各种特殊功能的实现是这个设计问题的关键。
用两个电平信号A、B进行模式选择,其中,AB=00为模式0,系统为计时状态;AB =01为模式1,系统为手动校时状态;AB=10为模式2,系统为闹钟设置状态。
设置一个turn信号,当turn=0时,表示在手动校对时,选择调整分部分;当turn=1 时,表示在手动校对时,选择调整时部分。
设置一个change信号,在手动校时或闹钟设置模式下,每按一次,计数器加1。
设置一个reset信号,当reset=0时,整个系统复位;当reset=1时,系统进行计时或其他特殊功能操作。
设置一个关闭闹钟信号reset1,当reset1=0时,关闭闹铃信号:reset1=1可对闹铃进行设置。
设置状态显示信号(发光二极管):LD_alert指示是否设置了闹铃功能;LD_h指示当前调整的是时信号;LD_m指示当前调整的是分信号。
当闹铃功能设置后(LD_atert=1,系统应启动一个比较电路,当计时与预设闹铃时间相等时,启动闹铃声,直到关闭闹铃信号有效。
整点报时由分和秒计时同时为0〔或60)启动,与闹铃声共用一个扬声器驱动信号out。
系统计时时钟为clk=1Hz,选择另—个时钟clk_1k=1024Hz作为产生闹铃声、报时音的时钟信号。
课程设计报告课程设计题目:数字钟系统设计学号:2学生姓名:刘新强专业:通信工程班级:1421302指导教师:钟凯2016年1月4日FPGA( Field Programmable Gate Array,现场可编程门阵列),一种可编程逻辑器件,是目前数字系统设计的主要硬件基础。
可编程逻辑器件的设计过程是利用EDA 开发软件和编程和编程工具对器件进行开发的过程。
通过modelsim软件下采用verilog语言实现数字钟系统设计,实现了以下几个方面的功能:1.数字钟基本计时功能2.数字钟校时功能3.数字钟系统报时功能关键词:FPGA ;VHDL;数字钟一、FPGA与VHDL简介 (1)1、FPGA与简介 ...........................................................................................2、VHDL简介 ...............................................................................................二、课程设计的目的与要求 (2)1、教学目的....................................................................................................................2、教学要求....................................................................................................................3、数字钟系统设计要求................................................................................................三、设计方案 (2)1、系统框图....................................................................................................................2、模块说明....................................................................................................................四、仿真与实现 (3)1、数字钟基本计时功能实现........................................................................................2、数字钟校时功能实现................................................................................................3、数字钟系统报时功能实现........................................................................................五、实验心得 (4)六、参考文献 (4)七、代码 (5)一、FPGA与VHDL简介1、FPGA简介以硬件描述语言(Verilog 或VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至FPGA 上进行测试,是现代IC 设计验证的技术主流。
vhdl计时器课程设计一、课程目标知识目标:1. 学生能理解VHDL的基本概念,掌握计时器的原理和设计方法;2. 学生能运用VHDL语言编写简单的计时器程序,并了解其功能模块;3. 学生了解数字电路的设计流程,掌握VHDL在数字系统设计中的应用。
技能目标:1. 学生能运用所学知识,独立完成一个简单的VHDL计时器设计;2. 学生能够通过分析问题,合理划分计时器的功能模块,并进行编程实现;3. 学生能够运用仿真工具对设计的计时器进行功能验证和性能分析。
情感态度价值观目标:1. 学生通过课程学习,培养对数字电路设计的兴趣,增强学习动力;2. 学生在团队协作中,培养沟通与协作能力,提高解决问题的信心;3. 学生认识到科技发展对社会的重要性,增强创新精神和责任意识。
课程性质:本课程为数字电路设计方向的实践课程,结合理论知识,培养学生的实际操作能力。
学生特点:学生具备一定的电子技术基础和VHDL语言知识,对数字电路设计有一定了解,但实际操作经验不足。
教学要求:通过本课程的学习,使学生能够将理论知识与实际操作相结合,提高其解决实际问题的能力。
教学过程中,注重启发式教学,引导学生主动思考,培养学生独立分析和解决问题的能力。
同时,关注学生的情感态度价值观的培养,提高其综合素质。
二、教学内容1. 计时器原理及VHDL基础回顾- 数字电路基础知识- 计时器工作原理- VHDL基本语法与结构2. 计时器设计方法及步骤- 计时器设计需求分析- 功能模块划分- VHDL编程规范3. VHDL计时器设计实践- 时钟信号生成模块设计- 计数器模块设计- 显示模块设计4. 计时器功能验证与性能分析- 仿真工具使用方法- 功能验证方法与步骤- 性能分析指标5. 教学案例分析- 分析实际计时器设计案例- 课堂讨论与问题解答教学内容安排与进度:第一周:回顾数字电路基础知识,学习计时器工作原理,掌握VHDL基本语法与结构;第二周:学习计时器设计方法及步骤,进行功能模块划分;第三周:编写VHDL代码,完成计时器设计;第四周:进行计时器功能验证与性能分析,讨论教学案例。
数字电子钟实验报告数字电子钟实验报告武汉职业技术学院实验报告科目__《电子技术基础》________实验名称__数字电子钟实训课程设计________________应用09301_班_第_4_实验小组|成绩:作者_魏鹏_同作者_______|日期_201*_年_5_月_26_日|指导老师:一、实训目的:1、巩固所学数字电路的基础知识和基础知识的应用及加强对电路图的分析及理解能力2、培养一定的自学、独立分析问题和解决今后工作中的实际问题的基本能力3、培养实践动手能力,掌握简单数字系统的设计和制作方法二、实训内容:依据简单数字系统设计和制作数字电子钟三、实训要求:1、充分理解电路原理图2、元器件的识别及参数选择3、注意制作过程中的安全事项4、四、元器件选择:五、原理框图及成品图:六、实训步骤:1、实训准备。
学习数字电子钟的原理图及设计原理、了解所需元器件及其参数和数字电子钟的调试方法。
2、实训操作。
发放电路板及元器件,发放元器件以焊完一个发一个的原则,以防大家的错焊漏焊。
3、选择和测试元器件,用“万用表”测试元器件质量的好坏。
4、装配元件。
把元器件按接线图正确地焊接在印制电路板上。
5、调试产品的技术指标。
按电路原理测试各点的工作电压,以判断其工作是否正常。
6、若组装出的产品有故障,依据所学知识独立思考、找出问题的根源,并排除产品的故障。
7、对成品的进一步检测,检测内容包括焊点的饱满度、光泽度及产品的可操作性等。
七、实训感想:通过这次对数字钟的设计与制作,让我们了解了数字钟的原理和设计理念。
要制作一个电子产品一定要严格按照电路原理图设计,而且最后的成品不一定与想象的完全一样,因为在实际焊接中有着各种各样的问题,所以要细心焊接这样做出来的成品才比较美观。
设计过程中,在一次又一次的失败面前,我们没有退缩,而是勇敢的去面对,积极的去解决,充分运用所学知识和他人的帮助,最终取得了成功。
通过亲自动手焊接,试验,遇到问题,解决问题,我们巩固了书本的知识,同时也学到了新的学问,明白了实践的可贵性。
基于VHDL语言实现数字电子钟的设计一.设计要求:1、设计内容选用合适的可编程逻辑器件及外围电子元器件,设计一个数字电子钟,利用EDA软件(QUARTUS Ⅱ)进行编译及仿真,设计输入可采用VHDL硬件描述语言输入法)和原理图输入法,并下载到EDA实验开发系统,连接外围电路,完成实际测试。
2、设计要求(1)具有时、分、秒计数显示功能。
(2)具有清零的功能,且能够对计时系统的小时、分钟进行调整。
(3)小时为十二小时制。
二.实验目的:1.通过这次EDA设计中,提高手动能力。
2.深入了解时事时钟的工作原理,以及时事时钟外围硬件设备的组成。
3.掌握多位计数器相连的设计方法。
4.掌握十进制,六进制,二十四进制计数器的设计方法。
5.继续巩固多位共阴极扫描显示数码管的驱动,及编码。
6.掌握扬声器的驱动。
7.LED灯的花样显示。
8.掌握CPLD技术的层次化设计方法三.实验方案:数字系统的设计采用自顶向下、由粗到细, 逐步分解的设计方法, 最顶层电路是指系统的整体要求, 最下层是具体的逻辑电路的实现。
自顶向下的设计方法将一个复杂的系统逐渐分解成若干功能模块, 从而进行设计描述, 并且应用EDA 软件平台自动完成各功能模块的逻辑综合与优化, 门级电路的布局, 再下载到硬件中实现设计。
因此对于数字钟来说首先是时分秒的计数功能,然后能显示,附带功能是清零、调整时分。
通过参考EDA 课程设计指导书,现有以下方案:1.作为顶层文件有输入端口:时钟信号,清零按键,调时按键,调分按键;输出端口有:用于接数码管的八段码输出口,扫描用于显示的六个数码管的输出口。
2.底层文件分为:(1)时间计数模块。
分秒计数模块计数为60计数,时计数模块为12计数。
(2)显示模块。
显示模块由一个六进制计数器模块和一个七段译码器组成。
进制计数器为六选一选择器的选择判断端提供输入信号, 六选一选择器的选择输出端分别接秒个位、秒十位、分个位、分十位和时个位、时十位的选通位用来完成动态扫描显示,同时依次输出秒个位、秒十位、分个位、分十位和时个位、时十位数向给译码模块。
(3)报警模块当时间到整点时就报时。
输入有时分秒计数,时钟脉冲。
(4)采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以不用此种作为显示.采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,但无法显示图形文字,在显示星期是也只能用数字表示,而且采用动态扫描法与单片机连接时,在编程时比较复杂。
所以也不采用了LED数码管作为显示。
采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示文字,图形,显示多样,清晰可见,所以在此设计中采用LCD液晶显示屏。
四.实验原理:1. 实验主控系统原理图:模块设计原理图:以上为方案原理图,秒计数、分计数模块为60计数,计满后分别产生分脉冲、时脉,用于分计数、时计数。
各计数器同时将计数值送报时模块和送数及六选一选择器模块。
送数及六选一选择器模块依次将秒分时数送往译码模块译码,同时产生扫描信号用于数码管扫描显示。
整点报警在整点时刻将秒脉冲信号送扬声器声音报警。
(1)秒计数模块:Second模块为秒计数模块。
Clk作为秒脉冲,reset复位,setmin用于调整分钟,接按键,enmin是当秒计数记到59后产生分脉冲,秒计数重新从0开始计数。
Daout为秒计数。
(2)分计数模块:分计数为分计数模块。
Clk作为分脉冲,接second模块的enmin,reset用于复位,sethour用于调整小时,接按键,enhour是当分计数记到59后产生时脉冲,分计数重新从0开始计数。
Daout为分计数。
(3)时计数模块:时计数为时计数模块,clk为时脉冲,接minute模块的enhour,reset复位,daout为时计数。
五.硬件要求:在同一EPLD芯片EPF10K10上集成了如下电路模块:1.时钟计数:秒——60进制BCD码计数;分——60进制BCDD码计数;时——24进制BCDD码计数;同时整个计数器有清零,调分,调时功能。
在接近整数时间能提供报时信号。
2.具有驱动8位八段共阴扫描数码管的片选驱动信号输出和八段字形译码输出。
编码和扫描可参照“实验四”。
3.扬生器在整点时有报时驱动信号产生。
六.实验源程序及流程图:1.实验源程序(VHDL)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;------------------------------------------------------------------------------------------------------------entity daclk isport( Clk : in std_logic; --时钟输入Rst : in std_logic; --复位输入S1,S2 : in std_logic; --时间调节输入SPK : out std_logic; --扬声器输出Display : out std_logic_vector(7 downto 0); --八段码管显示输出SEG_SEL : buffer std_logic_vector(2 downto 0) ; --八段码管扫描驱动lam :out std_logic_vector(2 downto 0) );end daclk;---------------------------------------------------------------------------------------------------------architecture behave of daclk issignal 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 Clk_Count1 : std_logic_vector(13 downto 0);signal Clk1Hz : std_logic;signal Music_Count : std_logic_vector(2 downto 0);signal count : std_logic_vector(1 downto 0);signal lamp :std_logic_vector(2 downto 0);beginprocess(Clk) --产生1Hz 时钟的分频计数器beginif(Clk'event and Clk='1') thenif(Clk_Count1<10000) thenClk_Count1<=Clk_Count1+1;elseClk_Count1<="00000000000001";end if;end if;end process;Clk1Hz<=Clk_Count1(13);process(Clk1Hz,Rst)beginif(Rst='0') then --系统复位SEC1<=0;SEC10<=0;MIN1<=0;MIN10<=0;HOUR1<=0;HOUR10<=0;elsif(Clk1Hz'event and Clk1Hz='1') thenif(S1='0') then --调节小时if(HOUR1=9) thenHOUR1<=0;HOUR10<=HOUR10+1;elsif(HOUR10=2 and HOUR1=3) thenHOUR1<=0;HOUR10<=0;elseHOUR1<=HOUR1+1;end if;elsif(S2='0') then --调节分钟if(MIN1=9) thenMIN1<=0;if(MIN10=5) thenMIN10<=0;elseMIN10<=MIN10+1;end if;elseMIN1<=MIN1+1;end if;elsif(SEC1=9) thenSEC1<=0;if(SEC10=5) thenSEC10<=0;if(MIN1=9) thenMIN1<=0;if(MIN10=5) thenMIN10<=0;if(HOUR1=9) thenH OUR1<=0;H OUR10<=HOUR10+1;elsif(HOUR10=2 and HOUR1=3) thenH OUR1<=0;H OUR10<=0;elseHOUR1<=HOUR1+1;end if;elseMIN10<=MIN10+1;end if;elseMIN1<=MIN1+1;end if;elseSEC10<=SEC10+1;end if;elseSEC1<=SEC1+1;end if;end if;end process;process(Clk) --整点报时beginif(Clk'event and Clk='1') thenMusic_Count<=Music_Count+1;if(MIN10=5 and MIN1=9 and SEC10=5) thenif((SEC1 MOD 2)=0) thenSPK<=Music_Count(2);elseSPK<='0';end if;elsif(MIN10=0 and MIN1=0 and SEC10=0 and SEC1=0) then SPK<=Music_Count(1);elseSPK<='0';end if;end if;end process;process(clk1Hz) --LED灯beginlam<=lamp;if (rising_edge(clk1Hz)) thencount <= count + 1;if (count <= "10") thenif (count ="00") thenlamp <= "001" ;elsif (count = "01") thenlamp<= "010" ;elsif(count="10") thenlamp <= "100" ;end if;elsecount <= "00";end if;end if;end process ;process(SEG_SEL) --显示排序begincase (SEG_SEL+1) iswhen "111"=>Disp_Temp<=HOUR10;when "110"=>Disp_Temp<=HOUR1;when "101"=>Disp_Temp<=10;when "100"=>Disp_Temp<=MIN10;when "011"=>Disp_Temp<=MIN1;when "010"=>Disp_Temp<=10;when "001"=>Disp_Temp<=SEC10;when "000"=>Disp_Temp<=SEC1;end case;end process;process(Clk) --扫描累加beginif(Clk'event and Clk='1') thenSEG_SEL<=SEG_SEL+1;Display<=Disp_Decode;end if;end process;process(Disp_Temp) --显示转换begincase Disp_Temp iswhen 0=>Disp_Decode<="00111111";when 1=>Disp_Decode<="00000110";when 2=>Disp_Decode<="01011011";when 3=>Disp_Decode<="01001111";when 4=>Disp_Decode<="01100110";when 5=>Disp_Decode<="01101101";when 6=>Disp_Decode<="01111101";when 7=>Disp_Decode<="00000111";when 8=>Disp_Decode<="01111111";when 9=>Disp_Decode<="01101111";when 10=>Disp_Decode<="01000000";when others=>Disp_Decode<="00000000";end case;end process;end behave;2.实验流程图:七.系统的仿真调试;1.秒计数模块仿真:2.分计数模块仿真:3.时计数模块仿真:4.系统硬件测试:本次选用cyclone系列EP1C3T144C8芯片。