FPGA基础实验:秒表(计时器)
本实验是通过时间基准、带使能计数器、两个8段数码管,三个电路模块进行设计。
时间基准点路和带使能的计数器在上一个实验已经介绍过了。这里我们主要介绍按键输入的控制电路设计,以及两个数码管显示。
首先我们看简单的:两个数码管显示
reg[7:0] count; //为计时值
//数码管显示
always@( count )
begin
//个位显示
case( count%10 )
4'h0 : smg1 = 8'hc0 ;
4'h1 : smg1 = 8'hf9 ;
4'h2 : smg1 = 8'ha4 ;
4'h3 : smg1 = 8'hb0 ;
4'h4 : smg1 = 8'h99 ;
4'h5 : smg1 = 8'h92 ;
4'h6 : smg1 = 8'h82 ;
4'h7 : smg1 = 8'hf8 ;
4'h8 : smg1 = 8'h80 ;
4'h9 : smg1 = 8'h90 ;
endcase
//十位显示
case( count/10)
4'h0 : smg2 = 8'h40 ;
4'h1 : smg2 = 8'h49 ;
4'h2 : smg2 = 8'h24 ;
4'h3 : smg2 = 8'h30 ;
4'h4 : smg2 = 8'h19 ;
4'h5 : smg2 = 8'h12 ;
4'h6 : smg2 = 8'h02 ;
4'h7 : smg2 = 8'h78 ;
4'h8 : smg2 = 8'h00 ;
4'h9 : smg2 = 8'h10 ;
endcase
end
可以看到,十位和个位的十六进制显示编码不一样,这里我们设计的是0–9.9s计时器,所以考虑到十位上小数点的存在,把所谓的“七段数码管(没有小数点)”变成了八段数码管。
按键输入是本设计的重点,而且这里还涉及到一个必须考虑的问题:按键消抖,我们先看程序一步一步分析:
input key;
//定义按键输入
input clk; //系统时钟50MHz
//定义分频参数(5M=0.1s)
parameter timer = 5000_000;
//分频时钟,开始/停止标识
reg div_clk, st_flag ;
wire[1:0] key;
reg[1:0] keyin;
//缓存按键值,消抖时用
reg[22:0] TIM; //计数分频
reg[8:0] count;
//计时值
//时钟分频,0.1s
always@(posedge clk )
begin
if( TIM == timer )
begin
TIM <= 0;
div_clk <= ~div_clk;
end
else
TIM <= TIM + 1'b1;
end
//按键消抖,通过TIM的计数,大约20ms
always@(posedge TIM[20] )
begin
keyin <= key ;
end
//key[0]开始停止标识, key[1]实现复位功能
always@(negedge keyin[0] )
//都为低电平有效
begin
st_flag <= ~st_flag ;
//开始暂停标志位
end
//按键输入控制计时功能
always@( posedge div_clk )
begin
if( !keyin[1] && !st_flag )
count <= 0;
else if( !st_flag )
count <= count;
else if( count==100 )
count <= 0;
count <= count + 1'b1;
end