生产实习报告班级:通信13-2班姓名:闫振宇学号:1306030222成绩:电子与信息工程学院信息与通信工程系基于verilog 数字秒表的设计实现1. 概述硬件描述语言HDL ( HardwareDescription Langyage) 是一种用形式化方法来描述数字电路和系统的语言。
数字电路系统的设计这里用这种语言可以从上层倒下层逐层描述自设计思想用一系列分层的模块来表示极其复杂的数字系统,然后用EDA 工具逐层验证,把其中需要为具体物理电路的模块组合由自动综合工具转换到门级电路网表。
Verilog HDL 是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。
被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。
数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。
使用VERILOG 进行系统设计时采用的是从顶至下的设计,自顶向下的设计是从系统机开始巴西同划分为若干个基本单元,然后再把每个单元划分为下一层的基本单元,这样下去直到可以直接用EDA 元件库中的基本元件来实现为止。
2. 设计目的及要求a. 有源晶振频率:50MHZ ;b. 测试计时范围:00' 00” 00 ~ 59 ',59显”示9的9 最长时间为59 分59 秒;c. 数字秒表的计时精度是10ms;d. 显示工作方式:六位BCD 七段数码管显示读数,两个按钮开关(一个按钮使秒表复位,另一个按钮控制秒表的启动/暂停)。
3. 设计原理秒表的逻辑结构较简单,它主要由四进制计数器、十六进制计数器、分频器、数据选择器、和显示译码器等组成。
在整个秒表中最关键的是如何获得一个精确的100HZ 计时脉冲,除此之外,整个秒表还需有一个启动信号和一个清零信号,以便秒表能随意停止、启动以及清零复位。
秒表有共有6个输出显示,其中6个显示输出数据,分别为百分之一秒、十分之一秒、秒、十秒、分、十分,所以共有 6 个计数器与之相对应; 6 个计数器的输出全都为BCD 码输出,这样便与同显示译码器连接。
利用一块芯片完成除时钟源,按键和显示器之外的所有数字电路功能。
所有数字逻辑功能都在CPLD 器件上用Verilog 语言实现。
这样设计具有体积小,设计周期短,调试方便,故障率地和修改升级容易等特点。
本设计采用依次采用以下设计方法:1)按键输入缓存,键盘消抖设计;2)分频产生0.01秒信号,产生100HZ的时钟信号设计;3)数码管动态扫描显示设计;4)3-8译码器显示(译码)设计;5)流水线式计数方法设计。
4. 设计原理框图秒表计时器设计原理框图,如图4-1所示。
图4-1秒表计时器设计原理框图根据设计原理框图4-1,以及设计的要求及目的,可以将Verilog HDL语言设计的秒表计时程序分为四大模块:1)按键输入缓存,按键消抖模块;2)分频产生100HZ的时钟信号模块;3)数码管动态扫描显示驱动模块;4)计时处理部模块。
5. 软件设计5.1 按键输入缓存, 按键消抖模块常在按键较少时可用硬件方法消除抖动,一般采用RS 触发器作为常用的消抖电路,如果按键较多时,常用软件消除抖动。
在EDA 的设计应用中,软件消抖的方法即可使用RS 触发器进行消抖,也可通过检测按键按下的时间进行消抖。
5.1.1 按键输入缓存,按键消抖程序:always@(posedge count[16])beginkey_inner<=key;endalways@(posedge key_inner[0])beginkey_flag=~key_flag;end5.1.2 键盘消抖工作原理:设置输入信号key[1:0],设置一个模值为4的控制计数器key_inner,判断计数寄存器cou nt的第16位的上升沿,检测到key_i nner为高电平。
由于计数寄存器的位数为18位。
则说明在0.01s内可以检测到4次高电平。
在人工按键key= ‘1',key_inner为’1,'如连续4次检测到高电平则key_inner—直为’。
4次以上检测到高电平key_inner依旧为’ 1,'也一直输出高电平。
这就确保了当按键信号持续高电平0.01s 以上按键信号才有效。
抖动期间的高电平持续时间不足以输出高电平。
如没有连续4次以上检测到高电平,贝U key_inner为’ 0'再判断key_inner 的上升沿(按键按下为下降沿,弹起为上升沿),每当key_inner[0] 出现一次上升沿(按键按下并弹起),key_flag 将取反一次(设置key_flag 的初值为‘0)。
5.2分频产生100HZ的时钟信号模块5.2.1分频产生100HZ的时钟信号程序:always@(posedge clk)beg inif(cou nt==249999)beg inclk_100hz<=~clk_100h z;coun t<=0;endelsecoun t<=co un t+1;end分频原理图,如图5-1所示。
clklOGhz图5-1分频原理图5.2.2分频原理:由于开发板的输入频率为50MHZ的时钟信号,说明1s产生5 107个时钟信号。
每个时钟信号持续的时间为爲S ,由于秒表计时器的最小单位为0.01S 所以要将50MHZ的时钟信号进行5 105分频,得到100HZ 的时钟信号,即0.01s 。
5.3数码管动态扫描显示驱动模块5.3.1数码管动态扫描显示驱动程序:always@(posedge coun t[15]) beg incou nt3b=cou nt3b+1; case(co un t3b) 3'd5:dis_dat=hour[3:0]; 3'd4:dis_dat=hour[7:4]; 3'd3:dis_dat=hour[11:8];3'd2:dis_dat=hour[15:12]; 3'd1:dis_dat=hour[19:16];3'd0:dis_dat=hour[23:20]; default:dis_dat=4'bxxxx; endcase sel=co un t3b; endalways@(dis_dat) beg incase(dis_dat)0 1 2 3 4 5 6 7 : seg = 8'b1111_1000;显示“ 7” 8 : seg = 8'b1000_0000;/显示“ 8” 9:seg = 8'b1001_0000;/显示 “9”default:seg = 8'bxxxxxxxx;endcaseseg = 8'b1100_0000;显示“ 0” seg = 8'b1111_1001;显示 “1” seg = 8'b1010_0100;/显示“2”seg=8'b1011_0000;/显示“ 3” seg = 8'b1001_1001;/显示“ 4” seg = 8'b1001_0010;/显示end532数码管动态扫描显示原理:数码管动态扫描显示表,如表5-1所示。
表5-1数码管动态扫描显示表六位数码管xxxx xxxx xxxx xxxx xxxx xxxx hour 23:20 19:16 15:12 11:8 7:4 3:0 coun t3b 5 4 3 2 1 0dis dat 0-9 0-9 0-9 0-9 0-9 0-9 由于数码管显示一共有6位,计数寄存器共有18位,则判断计数寄存器的第15位的上升沿即可。
则在每0.01s内判断数码管显示判断8次。
每判断一次,确定一次一只七位数码管的显示数字。
由于在0.01s内六只数码管会发生数值上的变化,共有6只数码管,所以只需要判断8次就能确定秒表计时器0.01s秒内的变化。
将hour显示的值赋给显示数据寄存器dis_dat,再判断dis_dat的值,来确定每只数码管显示的数值。
5.4计时处理部模块5.4.1计时处理程序:always@(posedge clk_100hz)beg inif(~key_i nn er[1]&&key_flag==1)beg inhour=24'h0;endelse if(!key_flag)beginhour[3:0]=hour[3:0]+1;if(hour[3:0]==4'ha)beginhour[3:0]=4'h0;hour[7:4]=hour[7:4]+1;if(hour[7:4]==4'ha)beginhour[7:4]=4'h0; hour[11:8]=hour[11:8]+1; if(hour[11:8]==4'ha) beginhour[11:8]=4'h0; hour[15:12]=hour[15:12]+1; if(hour[15:12]==4'h6) begin hour[15:12]=4'h0; hour[19:16]=hour[19:16]+1; if(hour[19:16]==4'ha)beginhour[19:16]=4'h0; hour[23:20]=hour[23:20]+1; endif(hour[23:20]==4'h6)hour[23:20]=4'h0;endendendendendend542 计时处理原理:判断复位键用key_flag 为启动/暂停的切换标志,判断key_flag 是否为‘,为‘说明 计数暂停,为‘ 0说明计数开始;key_i nn er[1]是输入信号端,按键未按下时,key_i nn er[1] 为‘,按下后为’Q'~key_inner[1]判断为‘,则说明,在程序暂停的情况下,控制按键可 使秒表计时器清零。
百秒位,十秒位,秒位是十进制计数,十秒位,分位,十分位是 6进制计数。
6.实验设计原理图实验设计原理图,如图6-1所示。
led onsel[2..O] ■―X;Iseg[7-.O] —乂inst图6-1实验设计原理图实验设计有三个输入位,key[1:0]为手动输入端,key[0]为启动/暂停控制键,key[1]是 复位控制键。
clk 是时钟输入端。
输出分为sel[2:0]为数码管的位选,实验中共有 6只数码 管,则可以选择8位的位选。
seg[7:0]是数码管的段选,将每一位的数字进行显示。
7•心得体会在将近两周的学习时间内,大致了解了利用 Verilog HDL 硬件描述语言来编写简单的 程序代码。