《基于VHDL电子时钟设计》由会员分享,可在线阅读,更多相关《基于VHDL电子时钟设计(37页珍藏版)》请在金锄头文库上搜索。
1、二、试验项目名称:基于vhdl语言的数码管时钟设计三、实验目的:利用FPGA开发板上的数码管,晶振等资源设计出能够显示时、分、 秒的时钟。 四、实验内容及原理:(一)、综述本实验目标是利用FPGA逻辑资源,编程设计实现一个数字电子时钟。实验环境为fpga开发板。电路设计采用VHDL硬件描述语言编程实现,开发软件为ise7.1i。(二)、模块框架设计计数时钟由模为60的秒计数器模块、模为60的分计数模块、模为24的小时计数器模块、此外还有最后的数码管显示模块。1. 综合计时模块 包括计时及进位两个进程,实现时钟逻辑功能。2. 显示模块 将时钟的每次变化所对应的时间及时输出到数码管上。实质为数码管
2、译码 器。 (三)、VHDL编程与仿真: 1、各个进程模块 以下三个process分别为分频,进位以及计时进程。分频进程用于统计CLK输入信号输出完整的1秒。进位进程控制60进制,60进制和24进制的进位关系。计时进程用于实现电子时钟的基本计时功能,即每秒均变化。-分频部分-process(clk,reset)beginif(reset=0)thencnt=0;elsif(clkevent and clk=1)thencnt=cnt+1;if(cnt=50000000)then -开发板晶振50M,统计到此时为1Scnt=0; end if;end if;end process;-进位共包括秒
3、个位向秒十位进位,秒十位向分个位进位,分个位向分十位进位,分十位向时个位进位,时个位向时十位进位。根据进位规则则可以实现从0时0分0秒到23时59分59秒之间任意时刻的显示。-各位的进位标志-process(clk,reset)beginif reset=0then jinwei=000000;elsif clkevent and clk=1then if dataout_buf(0)=9 then jinwei(0)=1; -9S时向秒十位进位- else jinwei(0)=0; end if; if(jinwei(0)=1and dataout_buf(1)=5)then jinwei(
4、1)=1; -59S时向分个位进位- else jinwei(1)=0; end if; if(jinwei(1)=1 and dataout_buf(3)=9)then jinwei(2)=1; -9分且秒十位进位时向分十位进位 else jinwei(2)=0; end if; if(jinwei(2)=1 and dataout_buf(4)=5)then jinwei(3)=1;-分十位为5且分个位进位时向时个位进位 else jinwei(3)=0; end if; if(jinwei(3)=1 and dataout_buf(6)=9)then jinwei(4)=1;-时个位为9
5、且分十位进位时向时十位进位 else jinwei(4)=0; end if; if(jinwei(4)=1 and dataout_buf(6)=2 and dataout_buf(7)=1)then jinwei(5)=1;-到12时且时个位进位时标记最高标记位 else jinwei(5)=0; end if; end if; end process;-计数进程,其进程逻辑上受分频输出与进位控制,当分频输出变化(即每秒),秒个位自加,当满足进位条件时,调用进位规则,进行时间的跳转。-计数-process(cnt,reset,dataout_buf,jinwei)beginif(reset
6、=0)thendataout_buf(0)=0;dataout_buf(1)=0;dataout_buf(2)=10;dataout_buf(3)=0;dataout_buf(4)=0;dataout_buf(5)=10;dataout_buf(6)=2;dataout_buf(7)=1;elsif (clkevent and clk=1)then if cnt=50000000 then if(jinwei(0)=0)then dataout_buf(0)=dataout_buf(0)+1;elsedataout_buf(0)=0;if(jinwei(1)=0)thendataout_buf
7、(1)=dataout_buf(1)+1;elsedataout_buf(1)=0;if(jinwei(2)=0)thendataout_buf(3)=dataout_buf(3)+1;else dataout_buf(3)=0;if(jinwei(3)=0)thendataout_buf(4)=dataout_buf(4)+1;else dataout_buf(4)=0;if(jinwei(4)=0)thendataout_buf(6)=dataout_buf(6)+1;elsedataout_buf(6)=0;if(jinwei(5)=0)thendataout_buf(7)=dataou
8、t_buf(7)+1;elsedataout_buf(7)=0;end if;end if;end if;end if;end if;end if; end if; end if; end process;数码管显示模块:动态刷新分为两个部分,即移位部分与赋值部分,如下两个进程移位显示进程通过移位寄存器控制数码管的循环移位。-移位显示-process(clk,reset,dataout_buf)beginif(reset=0)then cnt_scan=0; led_sel_buffer=00000001;elsif(clkevent and clk=1)then cnt_scan=cnt_s
9、can+1; if(cnt_scan=800)then led_sel_buffer=led_sel_buffer(6 downto 0)&led_sel_buffer(7); cnt_scan=0; end if;end if;led_sel=led_sel_buffer;end process;-分段赋值-process(clk,led_sel_buffer,dataout_buf,reset)beginif reset=0thendatacodedatacodedatacodedatacodedatacodedatacodedatacodedatacodedatacodedatacode
10、=dataout_buf(0);end case;end if;end process;显示部分实质为数码管显示译码器,把译码输出到数码管从而显示数字。-显示-process(datacode,reset)beginif reset=0then dataoutdataoutdataoutdataoutdataoutdataoutdataoutdataoutdataoutdataoutdataoutdataoutdataout=00000000;end case;end if;led_data=dataout;end process;-2、总程序为:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity clock isport(clk,reset:in std_logic; led_data: