实验报告-基于vhdl的数字钟设计_第1页
实验报告-基于vhdl的数字钟设计_第2页
实验报告-基于vhdl的数字钟设计_第3页
实验报告-基于vhdl的数字钟设计_第4页
实验报告-基于vhdl的数字钟设计_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

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 ; begin if rising_edg

18、e(clk) then if num= 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=1010; else led=0000; end if;end process;process(state,k2)begin if rising_edge(k2) then if state=11 then if dstate=1 then dstate=0; else dstatedjzstatedjzstatedjzstatedjzs

19、tate=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 range 0 to 99;variable dnum2:integer range 0 to 29;begi

20、n 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 dsec if dnum2=10 then dnum2:=0; if dhour=23 then dhour=0; e

21、lse 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=dhour+1; end if; else dmin=dmin+1; end if; else dsecnull;end

22、 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; end case; end if; end if;end process;process(cp,state)

23、-闹钟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:=1; if nzmin=59 then nzmin=0; else nzmin=nzmin+1; end i

24、f; 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; end if; if mbkey=1 then if mbnum=99 then mbnum=0; if mbsec

25、=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=01 then-秒表 mbi=mod_mbnum; mbj=mbnum rem 10; i=mod_mbsec;

26、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=dmin rem 10; hi=mod_dhour; hj=dhour rem 10; mbi=10; mbj=10

27、; 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=week+1; end if; else hour-分校准 if num2=10 then num2:=0;i

28、f 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;end if;- else-计时 if num1=99 then num1:=0; if sec=59 the

29、nsec=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,min,dhour,dmin,dsec)-整点报时与闹钟variable num3:integer range 0

30、 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 then bs=bs1; else bs=0; end if; end if; if hour=nzhour and

31、 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 bsoutpoutpoutpoutpoutpoutpoutpoutpoutpoutp outp=; end case;end process;end convert;lcd.vhd:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use

32、 IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity lcd is Port ( CLK : in std_logic; -状态机时钟信号,同时也是液晶时钟信号,其周期应该满足液晶数据的建立时间 m : in integer range 1 to 7;Reset : in std_logic; LCD_RS : out std_logic; -寄存器选择信号 LCD_RW : out std_logic; -液晶读写信号 LCD_EN : out std_logic; -液晶时钟信号lcd_on : out std_l

33、ogic;lcd_blon:out std_logic; LCD_Data : out std_logic_vector(7 downto 0); -液晶数据信号end lcd;architecture Behavioral of lcd istype state is (set_dlnf,set_cursor,set_dcb,set_cgram,write_cgram,set_ddram,write_LCD_Data);signal Current_State:state;type ram1 is array(0 to 2) of std_logic_vector(7 downto 0);c

34、onstant cgram1 : ram1 :=(x4d,x4f,x4e);-mon-(x53,x41,x54);constant cgram2 : ram1 :=(x54,x55,x45);-tueconstant cgram3 : ram1 :=(x57,x45,x4e);-wenconstant cgram4 : ram1 :=(x54,x48,x55);-thuconstant cgram5 : ram1 :=(x46,x52,x49);-friconstant cgram6 : ram1 :=(x53,x41,x54);-satconstant cgram7 : ram1 :=(x5

35、3,x55,x4e);-sunsignal Clk_Out : std_logic;signal LCD_Clk : std_logic;beginprocess(CLK)-分频进程,CLK输入,CLK_Out输出,50MHz输入,1250Hz输出,0.8ms variable n1:integer range 0 to 19999; begin if rising_edge(CLK) then if n119999 then n1:=n1+1; else n1:=0; Clk_Out=not Clk_Out; end if; end if;end process;LCD_RW = 0 ; -

36、RW=0;写入设置LCD_EN = Clk_Out ; -用1250Hz作为LCD的使能,也作为LCD的时钟LCD_Clk = Clk_Out; -用1250Hz作为LCD的时钟lcd_on =1;lcd_blon=0;process(LCD_Clk,Reset,Current_State) -状态机控制显示variable cnt1: std_logic_vector(4 downto 0); begin if Reset=1 then Current_State=set_dlnf; - Reset就清屏,Reset接出用一个按钮作为复位按键即可,按下就为0复位。 cnt1:=11110; LCD_RS=0; elsif rising_edge(LCD_Clk) then Current_State = Current_State ; LCD_RS cnt1:=00000; LCD_Data=; - /*清除显示*/ 清屏指令 Current_State LCD_Data=; -/*设置8位格式,2行,5*7*/ Current_State LCD_Data=; -/*整体显示,关光标,不闪烁*/ Current_State LCD_Data=; Current_State if cnt1=00011 thencnt1:=00000;LCD_Data=; e

温馨提示

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

评论

0/150

提交评论