1、VHDL数字时钟实验报告VHDL数字时钟设计一、实验目的: 进一步练习VHDL语言设计工程的建立与仿真的步骤和方法、熟悉VHDL语言基本设计实体的编写方法。同时,在已有知识的基础上,简单综合编写程序,仿制简单器械。二、实验环境: PC个人计算机、Windows XP操作系统、Quartus II集成开发环境软件。三、设计要求: 运用VHDL语言编写一个数字钟,具体要求: 1. 具有时、分、秒计数的十进制数字显示功能,以24小时循环计时。 2. 具有手动调节小时,分钟的功能。 3. 具有闹钟的功能,能够在设定的闹钟时间发出闹铃声。四、实验步骤: 1. 定义输入输出信号量 port( clk:in
2、 std_logic; -时钟 speak:out std_logic; -铃 dout:out std_logic_vector(7 downto 0); -晶体管显示 setclk:in std_logic_vector(2 downto 0); -操作按钮 d1,d2,d3,d4,d5,d6: out std_logic); -六个晶体管 2. 定义结构体中的信号量 signal sel:std_logic_vector(2 downto 0); signal hou1:std_logic_vector(3 downto 0); -时分秒的个位和十位 signal hou2:std_lo
3、gic_vector(3 downto 0); signal min1:std_logic_vector(3 downto 0); signal min2:std_logic_vector(3 downto 0); signal seth1:std_logic_vector(3 downto 0); signal seth2:std_logic_vector(3 downto 0); signal setm1:std_logic_vector(3 downto 0); signal setm2:std_logic_vector(3 downto 0); signal sec1:std_logi
4、c_vector(3 downto 0); signal sec2:std_logic_vector(3 downto 0); signal h1:std_logic_vector(3 downto 0); signal h2:std_logic_vector(3 downto 0); signal m1:std_logic_vector(3 downto 0); signal m2:std_logic_vector(3 downto 0); signal s1:std_logic_vector(3 downto 0); signal s2:std_logic_vector(3 downto
5、0); signal sph1,sph2,spm1,spm2,sps1,sps2:std_logic_vector(3 downto 0); signal count_sec:std_logic_vector(9 downto 0); signal sec_co :std_logic; signal co1,co2,co3,co4:std_logic; -进位 signal switch :std_logic_vector(1 downto 0); -表示状态 3. 分频模块 用来定义秒count_sec用来计时钟个数,当count_sec=1111111111时,及得到1Hz信号。代码如下:
6、 process (clk) is -define a second begin if(clkevent and clk=1)then if(count_sec=1111111111)then count_sec=0000000000; sec_co=1; else count_sec=count_sec+1; sec_co=0; end if; end if; end process; 4时钟正常走时模块该模块使用6个进程实现,分别为秒个位计时、秒十位计时、分个位计时、分十位计时、时个位计时、时十位计时。 process(sec_co) is -秒个位 begin if switch=00
7、then -正常状态 if sec_co=1 then if sec2=1001 then sec2=0000; co1=1; else sec2=sec2+1; co1=0; end if; end if; elsif switch=01 then -调时状态 sec2=0000; end if; end process; - process (co1) is -秒十位 begin if switch=00 then if co1event and co1=1 then if (sec1=0101)then sec1=0000; co2=1; else sec1=sec1+1; co2=0;
8、 end if; end if; elsif switch=01 then sec1=0000; end if; end process; - process (co1,co2) is -分钟个位 begin if switch=00 then if co2event and co2=1 then if min2=1001 then min2=0000; co3=1; else min2=min2+1; co3=0; end if; end if; elsif switch=01 then min2=setm2; end if; end process; - process (co3) is
9、-分钟十位 begin if switch=00 then if co3=1 then if min1=0101 then min1=0000; co4=1; else min1=min1+1; co4=0; end if; end if; elsif switch=01 then min1=setm1; end if; end process; - process(co4) -小时 begin if switch=00 then if co4=1 then if (hou1=0010) then -小时十位为2时,个位满3进一 if(hou2=0011)then hou2=0000; hou
10、1=0000; else hou2=hou2+1; end if; else -小时十位为0或1,个位满9进一 if(hou2=1001)then hou2=0000; hou1=hou1+1; else hou2=hou2+1; end if; end if; end if; elsif switch=01 then hou1=seth1; hou2=seth2; end if; end process; 5调时模块 该进程用来控制时钟状态,switch为“00”时正常显示时间,为“01”时是进行调时, 为“10”时是设置闹钟时间。代码如下: process (setclk(0) is be
11、gin if(setclk(0)event and setclk(0)=1)then if(switch=10)then switch=00; else switch=switch+1; end if; end if; end process; process (setclk(2),switch,setclk(1) is begin -setclk(1)为1调分 if(switch=01 and setclk(1)=1)then if(setclk(2)event and setclk(2)=1)then if(setm2=1001)then setm2=0000; if(setm1=0101
12、)then setm1=0000; else setm1=setm1+1; end if; else setm2=setm2+1; end if; end if; end if; end process; process (setclk(2),switch,setclk(1) is begin -setclk(1)为0调时 if(switch=01 and setclk(1)=0)then if(setclk(2)event and setclk(2)=1)then if(seth1=0010)then if(seth2=0011)then seth1=0000; seth2=0000; el
13、se seth2=seth2+1; end if; else if(seth2=1001)then seth1=seth1+1; seth2=0000; else seth2=seth2+1; end if; end if; end if; end if; end process; 6闹钟模块该模块由3个小模块组成,分别为设置闹钟时间、判断闹钟时间是否到达以及闹铃声音模块。 (1)设置闹钟时间模块 该进程用于设置闹钟时间。信号量switch为10时,表示设置闹钟时间; if(switch=10)then -调闹钟时,显示闹钟设置时间 if sel=000 then d1doutdoutdout
14、dout=XXXXXXXX; end case; elsif sel=001 then d2doutdoutdoutdoutdoutdoutdoutdoutdoutdoutdout=XXXXXXXX; end case; elsif sel=010 then d3doutdoutdoutdoutdoutdoutdout=XXXXXXXX; end case; elsif sel=011 then d4doutdoutdoutdoutdoutdoutdoutdoutdoutdoutdout=XXXXXXXX; end case; elsif sel=100 then d5doutdoutdout
15、doutdoutdoutdout=XXXXXXXX; end case; elsif sel=101 then d6doutdoutdoutdoutdoutdoutdoutdoutdoutdoutdout=XXXXXXXX; end case; end if; (2)闹铃声音模块通过分频产生蜂鸣,即发出闹铃声音。 process (switch) is -闹铃 begin -设置闹铃时秒归零 if switch=10 then sps1=0000; sps2=0000; end if; end process; process (switch,setclk(2),setclk(1) is be
16、gin if(switch=10 and setclk(1)=1)then if(setclk(2)event and setclk(2)=1)then if(spm2=1001)then spm2=0000; if(spm1=0101)then spm1=0000; else spm1=spm1+1; end if; else spm2=spm2+1; end if; end if; end if; end process; process (switch,setclk(2),setclk(1) is begin if(switch=10 and setclk(1)=0)then if(se
17、tclk(2)event and setclk(2)=1)then if(sph1=0010)then if(sph2=0011)then sph1=0000; sph2=0000; else sph2=sph2+1; end if; else if(sph2=1001)then sph2=0000; sph1=sph1+1; else sph2=sph2+1; end if; end if; end if; end if; end process; process (clk,sph1,sph2,spm1,spm2,hou1,hou2,min1,min2) is begin if(sph1=h
18、ou1 and sph2=hou2 and spm1=min1 and spm2=min2)then speak=clk; else speak=0; end if; end process; 7数码管显示模块 (1)选择时间显示 process(key1,key2,change) begin if(key1=0)and(key2=0)then sec_0=sec_00; sec_1=sec_11; min_0=min_00; min_1=min_11; hour_1=hour_11; hour_0=hour_00; elsif(key1=1)and(key2=0)then sec_0=sec
19、_000; sec_1=sec_111; min_0=min_000; min_1=min_111; hour_0=hour_000; hour_1=hour_111; elsif(key1=0)and(key2=1)then sec_0=sec_0000; sec_1=sec_1111; min_0=min_0000; min_1=min_1111; hour_0=hour_0000; hour_1=hour_1111; end if; end process;(2)数码管时间显示 if sel=000 then d1doutdoutdoutdout=XXXXXXXX; end case; elsif sel=001 then d2doutdoutdoutdoutdoutdoutdoutdoutdoutdoutdout=XXXXXXXX; end case; elsif sel=010 then d3doutdoutdoutdoutdoutdoutdout=XXXXXXXX; end case; elsif sel=011 then d4=0; case m2 is
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1