《可编程数字系统》课程设计实验报告基于VHDL的FPGA数字钟设计_第1页
《可编程数字系统》课程设计实验报告基于VHDL的FPGA数字钟设计_第2页
《可编程数字系统》课程设计实验报告基于VHDL的FPGA数字钟设计_第3页
《可编程数字系统》课程设计实验报告基于VHDL的FPGA数字钟设计_第4页
《可编程数字系统》课程设计实验报告基于VHDL的FPGA数字钟设计_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、可编程数字系统设计课程设计实验报告实验名称: 基于vhdl的数字钟设计 _所属课程: 可编程数字系统设计 可编程数字系统课程设计一、课程设计目的: 熟悉eda工具;掌握用vhdl语言进行数字系统设计的基本方法和过程。二、设计任务: 设计一数字钟,用数码管显示基本功能要求:(1) 可以分屏显示时、分、秒,可用数码管的小数点“.”代替时、分、秒的分隔符“:”,分屏显示是指由于数码管只有4个,不能同时显示时、分、秒,但可以只显示时、分,或只显示分、秒,通过按键来切换这两种显示方式。(2)可设置时钟的开始时间。设置时,相应的数码管要闪烁,指示当前设置的设置(内容)。(3)具有闹铃功能,可以设定闹铃时间

2、。闹铃时间到,led闪烁进行指示。三、设计原理:数字钟的逻辑框图如图1所示。它由校时部分、闹钟部分、计时部分、显示部分组成。振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒钟计数器满60后向分计数器进位,分钟计数器满60后向小时计数器进位,时钟计数器按照“24归0”规律计数。计数器的输出分别经译码器送显示。当计时出现误差时或者到达另外一个时区时,可以用校时部分校时、校分、校秒。需要是用闹钟时,可以利用闹钟部分进行定时。 四、系统分析:根据数字钟的功能,我们可以将它的系统电路设计划分为四个部分:校时部分、闹钟部分、计时部分和显示部分。其中计时部分又划分为秒钟计

3、时模块、分钟计时模块、时钟计时模块,显示部分又划分为bcd译码模块和扫屏输出模块。校时模块秒钟计时模块分钟计时模块时钟计时模块译码模块扫屏输出闹钟模块led灯图1数字钟的顶层实体描述如下:-top.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity digitalclock is port(-输入时钟clk:in std_logic;-设定闹钟alarm_set:in std_logic;-双键位校时set:in std_l

4、ogic;mode:in std_logic;-选择显示方式chg:in std_logic;-八段译码输出out_data:out std_logic_vector(7 downto 0);-输出片选seg_out:out std_logic_vector(3 downto 0);-led输出ed_out:out std_logic);end digitalclock;architecture example of digitalclock is-元件例化component adjusterport(-输入时钟clk:in std_logic;-双键位校时set:in std_logic;m

5、ode:in std_logic;-计数使能,接vccen:in std_logic;-秒计数器进位输入s_enout:in std_logic;-分计数器进位输入m_enout:in std_logic;-输出1hz时钟clk1hz:out std_logic;-输出使能s_ce:out std_logic;m_ce:out std_logic;h_ce:out std_logic);end component;component cnt60port(-输入1hz时钟clk1hz:in std_logic;-计数使能en:in std_logic;-进位输出enout:out std_log

6、ic;-bcd输出low:out std_logic_vector(3 downto 0);high:out std_logic_vector(3 downto 0);end component;component cnt24ort(-输入1hz时钟clk1hz:in std_logic;-计数使能en:in std_logic;-bcd输出low:out std_logic_vector(3 downto 0);high:out std_logic_vector(3 downto 0);end component;component displayport(-bcd输入in_data:in

7、std_logic_vector(3 downto 0);-八段译码输出out_data:out std_logic_vector(7 downto 0);end component;component saopingport(-选择显示方式chg:in std_logic;-bcd输入sl:in std_logic_vector(7 downto 0);sh:in std_logic_vector(7 downto 0);ml:in std_logic_vector(7 downto 0);mh:in std_logic_vector(7 downto 0);hl:in std_logic_

8、vector(7 downto 0);hh:in std_logic_vector(7 downto 0);alarm_l:in std_logic_vector(7 downto 0);alarm_h:in std_logic_vector(7 downto 0);-输入时钟clk:in std_logic;-输出片选seg:out std_logic_vector(3 downto 0);-bcd输出out_data:out std_logic_vector(7 downto 0);end component;componentalarmport(-输入时钟clk:in std_logic

9、;-设定闹钟alarm_set:in std_logic;-bcd输入 in_hl:in std_logic_vector(3 downto 0);in_hh:in std_logic_vector(3 downto 0);in_ml:in std_logic_vector(3 downto 0);in_mh:in std_logic_vector(3 downto 0);-bcd输出low:out std_logic_vector(3 downto 0);high:out std_logic_vector(3 downto 0);-led输出led_out:out std_logic);en

10、d component;-常数说明constant vcc:std_logic:=1;-信号说明signal vcc_con:std_logic;signal s_enout:std_logic;signal m_enout:std_logic;signal clk1hz:std_logic;-计数使能signal s_ce:std_logic;signal m_ce:std_logic;signal h_ce:std_logic;-bcd码signal sl:std_logic_vector(3 downto 0);signal sh:std_logic_vector(3 downto 0)

11、;signal ml:std_logic_vector(3 downto 0);signal mh:std_logic_vector(3 downto 0);signal hl:std_logic_vector(3 downto 0);signal hh:std_logic_vector(3 downto 0);signal alarm_low:std_logic_vector(3 downto 0);signal alarm_high:std_logic_vector(3 downto 0);signal sl_out:std_logic_vector(7 downto 0);signal

12、sh_out:std_logic_vector(7 downto 0);signal ml_out:std_logic_vector(7 downto 0);signal mh_out:std_logic_vector(7 downto 0);signal hl_out:std_logic_vector(7 downto 0);signal hh_out:std_logic_vector(7 downto 0);signal alarm_l_out:std_logic_vector(7 downto 0);signal alarm_h_out:std_logic_vector(7 downto

13、 0);begin-元件声明adjust_control:adjusterport map(-输入时钟clk=clk,-双键位校时set=set,mode=mode,-计数使能,接vccen=vcc_con,-秒计数器进位输入s_enout=s_enout,-分计数器进位输入m_enout=m_enout,-输出信号clk1hz=clk1hz,-输出使能s_ce=s_ce,m_ce=m_ce,h_ce=h_ce);vcc_conclk1hz,-计数使能,接vccen=s_ce,-进位输出enout=s_enout,-bcd输出low=sl,high=sh);m_control:cnt60por

14、t map(-输入1hz时钟clk1hz=clk1hz,-计数使能en=m_ce,-进位输出enout=m_enout,-bcd输出low=ml,high=mh);h_control:cnt24port map(-输入1hz时钟clk1hz=clk1hz,-计数使能en=h_ce,-bcd输出low=hl,high=hh);alarm_clock:alarmport map(-输入时钟clk=clk,-设定闹钟alarm_set=alarm_set,-bcd输入 in_hl=hl,in_hh=hh,in_ml=ml,in_mh=mh,-bcd输出low=alarm_low,high=alarm

15、_high,-led输出led_out=led_out);sl_dis:displayport map(-bcd输入in_data=sl,-八段译码输出out_data=sl_out);sh_dis:displayport map(-bcd输入in_data=sh,-八段译码输出out_data=sh_out);ml_dis:displayport map(-bcd输入in_data=ml,-八段译码输出out_data=ml_out);mh_dis:displayport map(-bcd输入in_data=mh,-八段译码输出out_data=mh_out);hl_dis:displayp

16、ort map(-bcd输入in_data=hl,-八段译码输出out_data=hl_out);hh_dis:displayport map(-bcd输入in_data=hh,-八段译码输出out_data=hh_out);alarm_l_dis:displayport map(-bcd输入in_data=alarm_low,-八段译码输出out_data=alarm_l_out);alarm_h_dis:displayport map(-bcd输入in_data=alarm_high,-八段译码输出out_data=alarm_h_out);saopingqi:saopingport ma

17、p(-bcd输入sl=sl_out,sh=sh_out,ml=ml_out,mh=mh_out,hl=hl_out,hh=hh_out,alarm_l=alarm_l_out,alarm_h=alarm_h_out,-选择显示方式chg=chg,-输入时钟clk=clk,-输出片选seg=seg_out,-bcd输出out_data=out_data);end example;仿真结果如下:该顶层文件原理图如下:系统实验实验结果如下:五、程序设计:1、校时模块:采用的是双键校时法,mode和set,其中mode选择需要调整的部分:时钟、分钟、秒钟,而set则作为调整脉冲。校时模块的核心思想是利

18、用一个计数器con来作为状态机,con=0时为正常工作状态,con=1时为调整秒钟状态,con=2时为调整分钟状态,con=3时为调整时钟状态。调整的时候,利用set代替clk1hz作为计数器输入脉冲,相当于按一次set则被调整的计数器中的当前值+1,由此获得一个数字钟的时间设定效果。校时模块同时还具有控制时钟、分钟、秒钟计数器工作的功能,通过两个进位输入端以及三个使能控制端让时钟、分钟、秒钟计数器能够有序工作。比如,当秒钟计数器产生一个进位输入校时模块后,校时模块才通过使能输出端令分钟计数器工作一下,以此类推控制分钟、时钟之间的有序工作。元件视图如下:源程序如下:-adjuster.vhdl

19、ibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity adjuster isport(-输入时钟clk:in std_logic;-双键位校时set:in std_logic;mode:in std_logic;-计数使能,接vccen:in std_logic;-秒计数器进位输入s_enout:in std_logic;-分计数器进位输入m_enout:in std_logic;-输出1hz时钟clk1hz:out std_logi

20、c;-输出使能s_ce:out std_logic;m_ce:out std_logic;h_ce:out std_logic);end adjuster;architecture example of adjuster issignal sel :std_logic;signal sce_r:std_logic;signal mce_r:std_logic;signal hce_r:std_logic;signal con:integer range 0 to 3 :=0;signal clkcon1:integer range 0 to 5000;signal clkcon2:intege

21、r range 0 to 10000;signal outclk:std_logic;signal outclk_temp:std_logic;begin-变频为1hzclk1_proc:process(clk)begin if clkevent and clk=0 then if clkcon1=5000 thenclkcon1=0;outclk_temp=0;elseclkcon1=clkcon1+1;outclk_temp=1;else if;end if;end process;clk2_proc:process(outclk_temp)begin if outclk_tempeven

22、t and outclk_temp=0 then if clkcon2=10000 thenclkcon2=0;outclk=0;elseclkcon2=clkcon2+1;outclk=1;end if;end if;end process;-模为4的计数器cnt:process(mode,set)beginif modeevent and mode=0 then if con=3 thencon=0;elseconsel=1;sce_r=0;mce_r=0;hce_rsel=0;sce_r=1;mce_r=0;hce_rsel=0;sce_r=0;mce_r=1;hce_rsel=0;sc

23、e_r=0;mce_r=0;hce_rs_ce=sce_r;m_ce=mce_r;h_ce=hce_r;clk1hzs_ce=en;m_ce=s_enout;h_ce=m_enout;clk1hz=outclk;end case;end process;end example;2、计时模块:(1)60进制计时模块:利用计数器的方法设制一个60进制计数器,并设置个进位输出端和个位、十位的bcd即时输出端,其中bcd即时输出端连接bcd译码模块进行转换数码管程序所需的驱动译码。元件视图如下:源程序如下:-cnt60.vhdlibrary ieee;use ieee.std_logic_1164.a

24、ll;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity cnt60 isport(-输入1hz时钟clk1hz:in std_logic;-计数使能en:in std_logic;-进位输出enout:out std_logic;-bcd输出low:out std_logic_vector(3 downto 0);high:out std_logic_vector(3 downto 0);end cnt60;architecture example of cnt60 issignal low_r:std_lo

25、gic_vector(3 downto 0):=0000;signal high_r:std_logic_vector(3 downto 0):=0000;begin-个位计数low_proc:process(clk1hz,en)beginif clk1hzevent and clk1hz=0 thenif en=1 thenif low_r=1001 thenlow_r=0000;elselow_r=low_r+0001;end if;end if;end if;end process;low=low_r;-十位计数high_proc:process(clk1hz,en)beginif cl

26、k1hzevent and clk1hz=0 thenif en=1 thenif low_r=1001 thenif high_r=0101 thenhigh_r=0000;elsehigh_r=high_r+0001;end if;end if;end if;end if;end process;high=high_r;-计数值为59时,进位输出enout=1 when low_r=1001 and high_r=0101 else 0;end example;(2)24进制计数模块:利用计数器的方法设制一个24进制计数器,并设置、个位、十位的bcd即时输出端,其中bcd即时输出端连接bc

27、d译码模块进行转换数码管程序所需的驱动译码。元件视图如下:源程序如下:-cnt24.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity cnt24 isport(-输入1hz时钟clk1hz:in std_logic;-计数使能en:in std_logic;-bcd输出low:out std_logic_vector(3 downto 0);high:out std_logic_vector(3 downto 0);end

28、 cnt24;architecture example of cnt24 issignal low_r:std_logic_vector(3 downto 0):=0000;signal high_r:std_logic_vector(3 downto 0):=0000;signal clr:std_logic:=0;begin-个位计数low_proc:process(clk1hz,en,clr)beginif clk1hzevent and clk1hz=0 thenif en=1 thenif low_r=1001 or clr=1 thenlow_r=0000;elselow_r=lo

29、w_r+0001;end if;end if;end if;end process;low=low_r;-十位计数high_proc:process(clk1hz,en,clr)beginif clk1hzevent and clk1hz=0 thenif en=1 thenif clr=1 thenhigh_r=0000;elsif low_r=1001 thenhigh_r=high_r+0001;end if;end if;end if;end process;high=high_r;-计数值为23时,清零clr=1 when low_r=0011 and high_r=0010 els

30、e 0;end example;3、闹钟模块:该数字钟具有可设置整点闹钟功能,当达到闹钟设定时间时,led灯会自动闪烁表示警告闹钟时间已到,闪烁时间为一分钟,一分钟之后自动停止。闹钟的核心思想是,从时钟计时模块以及分钟计时模块的bcd码即时出去与闹钟模块中的计数器所设的值(也就是设定的时间)进行比较。由于该闹钟为整点闹钟,只能进行整点警告,利用alarm_set按钮进行设定,每按一次,送给闹钟元件里面的计数器一个脉冲令设定的时间在原有的时间上加一小时。当比较结果完全相同时,led输出端输出10hz的脉冲到led中令led显示闪烁状态,达到警告目的。元件视图如下:源程序如下:-alarm.vhl

31、ibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity alarm isport(-输入时钟clk:in std_logic;-设定闹钟alarm_set:in std_logic;-bcd输入 in_hl:in std_logic_vector(3 downto 0);in_hh:in std_logic_vector(3 downto 0);in_ml:in std_logic_vector(3 downto 0);in_mh:in

32、 std_logic_vector(3 downto 0);-bcd输出low:out std_logic_vector(3 downto 0);high:out std_logic_vector(3 downto 0);-led输出led_out:out std_logic);end alarm;architecture example of alarm issignal clkcon1:integer range 0 to 5000;signal clkcon2:integer range 0 to 1000;signal clk50khz:std_logic;signal clk10hz

33、:std_logic;signal low_r:std_logic_vector(3 downto 0):=0000;signal high_r:std_logic_vector(3 downto 0):=0000;signal led_con:integer range 0 to 1;signal clr:std_logic:=0;begin-变频为10hzclkcon1_proc:process(clk)begin if clkevent and clk=0 then if clkcon1=5000 thenclkcon1=0;clk50khz=0;elseclkcon1=clkcon1+

34、1;clk50khz=1;end if;end if;end process;clkcon2_proc:process(clk50khz)begin if clk50khzevent and clk50khz=0 then if clkcon2=1000 thenclkcon2=0;clk10hz=1;elseclkcon2=clkcon2+1;clk10hz=0;end if;end if;end process;-设定闹钟个位low_proc:process(alarm_set,clr)beginif alarm_setevent and alarm_set=0 thenif low_r=

35、1001 or clr=1 thenlow_r=0000;elselow_r=low_r+0001;end if;end if;end process;low=low_r;-设定闹钟十位high_proc:process(alarm_set,clr)beginif alarm_setevent and alarm_set=0 thenif clr=1 thenhigh_r=0000;elsif low_r=1001 thenhigh_r=high_r+0001;end if;end if;end process;high=high_r;-计数值为23时,清零clr=1 when low_r=0

36、011 and high_r=0010 else 0;-响应判定alarm_proc:process(in_hl,in_hh,in_ml,in_mh)beginif low_r=in_hl and high_r=in_hh thenif in_ml=0000 and in_mh=0000 thenled_con=0;elseled_conled_outled_outout_dataout_dataout_dataout_dataout_dataout_dataout_dataout_dataout_dataout_dataout_data=00000000;end case;end proce

37、ss;end example;(2)扫频输出模块:该fpga板只有一个数码管驱动端而有四个数码管,所以需要利用利用片选高速扫屏的方法进行显示。当一个数码管的亮灭频率到达100hz以上时,由于人眼的视觉暂留功能,并不会感觉到它出现了亮灭的变化。在该模块中令扫屏频率也就是亮灭频率为1kzh。该模块同样还有一个功能是切换分秒/时分/闹钟的显示,通过chg按钮进行。在以下程序中,利用一个模为3的计数器chg_con作为状态机,每按下一次chg按钮,chg_con自动增一。当chg_con=0时,显示分秒;chg_con=1时,显示时分;chg_con=2时,显示闹钟。为了区别闹钟与正常计时区别,在这里

38、闹钟的时钟与分钟之间没有亮“点”间隔。元件视图如下:源程序如下:-saoping.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity saoping is port(-选择显示方式chg:in std_logic;-bcd输入sl:in std_logic_vector(7 downto 0);sh:in std_logic_vector(7 downto 0);ml:in std_logic_vector(7 downto

39、 0);mh:in std_logic_vector(7 downto 0);hl:in std_logic_vector(7 downto 0);hh:in std_logic_vector(7 downto 0);alarm_l:in std_logic_vector(7 downto 0);alarm_h:in std_logic_vector(7 downto 0);-输入时钟clk:in std_logic;-输出片选seg:out std_logic_vector(3 downto 0);-bcd输出out_data:out std_logic_vector(7 downto 0);end saoping;architecture example of sa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论