数字时钟设计VHDL

合集下载

fpga数字时钟课程设计

fpga数字时钟课程设计

fpga数字时钟课程设计FPGA数字时钟课程设计随着科技的不断发展,数字时钟已经成为现代人生活中必不可少的物品。

数字时钟的准确性和便捷性吸引了越来越多的人使用。

而现在,我们可以通过FPGA数字时钟课程设计来实现一个高精度的数字时钟。

FPGA(Field Programmable Gate Array)是一种可编程逻辑器件,可以通过编程实现各种不同的功能。

数字时钟的实现也可以通过FPGA来完成。

在FPGA数字时钟课程设计中,我们需要先确定时钟的基础部分。

时钟的基础部分由时钟信号产生器、时钟分频器、时钟计数器和时钟显示器组成。

时钟信号产生器需要产生一个稳定的时钟信号,以供后续的计数器和分频器使用。

我们可以通过FPGA中的时钟模块来产生一个稳定的时钟信号。

接下来,时钟分频器需要将时钟信号分频,使得计数器可以进行精确的计数。

分频器的分频系数可以通过FPGA中的数码开关进行设置。

然后,时钟计数器需要根据分频器的设定进行精确的计数。

计数器的计数值可以通过FPGA中的计数器模块进行设置。

时钟显示器需要将计数器的计数值进行显示。

我们可以通过FPGA 中的数码管模块来实现时钟的显示功能。

除了基础部分,我们还可以通过添加更多的功能来完善数字时钟。

例如,我们可以添加闹钟功能、日期显示功能等,以增加数字时钟的实用性。

在FPGA数字时钟课程设计中,我们可以使用VHDL(VHSIC Hardware Description Language)语言进行编程。

VHDL是一种硬件描述语言,可以用于FPGA和ASIC的设计。

通过编写VHDL 程序,我们可以实现数字时钟的各种功能。

FPGA数字时钟课程设计是一个非常有趣和实用的课程项目。

通过这个项目,我们可以深入了解数字时钟的工作原理,熟悉FPGA的编程方法,同时也可以锻炼自己的编程能力。

根据QuartusII软件的数字时钟设计

根据QuartusII软件的数字时钟设计
ten :buffer std_logic_vector(3 downto 0);
full:out std_logic);
end component;
component scan6----------------------------------------------------------------元器件4
Port(clr,clk:in std_logic;
one :buffer std_logic_vector(3 downto 0);
ten :buffer std_logic_vector(3 downto 0);
full:out std_logic;
dout:buffer std_logic_vector(7 downto 0));
3.2.2 count60组件
由此提供分(秒)计数值,当分计数器计数到59再来一个脉冲信号秒计数器清零从新开始计数,而进位则作为小时计数器的计数脉冲,使小时计数器计数加1,同时分计数器在分设置时钟信号的响应下设置分计数器的数值。在count60组件中,个位(one)和十位(ten)分别计数,都设为二进制四位矢量形式,当个位从0计到9时,在下一个clk上升沿来临后,十位进1,个位变0,十位从0到5计数,在十位为5,个位9的时候,下一个上升沿来临后,十位个位都变0,进位full加1。因此在程序设计中需要两个进程process来分别完成计数,秒计数以1Hz的输入为触发信号,分计数以秒的full信号为触发信号。具体的count60的组件代码如下:
component div40M------------------------------------------------------------------元器件1

vhdl数字电子钟的设计与实现

vhdl数字电子钟的设计与实现

基于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数字时钟设计

VHDL数字时钟设计

VHDL数字时钟设计序⾔这个是我在做FPGA界的HelloWorld——数字钟设计时随⼿写下的,再现了数字钟设计的过程⽬标分析1. 时钟具有时分秒的显⽰,需6个数码管。

为了减⼩功耗采⽤扫描法显⽰2. 按键设置时间,需要对按键进⾏消抖3. 时分秒即为2个60进制计数器,⼀个24进制计数器。

模块设计综上所述,我采⽤模块化设计⽅法进⾏设计,绘制框图如下。

1. 时钟分频产⽣各个模块所需频率时钟。

2. 按键处理模块对按键信号进⾏消抖、变长脉冲为短脉冲等处理。

3. 时间控制模块产⽣时间信号或对时间进⾏设置。

4. 数码管驱动模块负责对时间信号BCD码译码为数码管的段码并且扫描输出到数码管。

下⾯对各个模块分别详细叙述时钟分频模块我打算把时钟分频模块做成“数控N分频器”,通过给分频器传⼊数值N来对时钟信号进⾏N分频。

得到的信号频率为原时钟信号的频率/N,占空⽐为1/N。

稍微考虑下其他模块所需时钟:按键处理模块100Hz ,时间控制模块1Hz,数码管驱动50Hz。

⽽输⼊时钟为33.8688MHz。

我不想传⼊的N数值过⼤,我打算先对时钟进⾏两次:第⼀次调⽤时钟分频模块得到1Mhz,第⼆次得到1Khz。

这样N的位数为10可以满⾜需求。

代码如下library IEEE;use IEEE.STD_LOGIC_1164.all;use IEEE.STD_LOGIC_UNSIGNED.all;entity ClkDiv isport(clk_i:IN STD_LOGIC;N_i: IN STD_LOGIC_VECTOR(9 DOWNTO 0);clk_o:OUT STD_LOGIC);end ClkDiv;architecture behavior of ClkDiv issignal count:STD_LOGIC_VECTOR(9 DOWNTO 0):="0000000001";signal clk_temp:STD_LOGIC:='0';beginprocess(clk_i)beginif(clk_i'EVENT and clk_i='1')thenif (count=N_i)thencount<="0000000001";clk_temp<='1';elsecount<=count+1;clk_temp<='0';end if;end if;end process;clk_o<=clk_temp;end behavior;仿真结果如下:2分频:输出信号为f/2Hz,占空⽐1:23分频:输出信号为f/3Hz,占空⽐1:3按键处理模块去抖动根据以往的经验,按键按下弹起电平会有⼀⼩段⽑刺,可能会引起电路误操作,所以要对按键进⾏消抖处理使变为⼲净的矩形信号。

VHDL电子时钟的设计

VHDL电子时钟的设计

VHDL电子时钟的设计VHDL(Very High Speed Integrated Circuit Hardware Description Language)是一种硬件描述语言,用于设计和模拟数字电路和系统。

在这篇文章中,我们将探讨VHDL电子时钟的设计。

设计一个VHDL电子时钟需要考虑以下几个方面:时钟的显示方式、时钟的时钟源以及时钟的控制逻辑。

首先,我们需要确定时钟的显示方式。

常见的电子时钟显示方式有7段LED显示和LCD显示。

在这里,我们选择使用7段LED显示。

7段LED 显示由7个LED灯组成,可以显示0到9的数字。

此外,还需要考虑到显示小时和分钟的两个时钟。

接下来,我们需要确定时钟的时钟源。

时钟源决定了时钟的精度和稳定性。

在VHDL设计中,常用的时钟源有晶体振荡器和时钟发生器。

晶体振荡器由晶体和振荡电路组成,可以提供非常精确和稳定的时钟信号。

时钟发生器则基于计数器和除频器的原理产生时钟信号。

根据实际需求选择合适的时钟源。

最后,我们需要设计时钟的控制逻辑。

控制逻辑决定了时钟的功能和操作方式。

在这里,我们将设计一个简单的时钟,包括设置时间、调节时间、显示时间和闹钟功能。

我们可以使用按钮和开关控制时钟的功能。

下面是一个VHDL电子时钟的示例设计代码:```vhdl--时钟显示模块entity ClockDisplay isportclk : in std_logic;reset : in std_logic;hours : in integer range 0 to 23;minutes : in integer range 0 to 59;alarm : in std_logic;seg7 : out std_logic_vector(6 downto 0) end entity ClockDisplay;architecture Behavioral of ClockDisplay is signal count : integer := 0;signal sec : integer := 0;signal disp_hours : integer := 0;signal disp_minutes : integer := 0;beginprocess (clk, reset)beginif reset = '1' thencount <= 0;sec <= 0;disp_hours <= 0;disp_minutes <= 0;elsif rising_edge(clk) thencount <= 0;sec <= sec + 1;elsecount <= count + 1;end if;end if;end process;process (sec, reset, hours, minutes, alarm)beginif reset = '1' thendisp_hours <= 0;disp_minutes <= 0;elsif rising_edge(sec) thenif alarm = '1' and hours = disp_hours and minutes = disp_minutes then--闹钟触发逻辑elsif sec = 59 thenif minutes = 59 thenif hours = 23 thendisp_hours <= 0;disp_minutes <= 0;elsedisp_hours <= hours + 1; disp_minutes <= 0;end if;elsedisp_hours <= hours;disp_minutes <= minutes + 1; end if;elsedisp_hours <= hours;disp_minutes <= minutes;end if;end if;end process;process (disp_hours, disp_minutes)begincase disp_hours is...end case;case disp_minutes is...end case;end process;end architecture Behavioral;```这个代码中,我们使用了两个进程来处理时钟的计时和显示逻辑。

VHDL数字钟

VHDL数字钟

课程设计报告设计题目:用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

一、设计题目:基于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 的频率递增计数。

多功能数字电子钟_VHDL

多功能数字电子钟_VHDL

四、各功能模块的源程序代码 :
-- CONTOR 模块 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity contor is
1 )“小时” 校时状态: 进入“小时”校时状态后,显示 “小时” 的数码管闪烁,每按动“ k” 键一次,“小时” +1,若不按动“ k”键 则小时数不变,一直按下“ k” 键则小时数一 4Hz 的频率递增计数。
2 )“分”校时状态:进入“分”校时状态后,显示“分”的数 码管闪烁,每按动“ k” 键一次,“分” +1,若不按动“ k”键则分数 不变,一直按下“ k” 键则分数一 4Hz的频率递增计数。
chs,cms,css,f4 :in std_logic; bsg,bmg,bhg,bsd,bmd,bhd :buffer std_logic_vector(3 downto 0); comout :out std_logic); end time_com; architecture time_comx of time_com is begin com:process(hh,mh,sh,hl,ml) begin if(bhg=hh and bhd=hl and bmg=mh and bmd=ml and bsg=sh)then comout<='1'; else comout<='0'; end if; end process; set:process(f4) begin if(f4'event and f4='1')then if(chs='1'and k='0')then if(bhg="0010" and bhd="0011")then bhd<="0000";bhg<="0000"; elsif(bhd="1001")then bhd<="0000";bhg<=bhg+1; elsif(bhd="0000"or bhd="0001" or bhd="0010"or bhd="0011"or bhd="0100"or bhd="0101"or bhd="0110"or bhd="0111"or bhd="1000")then bhd<=bhd+1; end if; end if; end if; end process; process(f4) begin if(f4'event and f4='1')then if(cms='1'and k='0')then if(bmg="0101" and bmd="1001")then
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

signal up_r:std_logic; Begin Process(clk,rst) Begin IF rst='0' THEN
bcd_r<=(others=>'0'); up_r<='0'; ELSIF clk'EVENT AND clk='1' THEN IF bcd_r="00100100" THEN
bcd_r<=(others=>'0');up_r<='1'; ELSIF bcd_r(3 downto 0)="1001" THEN
bcd_r(3 downto 0)<="0000"; bcd_r(7 downto 4)<=bcd_r(7 downto 4)+1; up_r<='0'; ELSE bcd_r(3 downto 0)<=bcd_r(3 downto 0)+1; up_r<='0'; END IF; END IF; END PROCESS; bcd<=bcd_r; up<=up_r; END bhv;
实验原理
数字时钟框图如图17.1所示,一个完整的时钟应由4部分组成:秒 脉冲发生电路、计数部分、译码显示部分和时钟调整部分。
1、秒脉冲发生:一个时钟的准确与否主要取决秒脉冲的精确度。 可以设计分频电路对系统时钟50MHz进行50000000分频从而得到稳定的 1Hz基准信号。定义一个50000000进制的计数器,将系统时钟作为时钟 输入引脚clk,进位输出即为分频后的1Hz信号。
Begin IF rst='0' THEN
bcd_r<=(others=>'0'); up_r<='0'; ELSIF clk'EVENT AND clk='1' THEN IF bcd_r="01011001" THEN
bcd_r<=(others=>'0');up_r<='1'; ELSIF bcd_r(3 downto 0)="1001" THEN
END bhv;
数码管译码显示模块 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.பைடு நூலகம்TD_LOGIC_Arith.ALL; USE IEEE.STD_LOGIC_Unsigned.ALL; ENTITY xianshi IS PORT(
clk:IN STD_LOGIC; datain:IN STD_LOGIC_VECTOR(31 DOWNTO 0); dig,seg:OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END ENTITY;
ARCHITECTURE one OF xianshi IS SIGNAL counter: std_logic_vector(2 DOWNTO 0); SIGNAL display: std_logic_vector(3 DOWNTO 0);
SIGNAL seg_r: std_logic_vector(7 DOWNTO 0); SIGNAL dig_r: std_logic_vector(7 DOWNTO 0);
IF count="1000000000" THEN count<=(others=>'0'); clk_1Hz_r<=NOT clk_1Hz_r;
ELSE count<=count+1; END IF; END IF; END Process; clk_1Hz<=clk_1Hz_r; END bhv;
实验十七 数字时钟
实验目的
设计一个可以计时的数字时钟,其显示时间范围是 00:00:00~23:59:59,且该时钟具有暂停计时、清零等功能。
实验器材
1、SOPC实验箱 2、计算机(装有Quartus II 7.0软件)
实验预习
1、了解时钟设计原理和各主要模块的设计方法。 2、提前预习,编写好主模块的VHDL程序。
END PROCESS BBB;
CCC:PROCESS(counter,datain) BEGIN CASE counter IS WHEN "000" => display<=datain(31 DOWNTO 28); WHEN "001" => display<=datain(27 DOWNTO 24); WHEN "010" => display<=X"a"; WHEN "011" => display<=datain(19 DOWNTO 16); WHEN "100" => display<=datain(15 DOWNTO 12); WHEN "101" => display<=X"a"; WHEN "110" => display<=datain(7 DOWNTO 4); WHEN "111" => display<=datain(3 DOWNTO 0);
WHEN OTHERS =>NULL; END CASE; END PROCESS CCC;
DDD:PROCESS(display) BEGIN CASE display IS WHEN X"0"=> seg_r<=X"c0"; WHEN X"1"=> seg_r<=X"f9"; WHEN X"2"=> seg_r<=X"a4"; WHEN X"3"=> seg_r<=X"b0"; WHEN X"4"=> seg_r<=X"99"; WHEN X"5"=> seg_r<=X"92"; WHEN X"6"=> seg_r<=X"82"; WHEN X"7"=> seg_r<=X"f8"; WHEN X"8"=> seg_r<=X"80"; WHEN X"9"=> seg_r<=X"90"; WHEN X"a"=> seg_r<=X"BF"; --显示‘-’ WHEN X"b"=> seg_r<=X"83"; WHEN X"c"=> seg_r<=X"c6"; WHEN X"d"=> seg_r<=X"a1"; WHEN X"e"=> seg_r<=X"86"; WHEN X"f"=> seg_r<=X"8e"; WHEN OTHERS =>NULL; END CASE;
4、各模块连接方式如图17.1所示。
选择
显示码8位 数码管显示选通信号 6位
进位信号 进位信号
置数set 时钟信号 动态显示时钟信号2000Hz
译码 电路
数码管 小时 秒 分
60进制 计数器 60进制 计数器 24进制 计数器 复位rst
分频电路
系统时钟为1024Hz
图17.1 数字时钟框图
产生1Hz模块 Library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; Entity clk_1Hz IS PORT(sys_clk:in std_logic;
2、计数部分:应设计1个60进制秒计数器、1个60进制分计数器、1 个24进制时计数器用于计时。秒计数器应定义clk(时钟输入)、 rst(复位)两个输入引脚,Q3~Q0(秒位)、Q7~Q4(十秒位)、 Co(进位位)9个输出引脚。分、时计数器类似。如需要设置时间可再 增加置数控制引脚Set和置数输入引脚d0~d7。
bcd_r(3 downto 0)<="0000"; bcd_r(7 downto 4)<=bcd_r(7 downto 4)+1; up_r<='0'; ELSE bcd_r(3 downto 0)<=bcd_r(3 downto 0)+1; up_r<='0'; END IF; END IF; END PROCESS; bcd<=bcd_r; up<=up_r;
BEGIN AAA:PROCESS(clk)
BEGIN IF clk'EVENT AND clk='1' THEN counter<=counter+1; END IF;
END PROCESS AAA;
BBB:PROCESS(counter) BEGIN CASE counter IS WHEN "000" => dig_r<="01111111"; WHEN "001" => dig_r<="10111111"; WHEN "010" => dig_r<="11011111"; WHEN "011" => dig_r<="11101111"; WHEN "100" => dig_r<="11110111"; WHEN "101" => dig_r<="11111011"; WHEN "110" => dig_r<="11111101"; WHEN "111" => dig_r<="11111110"; WHEN OTHERS =>NULL; END CASE;
相关文档
最新文档