《毕业论文-基于VHDL的FPGA数字钟设计.doc》由会员分享,可在线阅读,更多相关《毕业论文-基于VHDL的FPGA数字钟设计.doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、SelectionParagraphFormatLineSpacingLinesToPointsSelectionParagraphFormatLineSpacingLinesToPointselectionParagraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaphFormatLineSpacingLinesToPointsSelectionParagraphFormatLineSpacingLinesTSelectionParbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
2、agraphFoLineSpacingLinesToPointsSelectionParagraphFormatLineSpacingLinesToPointse11111111111111111111111111111111lectionParagraphFormatLineSpacingLinesToPointsSelectionParagraphFormatLineSpacingLinesToPoctionParagraphFormatLineSpaci2222222222222222222222ngLinesToPoints2SelectionParagraphFormatLineSp
3、acingLinesToPointsSelectionParagraphFormatLineSpacingLinesToPointselectionParagraphFccccccccccccccccccccccccccccccccccccccccccccccccccccccccormatLineSpacingLinesToPointsSelectionParagraphFormatLineSpacingLinesToPoctionParagraSelec可编程数字系统设计课程设计实验报告实验名称: 基于VHDL的数字钟设计 _所属课程: 可编程数字系统设计 可编程数字系统课程设计一、课程设计
4、目的: 熟悉EDA工具;掌握用VHDL语言进行数字系统设计的基本方法和过程。二、设计任务: 设计一数字钟,用数码管显示基本功能要求:(1) 可以分屏显示时、分、秒,可用数码管的小数点“.”代替时、分、秒的分隔符“:”,分屏显示是指由于数码管只有4个,不能同时显示时、分、秒,但可以只显示时、分,或只显示分、秒,通过按键来切换这两种显示方式。(2)可设置时钟的开始时间。设置时,相应的数码管要闪烁,指示当前设置的设置(内容)。(3)具有闹铃功能,可以设定闹铃时间。闹铃时间到,LED闪烁进行指示。三、设计原理:数字钟的逻辑框图如图1所示。它由校时部分、闹钟部分、计时部分、显示部分组成。振荡器产生稳定的
5、高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒钟计数器满60后向分计数器进位,分钟计数器满60后向小时计数器进位,时钟计数器按照“24归0”规律计数。计数器的输出分别经译码器送显示。当计时出现误差时或者到达另外一个时区时,可以用校时部分校时、校分、校秒。需要是用闹钟时,可以利用闹钟部分进行定时。 四、系统分析:根据数字钟的功能,我们可以将它的系统电路设计划分为四个部分:校时部分、闹钟部分、计时部分和显示部分。其中计时部分又划分为秒钟计时模块、分钟计时模块、时钟计时模块,显示部分又划分为BCD译码模块和扫屏输出模块。校时模块秒钟计时模块分钟计时模块时钟计时模块译码模块扫屏输
6、出闹钟模块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_LOGIC;MODE:IN STD_LOGIC;-选择显示方式CHG:IN STD_LOGIC;-八段译码输出out_data:OUT STD
7、_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;MODE:IN STD_LOGIC;-计数使能,接VCCEN:IN STD_LOGIC;-秒计数器进位输入S_ENOUT:IN STD_LOG
8、IC;-分计数器进位输入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_LOGIC;-BCD输出LOW:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);HIGH:OUT STD_LOGIC_VECTO
9、R(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 STD_LOGIC_VECTOR(3 DOWNTO 0);-八段译码输出out_data:OUT STD_LOGIC_VECTOR(7 DO
10、WNTO 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_VECTOR(7 DOWNTO 0);HH:IN STD_LOGIC_VECTOR(7 DOWNTO 0);ALARM_L:IN STD_L
11、OGIC_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;-设定闹钟ALARM_SET:IN STD_LOGIC;-BCD输入 IN_HL:IN STD_LOGIC_VECTOR(3 DOWNTO
12、 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);END COMPONENT;-常数说明CONSTANT VCC:STD_LOGIC:=1;-信号说明SIGNAL VCC_CON:STD_LOG
13、IC;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);SIGNAL ML:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL MH:STD_LOGIC_VECTOR(3 D
14、OWNTO 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 SH_OUT:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL ML_OUT:STD_LOGIC_VECTOR(7 D
15、OWNTO 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 0);BEGIN-元件声明ADJUST_CONTROL:adjusterPORT MAP(-输入时钟CLK=CLK,-双键位校时SET=S
16、ET,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:CNT60PORT MAP(-输入1HZ时钟CLK1HZ=CLK1HZ,-计数使能EN=M_CE,-进位输出ENOUT=M_ENOUT,-BCD输出LOW=
17、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_HIGH,-LED输出LED_OUT=LED_OUT);SL_DIS:displayPORT MAP(-BCD输入in_data=SL,-
18、八段译码输出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:displayPORT MAP(-BCD输入in_data=HL,-八段译码输出out_data=HL_OUT);HH_DIS:displayPORT MA
19、P(-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 MAP(-BCD输入SL=SL_OUT,SH=SH_OUT,ML=ML_OUT,MH=MH_OUT,HL=HL_OUT,HH=HH_OUT,AL
20、ARM_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则作为调整脉冲。校时模块的核心思想是利用一个计数器CON来作为状态机,CON=0时为正常工作状态,CON=1时为调整秒钟状态,CON=2时为调整分钟状态,CON=3时为调整时钟状
21、态。调整的时候,利用SET代替CLK1HZ作为计数器输入脉冲,相当于按一次SET则被调整的计数器中的当前值+1,由此获得一个数字钟的时间设定效果。校时模块同时还具有控制时钟、分钟、秒钟计数器工作的功能,通过两个进位输入端以及三个使能控制端让时钟、分钟、秒钟计数器能够有序工作。比如,当秒钟计数器产生一个进位输入校时模块后,校时模块才通过使能输出端令分钟计数器工作一下,以此类推控制分钟、时钟之间的有序工作。元件视图如下:源程序如下:-adjuster.vhdLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.AL
22、L;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_LOGIC;-输出使能S_CE:OUT STD_LOGIC;M_CE:OUT STD_LOGIC;H_CE:OUT STD_LOGIC);END a
23、djuster;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:INTEGER RANGE 0 to 10000;SIGNAL OUTCLK:STD_LOGIC;SIGNAL OUTCLK_TEMP:STD_LOGI
24、C;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_TEMPEVENT AND OUTCLK_TEMP=0 THEN IF CLKCON2=10000 THENCLKCON2=0;OUTCLK=0;ELSEC
25、LKCON2=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;SCE_R=0;MCE_R=0;HCE_RS_CE=SCE_R;M_CE=MCE_R;H_CE=HCE_R;CLK1HZS_CE=EN;M_CE
26、=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.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY
27、 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_LOGIC_VECTOR(3 DOWNTO 0):=0000;SIGNAL HIGH_R:STD_LOGIC_VECTOR(3 DOWNTO 0
28、):=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 CLK1HZEVENT AND CLK1HZ=0 THENIF EN=1 THENIF LOW_R=1001 THENIF HIGH_R=010
29、1 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即时输出端连接BCD译码模块进行转换数码管程序所需的驱动译码。元件视图如下:源程序如下:-CNT24.VHDLIBRARY IEEE;USE IEEE.STD
30、_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 CNT24;ARCHITECTURE EXAMPLE OF CNT24 ISSIGNAL LOW_R:STD_LOGIC_VECTOR(3
31、 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=LOW_R+0001;END IF;END IF;END IF;END PROCESS;LOW=LOW_R;-十位计数HIGH_PROC:PRO
32、CESS(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 ELSE 0;END EXAMPLE;3、闹钟模块:该数字钟具有可设置整点闹钟功能,当达到闹钟设定时间时,LED灯会自动闪烁表示警告闹钟时间已到,
33、闪烁时间为一分钟,一分钟之后自动停止。闹钟的核心思想是,从时钟计时模块以及分钟计时模块的BCD码即时出去与闹钟模块中的计数器所设的值(也就是设定的时间)进行比较。由于该闹钟为整点闹钟,只能进行整点警告,利用ALARM_SET按钮进行设定,每按一次,送给闹钟元件里面的计数器一个脉冲令设定的时间在原有的时间上加一小时。当比较结果完全相同时,LED输出端输出10HZ的脉冲到LED中令LED显示闪烁状态,达到警告目的。元件视图如下:源程序如下:-alarm.vhLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.AL
34、L;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 STD_LOGIC_VECTOR(3 DOWNTO 0);-BCD输出LOW:OUT STD_LOGIC_VECTOR(3 DOWNTO
35、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:std_logic;SIGNAL LOW_R:STD_LOGIC_VECTOR(3 DOWNTO 0):=0000;SIGNAL HIGH
36、_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+1;clk50khz=1;END IF;END IF;END PROCESS;clkcon2_proc:process(clk50khz)B
37、EGIN 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=1001 OR CLR=1 THENLOW_R=0000;ELSELOW_R=LOW_R+0001;END IF;END IF;END PR
38、OCESS;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=0011 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_OUT=0;END CASE;END PROCESS;END EXAMPLE;4、显示模块(1)BCD译码模块:利用共阳端数码管的性质以及其在显示“0-9”过程中的驱动程序可以获得该BCD译码模块。元件视图如下:源程序为:-display.vhdLIBRARY IEEE;USE IEEE.STD_