《课程设计(论文)实验报告基于vhdl的数字钟设计.doc》由会员分享,可在线阅读,更多相关《课程设计(论文)实验报告基于vhdl的数字钟设计.doc(18页珍藏版)》请在三一办公上搜索。
1、本科实验报告题目:数字钟课程名称: 学院(系): 专 业: 班 级: 学生姓名: 学 号: 完成日期: 成 绩: 2011 年 12 月 12 日题目:数字钟1 设计要求系统功能: 1.计时,数码管显示的时、分、秒的十进制数字显示(小时从0023)计时器2.星期,lcd1602显示星期:MON/TUE/WEN/THU/FRI/SAT/SUN3.校准,具有手动校星期、校时、校分、校秒的功能。4.秒表,显示1%秒、60秒,60分,能手动开始和停止5.闹钟,能在设定的时间发出闹铃声。6.整点报时,即从59分55秒起,每隔1秒钟发出一次低音“嘟”的信号,连续2次,最后一次为高音“嘀”的信号,此信号结束
2、即达到整点,发音的同时伴有led闪烁。7.倒计时,能在设定的时间开始倒计时,至0时0分0秒停止2 设计分析及系统方案设计一设计分析:依据功能要求,程序分为:1. 计时与校准模块 计时:秒钟计数到59后清零并向分钟进一位,分钟计数到59后清零并向时钟进一位,时钟计数到23后清零并向星期进一位,星期按照MON/TUE/WEN/THU/FRI/SAT/SUN循环变化 校准:使用k1/k0两个功能键,k1切换要改变的位,k0校正2. 数码管显示模块 显示译码 利用k3切换显示内容,根据不同模式关闭用不到的数码管。3. lcd显示模块定义七个常量数组,数组内容分别为MON/TUE/WEN/THU/FRI
3、/SAT/SUN的ASC 码。液晶初始化液晶显示,将相应字母的ASC码写入ddram的相应地址中,由cnt1值决定地址, cnt1由0到2循环,因此用到lcd开始的前三个位显示字符。由星期(m)值决定写入内容,m值不同,cnt1扫描显示的就是不同的数组。4. 闹钟与整点报时模块 整点报时:利用分频得到1k和0.5k的频率,当分钟位到达59,秒钟位为55、57时,将0.5k频率接到输出引脚,秒钟位为59时,将1k频率接到输出引脚。 闹钟:到达闹钟时间,将1k频率接到输出引脚,时长3秒 Led闪烁:将led输出引脚连接至频率输出引脚即可(设为inout)5. 秒表模块 开启显示1%秒、60秒、60
4、分的数码管。显示小时的数码管关闭 手动开始和停止,停止时显示计时终止时间6. 倒计时模块 显示小时、分钟,秒。显示毫秒的数码管关闭。 可以利用k2切换倒计时与设置倒计时时间状态,利用k1与k0设置倒计时时间。 至0时0分0秒倒计时终止,此时自动切换至时间设置状态。二系统总体结果框图:50MHZ计时与校准闹钟与整点报时秒表倒计时计时校准闹钟整点报时设置闹钟时间时间到闹钟响Key1切换校准位Key0校准数码管显示LCD显示星期Key3切换模式Key2切换状态Key3切换状态分频器3系统以及模块硬件电路设计数码管(图中只有1个,共用8个):数码管共阴极,故输入低电平管亮 开关(4个全用):按键按下时
5、为低电平发光二极管(全部使用):引脚为高电平时led亮DE2开发板上使用的元件的管脚编号:接口名称类型引脚号说明bsBidirPIN_K19蜂鸣器clkInputPIN_N250mhz时钟k0InputPIN_G26控制按键k1InputPIN_N23k2InputPIN_P23k3InputPIN_W26lcd_blonOutputPIN_K2lcd背光灯LCD_Data0OutputPIN_J1lcd数据输入LCD_Data1OutputPIN_J2LCD_Data2OutputPIN_H1LCD_Data3OutputPIN_H2LCD_Data4OutputPIN_J4LCD_Data
6、5OutputPIN_J3LCD_Data6OutputPIN_H4LCD_Data7OutputPIN_H3LCD_ENOutputPIN_K3lcd使能lcd_onOutputPIN_L4lcd开启lcd_rsOutputPIN_K1寄存器选择信号ResetinputPIN_N25lcd复位LCD_RWOutputPIN_K4液晶读写信号led0OutputPIN_AE23整点报时及闹钟显示led1OutputPIN_AF23led2OutputPIN_AB21led3OutputPIN_AC22led4OutputPIN_AD22led5OutputPIN_AD23led6OutputP
7、IN_AD21led7OutputPIN_AC21led8OutputPIN_AA14led9OutputPIN_Y13led10OutputPIN_AA13led11OutputPIN_AC14led12OutputPIN_AD15led13OutputPIN_AE15led14OutputPIN_AF13led15OutputPIN_AE13led16OutputPIN_AE12led17OutputPIN_AD12led18OutputPIN_AE22led19OutputPIN_AF22led20OutputPIN_W19led21OutputPIN_V18led22OutputPIN
8、_U18led23OutputPIN_U17led24OutputPIN_AA20led25OutputPIN_Y18mbp0OutputPIN_V20秒表高位mbp1OutputPIN_V21mbp2OutputPIN_W21mbp3OutputPIN_Y22mbp4OutputPIN_AA24mbp5OutputPIN_AA23mbp6OutputPIN_AB24mbq0OutputPIN_AF10秒表低位mbq1OutputPIN_AB12mbq2OutputPIN_AC12mbq3OutputPIN_AD11mbq4OutputPIN_AE11mbq5OutputPIN_V14mbq6
9、OutputPIN_V13mp0OutputPIN_T2分高位mp1OutputPIN_P6mp2OutputPIN_P7mp3OutputPIN_T9mp4OutputPIN_R5mp5OutputPIN_R4mp6OutputPIN_R3mq0OutputPIN_U9分低位mq1OutputPIN_U1mq2OutputPIN_U2mq3OutputPIN_T4mq4OutputPIN_R7mq5OutputPIN_R6mq6OutputPIN_T3p0OutputPIN_Y23秒高位p1OutputPIN_AA25p2OutputPIN_AA26p3OutputPIN_Y26p4Outp
10、utPIN_Y25p5OutputPIN_U22p6OutputPIN_W24q0OutputPIN_AB23秒低位q1OutputPIN_V22q2OutputPIN_AC25q3OutputPIN_AC26q4OutputPIN_AB26q5OutputPIN_AB25q6OutputPIN_Y24hp0OutputPIN_L3时高位hp1OutputPIN_L2hp2OutputPIN_L9hp3OutputPIN_L6hp4OutputPIN_L7hp5OutputPIN_P9hp6OutputPIN_N9hq0OutputPIN_R2时低位hq1OutputPIN_P4hq2Outp
11、utPIN_P3hq3OutputPIN_M2hq4OutputPIN_M3hq5OutputPIN_M5hq6OutputPIN_M44 系统的VHDL设计VHDL语言源代码VHDL语言源代码:clock.vhd:ieee.std_logic_arith.all;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity clock isport(clk:in std_logic; led:out std_logic_vector(25 downto 0); k0: in std_logic;
12、 k1: in std_logic; k2: in std_logic; k3: in std_logic; bs: inout std_logic;-整点报时及闹钟 mbp,mbq,p,q,mp,mq,hp,hq:out std_logic_vector(6 downto 0);-p高q低 reset : in std_logic; lcd_rs : out std_logic; -寄存器选择信号 LCD_RW : out std_logic; -液晶读写信号 LCD_EN : out std_logic; -液晶时钟信号 lcd_on : out std_logic; lcd_blon:o
13、ut std_logic; LCD_Data : out std_logic_vector(7 downto 0); -液晶数据信号end;architecture a of clock iscomponent segport(inp:in integer range 0 to 10;outp:out std_logic_vector(6 downto 0);end component;component lcdPort ( CLK : in std_logic; -状态机时钟信号,同时也是液晶时钟信号 m : in integer range 1 to 7;-显示的星期转换Reset : i
14、n std_logic; LCD_RS : out std_logic; -寄存器选择信号 LCD_RW : out std_logic; -液晶读写信号 LCD_EN : out std_logic; -液晶时钟信号lcd_on : out std_logic;lcd_blon:out std_logic; LCD_Data : out std_logic_vector(7 downto 0); -液晶数据信号end component;component rem1Port ( rint:in integer range 0 to 99; ri:inout integer range 0 t
15、o 10);end component;signal cp:std_logic;-0.01秒signal state:std_logic_vector(1 downto 0);-状态:00:计时与校准;01:秒表;10:闹钟;11:倒计时signal jjstate:std_logic;-状态:0:计时;1:校准signal dstate:std_logic;-倒计时状态:1:倒计时;0:设置时间signal djzstate:std_logic_vector(1 downto 0);-倒计时设置位的状态signal mbi,mbj,i,j,mi,mj,hi,hj:integer range
16、0 to 10;-i高j低signal hour,min,sec:integer range 0 to 99;-计时signal mbnum,mbsec,mbmin:integer range 0 to 99;-秒表signal dhour,dmin,dsec:integer range 0 to 99;-倒计时signal mod_dsec,mod_dmin,mod_dhour,mod_mbnum,mod_mbsec,mod_mbmin,mod_nzhour,mod_nzmin1,mod_nzmin,mod_sec,mod_min,mod_hour:integer range 0 to 10
17、;-取高位值signal nzhour,nzmin:integer range 0 to 59;-闹钟signal week:integer range 1 to 7;-星期signal week1:integer range 1 to 7;-更改星期中间变量signal jzstate:std_logic_vector(1 downto 0);-计时设置位的状态signal change_dstate:std_logic;-倒计时至0自动改变至设置状态beginprocess(clk) variable num:integer range 0 to 499999; begin if risi
18、ng_edge(clk) then if num=499999 then cp=1;num:=0; else cp=0;num:=num+1; end if; end if; end process;process(bs)-控制led闪烁begin if bs=1 then led=10101010101010101010101010; else led=00000000000000000000000000; end if;end process;process(state,k2)begin if rising_edge(k2) then if state=11 then if dstate=
19、1 then dstate=0; else dstatedjzstatedjzstatedjzstatedjzstate=00; end case; end if; end if; end if;end process; process(dhour,dmin,dsec)begin if dhour=0 and dmin=0 and dsec=0 then change_dstate=1; else change_dstate=0; end if;end process; process(cp,state,dstate,djzstate,k0)-倒计时variable dnum1:integer
20、 range 0 to 99;variable dnum2:integer range 0 to 29;begin if rising_edge(cp) then if state=11 then if dstate=1 and change_dstate=0 then- if dnum1=99 then dnum1:=0; if dsec=0 then dsec=59; if dmin=0 then dmin=59; if dhour=0 then dhour=23; else dhour=dhour-1; end if; else dmin=dmin-1; end if; else dse
21、c if dnum2=10 then dnum2:=0; if dhour=23 then dhour=0; else dhour-分校准 if dnum2=10 then dnum2:=0;if dmin=59 then dmin=0; if dhour=23 thendhour=0; else dhour=dhour+1; end if; else dmin-秒校准 if dnum2=10 then dnum2:=0; if dsec=59 thendsec=0;if dmin=59 then dmin=0; if dhour=23 thendhour=0; else dhour=dhou
22、r+1; end if; else dmin=dmin+1; end if; else dsecnull;end case;end if;end if;end if;end if;end process; process(k1,state,jjstate)begin if rising_edge(k1) then if state=00 then if jjstate=1 then case jzstate is when 00=jzstatejzstatejzstatejzstatejzstatestatestatestatestatestatejjstatejjstatejjstate=0
23、; end case; end if; end if;end process;process(cp,state)-闹钟variable set:std_logic;variable set1:std_logic; begin if rising_edge(cp) then if state=10 then if k2=0 then if set=0 then set:=1; if nzhour=23 then nzhour=0; else nzhour=nzhour+1; end if; end if; else set:=0; if k1=0 then if set1=0 then set1
24、:=1; if nzmin=59 then nzmin=0; else nzmin=nzmin+1; end if; end if; else set1:=0; end if; end if; end if;end if;end process; process(cp,state)-秒表计时variable mbkey :std_logic;begin if rising_edge(cp) then if state=01 then if k2=0 then mbnum=0;mbsec=0;mbmin=0; mbkey:=1; end if; if k1=0 then mbkey:=0; en
25、d if; if mbkey=1 then if mbnum=99 then mbnum=0; if mbsec=59 then mbsec=0; if mbmin=59 then mbmin=0; else mbmin=mbmin+1; end if; else mbsec=mbsec+1; end if; else mbnum=mbnum+1; end if; end if; end if; end if;end process;process(sec,min,hour,state,mbnum,mbsec,mbmin,nzhour,nzmin)-显示每一位值begin if state=0
26、1 then-秒表 mbi=mod_mbnum; mbj=mbnum rem 10; i=mod_mbsec; j=mbsec rem 10; mi=mod_mbmin; mj=mbmin rem 10; hi= 10; hj= 10; elsif state=10 then-闹钟 hi=mod_nzhour; hj=nzhour rem 10; mi=mod_nzmin1; mj=nzmin rem 10; mbi=10; mbj=10; i=10; j=10; elsif state=11 then i=mod_dsec; j=dsec rem 10; mi=mod_dmin; mj=dm
27、in rem 10; hi=mod_dhour; hj=dhour rem 10; mbi=10; mbj=10; else-计时校准 i=mod_sec; j=sec rem 10; mi=mod_min; mj=min rem 10; hi=mod_hour; hj=hour rem 10; mbi=10; mbj if num2=29 then num2:=0; if week=7 then week=1; else week if num2=29 then num2:=0; if hour=23 then hour=0; if week=7 then week=1; else week
28、=week+1; end if; else hour-分校准 if num2=10 then num2:=0;if min=59 then min=0; if hour=23 thenhour=0; else hour=hour+1; end if; else min-秒校准 if num2=10 then num2:=0; if sec=59 thensec=0;if min=59 then min=0; if hour=23 thenhour=0; else hour=hour+1; end if; else min=min+1; end if; else secnull;end case
29、;end if;- else-计时 if num1=99 then num1:=0; if sec=59 thensec=0;if min=59 then min=0; if hour=23 thenhour=0; if week=7 then week=1; else week=week+1; end if; else hour=hour+1; end if; else min=min+1; end if; else sec=sec+1; end if; else num1:=num1+1; end if;end if;end if;end process;process(clk,sec,m
30、in,dhour,dmin,dsec)-整点报时与闹钟variable num3:integer range 0 to 24999;variable num4:integer range 0 to 2;variable bs1,bs2:std_logic; begin if rising_edge(clk) then if num3=24999 then num3:=0;bs1:=not bs1; if bs1=1 then bs2:=not bs2; end if; if min=59 then if sec=55 or sec=57 then bs=bs2; elsif sec=59 th
31、en bs=bs1; else bs=0; end if; end if; if hour=nzhour and min=nzmin and sec=3 then bs=bs1; elsif min=59 then if sec=55 or sec=57 then bs=bs2; elsif sec=59 then bs=bs1; elsif dhour=0 and dmin=0 and dsec=1 then bs=bs2; else bs=0; end if; end if; else num3:=num3+1; end if; end if;end process;end a;seg.vhd:library ieee;use ieee.std_logic_1164.all;entity seg is-显示译码port(inp:in integer range 0 to 10;outp:out std_logic_vector(6 downto 0);end;architecture conve