现代电子技术综合实验实验报告数字跑表综合设计数字跑表综合设计摘要:本文基于VHDL语言进行了带有计时、存贮功能数字跑表的设计。文章对组成系统的各模块进行了详细的阐述,完成了验证效果的仿真实验,并成功在XILINX学生EDA实验开发平台上运行跑表。关键词:VHDL,数字跑表第1章引言1.1项目研究现状数字跑表作为一个简易的数字集成电路的应用,在很多地方起到非常重要的作用。例如:我们上体育用的记时停表,实验用的电子停表以及我们自己用电子表就是它的应用的典型例子。数字跑表使用简单,携带方便,广泛应用与各个领域中。1.2本文研究的主要内容及关键技术本文将研究以FPGA为基础的数字跑表的制作,其主要内容包括介绍,系统框架设计、各模块设计原理及方案、仿真实验等。研究领域涉及数字电路设计、VHDL程序设计、ISE硬件设计平台的使用,Spartan-3A芯片的具体使用。第2章实验项目方案设计2.1项目设计要求本文设计的数字跑表将包括以下内容:基础功能:1、跑表精度为0.01秒;2、跑表计时范围为:1小时;3、设置开始计时/停止计时、复位两个按钮;4、显示工作方式:用六位BCD七段数码管显示读数。扩展功能:1、按键消抖;2、分别存储三组及以上选手时间并分时回放显示。2.2项目系统设计方案及模块组成本文设计的数字跑表的系统框架如下:时钟信号分频器按钮信号消抖器控制器计数器储存器信号选择器显示器现在将对各部分进行说明。分频器:将开发板中晶体振动器产生的高频信号分频为计数和显示需要的低频信号。消抖器:消除实际按钮器件在使用时的抖动信号,保证输入信号能正常进入系统。控制器:根据按键输入信号的不同,产生不同的控制信号,实现不同功能。计数器:基于一个6段同步计数器产生分、秒、毫秒的计数数据,根据系统状态需要暂停计数、清空数据。储存器:储存当前计数器的数据,在特定的控制信号下读取和输出数据。信号选择器:根据特定的控制信号选择计数器的数据或存储器的数据输出。显示器:将输入的分、秒、毫秒数据显示在数码管上。需要产生数码管的驱动信号和位选信号。第3章实验项目单元模块电路设计本章将对完成系统设计的各模块基础进行讲解。具体包括设计的思路、功能、用途、关键语句以及仿真结果。3.1分频器3.1.1模块描述将开发板中晶体振动器产生的48Mhz信号分频为计数需要的100Hz信号和显示需要的1000Hz信号。内建一个基于输入信号的计数器,当计数值到达设定值时,输出信号取反,同时计数器清空,从而达到信号分频的功能。模块符号如下:端口说明:CLK_ORGN:输入,48MHz晶体振动器信号;CLK_MMSE:输出,1KHz显示信号;CLK_MSEC:输出,100Hz计数信号。模块程序:process(CLK_ORGN)beginifrising_edge(CLK_ORGN)thenifcnt2=124999thencnt2=0;x=notx;elsecnt2=cnt2+1;endif;endif;endprocess;3.1.2模块仿真为了更好地模拟,将程序临时变更为10分屏,模拟输入了1KHz时钟信号。仿真波形如下:如图,CLK_MSEC的一个周期包括了CLK_ORGN的10个周期,成功实现了CLK_ORGN的10分频。3.2消抖器3.2.1模块描述消除实际按钮器件在使用时的抖动信号,保证输入信号能正常进入系统。系统将包含5个消抖器,用于处理“开始/暂停”、“清除”、“记录”、“读取”和“显示”的输入信号。输入信号的下降沿的后一个时钟到来时,输出信号设置为高,并在下一个各时钟到来时,输出信号设置为低。从而达到按任意时间的按钮都视为一次输入的消抖功能。模块符号如下:端口说明:CLK:输入,48MHz时钟信号;Key_in:输入,原始按钮信号;Key_out:输出,消抖后按钮信号。模块程序:process(clk,key_in)beginiffalling_edge(clk)thenifcnt=3thenk1='1';elsek1='0';cnt=cnt+1;endif;k2=k1;endif;ifkey_in='0'thencnt=00;endif;endprocess;3.2.2模块仿真模拟了在按钮按下后1000ns后松开的信号。仿真波形如下:如图,在Key_in的下降沿的后一个时钟到来时,Key_out为1,并在下一个各时钟到来时,Key_out为0。从而达到按任意时间的按钮都视为一次输入的消抖功能。3.3控制器3.3.1模块描述根据按键输入信号的不同,产生不同的控制信号。控制信号包括:计数器的使能和清除信号、储存器的读取和输出信号、信号选择器选择信号。其中,“开始/暂停”、“清除”和“显示”信号是将按键的脉冲信号转换为阶跃信号,而“记录”和“读取”信号是将脉冲信号直接输出。通过控制信号的不同组合,实现不同功能的切换。模块符号如下:端口说明:CLK:输入,48MHz时钟信号;EN_IN:输入,“开始/暂停”信号;CLR_IN:输入,“清除”信号;LATCH_IN:输入,“记录”信号;READ_IN:输入,“读取”信号;SHOW_IN:输入,“显示”信号;CLR_OUT:输出,清除信号;EN_OUT:输出,计数器使能信号;LATCH_OUT:输出,存储器记录信号;READ_OUT:输出,存储器读取信号;SHOW_OUT:输出,信号选择器选择信号;LATCH1:输出,储存器记录信号;READ1:输出,储存器读取信号。模块程序:process(EN_IN)beginifrising_edge(EN_IN)thenenn=notenn;endif;endprocess;3.3.2模块仿真由于控制器对输入信号只有两种处理方式,故模拟了“开始/暂停”按钮的两次按下和“记录”按钮的一次按下。仿真波形如下:如图,“开始/暂停”按钮按下再松开后,计数器使能信号取反为高,而“开始/暂停”再次按钮按下再松开后,计数器使能信号取反为低。“记录”按钮按下再松开后,存储器记录信号产生了一次脉冲信号。3.4计数器3.4.1模块描述基于一个6段同步计数器产生分、秒、毫秒的计数数据,根据系统状态需要暂停计数、清空数据。每段计数器内存在一个整形数计数器,再使能信号下,根据输入时钟信号进行累加运算,到最大值时回复初值;而在清除信号下,整形数被清空。所有计数器公用100Hz计数信号和清除信号。第一段计数器的使能信号为控制器输出的计数器使能信号,此后的计数器的使能信号为上一计数器的进位信号。并且,计数器的进制分为6进制和10进制。如此,将6段计数器级联,就可以组成分、秒、毫秒的计数器。模块符号如下:端口说明:CLK:输入,100Hz计数信号;EN:输入,计数器使能信号;CLR:输入,清除信号;MSEC_L,MSEC_H,SEC_L,SEC_H,MIN_L,MIN_H:输出,分、秒、毫秒信号。模块程序:process(CLR,CLK)beginifCLR='1'thencnt=0000;elsifCLK'EVENTandCLK='1'thenifEN='1'thenifcnt=1001thencnt=0000;elsecnt=cnt+1;endif;endif;endif;endprocess;3.4.2模块仿真模拟了给出了时能信号后计数器的计数功能,之后时能信号为低时计数器的暂停功能,并在1000ns后给出了清除信号后,输出清空的功能。仿真波形如下:如图,初始时能信号为高,计数器开始计数,最后输出为“0001”、“0000”、“0000”。之后时能信号为低,计数器数据保留在“0001”、“0000”、“0000”。之后时能信号为高,计数器开始计数,最后输出为“0010”、“0000”、“0000”。之后清除信号为高,计数器数据被清空,输出为“0000”。3.5储存器3.5.1模块描述储存当前计数器的数据,在特定的控制信号下读取和输出数据。由于分、秒、毫秒信号是由6个4位2进制数组构成的,所以储存器内用于存储的数据是由6个4*n位2进制数组构成的。其中n为整数,表示可以记录的分、秒、毫秒信号的最大数据个数。模块内存在两个记录当前记录和读取位置的指针,可以独立完成格子的功能。以微秒信号为例,第一个记录信号来临时,输入的第一个的4位2进制数,被记录到存储数据的第“4*0+0”到“4*0+3”位;第二个记录信号来临时,输入的第二个的4位2进制数,被记录到存储数据的第“4*1+0”到“4*1+3”位。这样每4位2进制数为一组,就可以实现数据的多组记录。在读取数据时,也是同样以4位2进制数为一组读取,就可以实现读取。当记录数据到达最大组数时,用于标记当前组数的指针回到初始值,从而实现在容量内的反复计数。此外,当清楚信号到来时,清空记录的数据以实现清空功能。模块符号如下:端口说明:LATCH:输入,储存器记录信号;READD:输入,储存器读取信号;CLR:输入,清除信号;MSEC_L,MSEC_H,SEC_L,SEC_H,MIN_L,MIN_H:输入,记录分、秒、毫秒信号;MSEC_L,MSEC_H,SEC_L,SEC_H,MIN_L,MIN_H:输出,读取分、秒、毫秒信号。模块程序:process(LATCH)beginifrising_edge(LATCH)theniflatchCnt=8thenlatchCnt=0;endif;MSEC_L_STORE(latchCnt*4+0)=MSEC_L_IN(0);…………latchCnt=latchCnt+1;endif;endprocess;process(READD)beginifrising_edge(READD)thenifreadCnt=8thenreadCnt=0;endif;MSEC_L_OUT(0)=MSEC_L_STORE(readCnt*4+0);…………readCnt=readCnt+1;endif;endprocess;3.5.2模块仿真模拟了两次“记录”按钮的按下和松开,分别输入了“0001”、“0010”两组数据。之后模拟了两次“读取”按钮的按下和松开,展示了读取功能。最后,模拟了两次“清除”按钮的按下和松开,展示了清除功能。仿真波形如下:如图,在输入信号为“0001”时,“记录”按钮按下。之后输入信号为“0010”时,“记录”按钮再次按下。此时读取功能未激活,所以没有输出信号。之后“读取”按钮按下,输出显示为“0001”,表示读取了第一个数据。之后“读取”按钮再次按下,输出显示为“0010”,表示读取了第二个数据。之后“清除”和“读取”按钮再次按下,输出显示为“0000”,表示数据已经清除。3.6信号选择器3.6.1模块描述由于系统内部存在两组来源于计数器和储存器的输出信号,所以需要一个信号选择器决定要将哪组数据输出。该模块的功能即根据特定的控制信号选择计数器的数据或存储器的数据输出。模块符号如下:端口说明:CHOICE:输入,信号选择器选择信号;IN1:输入,计数器输出信号;IN2:输入,储存器输出信号;OUT1:输出,最终输出信号。模块程序:process(CHOICE,IN1,IN2)beginifCHOICE='0'thenOUT1=In1;elseOUT1=In2;endif;endprocess;3.6.2模块仿真模拟了在“0001”和“0010”两组数据输入下,根据选择信号的不同而输出不同数据的功能。仿真波形如下:如图,在选择信号为低时,最终输出了“0001”;而在选择信号为高时,最终输出了“0010”。表明了模块选择不同信号输出的功能。3.7显示器3.7.1模块描述将输入的分、秒、毫秒数据显示在数码管上。需要产生数码管的驱动信号和位选信号。8个晶体管在某一时刻只能显示同一个数字,但可以控制某一时刻那些晶体管有输出信号,所以必须要对时钟信号再次分频,使其在一个显示周期内不断段选信号和位选信号。如在第1ns显示“4-空-空”,第2ns显示“空-3-空”,第3ns显示“空-空-8”,之后不