FPGA实现计时器功能(黑金开发平台)

基于黑金开发平台FPGA实现计时器

这学期我们开设了DSP实验这门课,主要目的是使用开发平台(本校使用黑金动力社区基于飓风IV的初级产品)进行数字信号处理,当然在课程的开始,熟悉开发板的使用方式以及verilog语言的编写时十分必要的,这写东西都是第一次接触,尤其是verilog语言,这次都是按照老师教的一点点知识来写的,所以代码异常繁杂。当然希望以后的文章中我的Verilog代码能够慢慢进步。

计时器要求

  1. 设计一个倒计时器模型
  2. 6个数码显示区依次显示的单位为:十分钟、分钟、十秒、秒、时分秒、十毫秒
  3. 开始时可以使用按键手动设计时间
  4. 计时结束后蜂鸣器发出响声进行提醒

设计思路

将程序设置为一个有限状态机的形式,程序在几种状态之间不断切换。共有以下几个状态(在程序中使用status进行标记):

0.初始状态。此时六个数字均显示为0
1.设置状态。此时可以使用按键调整每一位数的大小,当前选中的位数右下角的小数点会亮
2.计时状态。此时会进行倒计时至数字全部为0
3.结束状态。此时会保持全零状态并使蜂鸣器发出数秒声音。
4.初始化状态。此时对变量重新进行初始化,以便于其进入下一个循环(初始状态)

状态之间的转换:
程序烧在开发板上后即为0状态,点击中间键即可进入1状态,使用上下左右键位设置完事件后再次点击中间键即可进入2状态,计时结束后自动进入3状态,蜂鸣器响几秒后自动进入4状态,数据初始化后自动进入0状态,完成循环。

一些关键点

1.按键的消抖

按键在按下和松开时电位是不稳定的,因此如何记录一次按键的点击是一个值得思考的问题,网上针对此问题已经有了许多算法,这里提出我自己思考的一种策略:

只针对按键的点击事件,而不针对按键的持续按压事件。
首先设置5ms的检测时间间隔,考虑到人的按动速度,此间隔足够短。检测方法,在每个长度为5ms的时间间隔内记录按键电平为0的次数,若不为0,说明这5ms内按键被按动了,并重进行下一个时间间隔的检测,直至出现第一个0电平次数为0的时间间隔。到此可认为完成了一次点击。因为即使考虑按键抖动可能产生的高电平,5ms也足够的。从按键按下到最终相应中间相隔了大概一个时间间隔,但对于人来说,5ms足够短,完全可以忽略不计。

此检测步骤应该与主程序同步进行,因目前尚未掌握子模块与顶层模块的参数传递,故此处利用另一个always块在主module写,这样便可以做到与主程序的module并行执行。

2.倒计时时的数字变化

这个也是我认为值得思考的一个问题。设置的最小时间单位为10ms,倒计时开始后,这一位不断减小至0,而后变为9,以此循环,而每当这一为变成九时,其上一位也要减一。同理,当后两位都从0变到9的时候,分钟单位应该减一,此即为数字变化的设计思路。但要注意的是,由于一分钟是60s,10s的最高位只能达到5而不是9。

容易忽略的地方:
1)每个时钟周期仅仅有五十兆分之一秒,而最低位每次减一需要百分之一秒,因此最低位从0变为9后,会维持很多个时钟周期,因此前一位的判定条件不能简单的为后一位变为9,而必须是后一位第一次变为9,这一点需要注意。

2)即使的设置是后面位数均达到9(10s位是5)时,前一位改变,但存在另一种情况:即开始设置的时间恰好满足这样的条件,这种情况下,前一位不能直接改变,还是应该从最低位开始逐渐减小。

代码部分

使用的硬件为CYCLONE IV 核心板 DB4CE15,需要配置的管脚包括:
输入时钟
key
蜂鸣器
数码管等

再次说明,我第一次接触verilog语言,代码冗长复杂在所难免,以后会尽量改进

by qiuzelin 2019-3-18


var foo = 'bar';
module num_test(in,dig,sel,key,led,ring);

input in;
input [4:0] key;  //input不能被定义为reg类型					//key 从0-4分别为上下左右中
reg [27:0] cc;
output reg [7:0] dig;
output reg [5:0] sel;
output reg led;
reg [2:0] status;
reg [27:0] cc_1;  //用于状态0时的扫描
reg [10:0] key_sta [4:0] ; 

//key模块中用用计数的变量
reg [27:0] temp_1; 
reg [27:0] temp_2; 
reg [27:0] temp_3; 
reg [27:0] temp_4; 
reg [27:0] temp_5; 
reg [27:0] cc_key_1;
reg [27:0] cc_key_2;
reg [27:0] cc_key_3;
reg [27:0] cc_key_4;
reg [27:0] cc_key_5;
reg [10:0] key_sta_2;
reg [10:0] key_sta_3 [4:0];
//status=1时用到的参量
reg [7:0] num_pool [9:0];//用于存放所有可能的数字取值
reg [7:0] num_pool_2 [9:0];//存放带有小数点的可能取值
reg [27:0] cc_2;
reg [25:0] num_value [5:0];
reg [10:0] num_posi;
//status=2时用到的参量
reg [27:0] cc_3;
reg [27:0] cc_31;
reg [25:0] num_value_2 [5:0];   //记录最终设置的时间,对不同位数都要进行判断,此处为不冲突,多设置几组  倒序 //若初始为99毫秒,则秒不需要减一
reg [25:0] num_value_2_1 [5:0]; 
reg [25:0] num_value_2_2 [5:0]; 
reg [25:0] num_value_2_3 [5:0]; 
reg [25:0] num_value_2_4 [5:0];
reg [5:0] index [5:0];   //倒序
//status=3用到的参量
output reg ring;
reg [30:0] ring_clc;


initial
begin
	ring<=1;
	led<=0;
	cc<=0;
	dig<=8'b11111111;
	sel<=6'b111111;
	status<=0;   //标记工作状态
	cc_1<=0;
	cc_2<=0;
	cc_key_1<=0;
	cc_key_2<=0;
	cc_key_3<=0;
	cc_key_4<=0;
	cc_key_5<=0;
	temp_1<=0;
	temp_2<=0;
	temp_3<=0;
	temp_4<=0;
	temp_5<=0;
	key_sta_2<=0;
	num_pool[0]<=8'b11000000;
	num_pool[1]<=8'b11111001;
	num_pool[2]<=8'b10100100;
	num_pool[3]<=8'b10110000;
	num_pool[4]<=8'b10011001;
	num_pool[5]<=8'b10010010;
	num_pool[6]<=8'b10000010;
	num_pool[7]<=8'b11111000;
	num_pool[8]<=8'b10000000;
	num_pool[9]<=8'b10010000;
	num_pool_2[0]<=8'b01000000;
	num_pool_2[1]<=8'b01111001;
	num_pool_2[2]<=8'b00100100;
	num_pool_2[3]<=8'b00110000;
	num_pool_2[4]<=8'b00011001;
	num_pool_2[5]<=8'b00010010;
	num_pool_2[6]<=8'b00000010;
	num_pool_2[7]<=8'b01111000;
	num_pool_2[8]<=8'b00000000;
	num_pool_2[9]<=8'b00010000;
	num_value[0]<=720000;
	num_value[1]<=720000;
	num_value[2]<=720000;  //最高位为5,此处整除6
	num_value[3]<=720000;
	num_value[4]<=720000;
	num_value[5]<=720000;
	key_sta[0]<=11'b00000000000;
	key_sta[1]<=11'b00000000000;
	key_sta[2]<=11'b00000000000;
	key_sta[3]<=11'b00000000000;
	key_sta[4]<=11'b00000000000;
	num_posi<=360;   //设置成6的整数倍
	cc_3<=0;
	cc_31<=0;
	index[0]<=0;
	index[1]<=0;
	index[2]<=0;
	index[3]<=0;
	index[4]<=0;
	index[5]<=0;
	ring_clc<=0;
end



always @ (posedge in)
begin
	if (status==0)
	begin
		if (cc_1==600)
		begin
			cc_1<=0;
		end
		else if ((0<=cc_1)&&(cc_1<100))
		begin
			dig<=8'b11000000;
			sel<=6'b111110;
			cc_1<=cc_1+1;
		end
		else if ((100<=cc_1)&&(cc_1<200))
		begin
			dig<=8'b11000000;
			sel<=6'b111101;
			cc_1<=cc_1+1;
		end
		else if ((200<=cc_1)&&(cc_1<300))
		begin
			dig<=8'b11000000;
			sel<=6'b111011;
			cc_1<=cc_1+1;
		end
		else if ((300<=cc_1)&&(cc_1<400))
		begin
			dig<=8'b11000000;
			sel<=6'b110111;
			cc_1<=cc_1+1;
		end
		else if ((400<=cc_1)&&(cc_1<500))
		begin
			dig<=8'b11000000;
			sel<=6'b101111;
			cc_1<=cc_1+1;
		end
		else if ((500<=cc_1)&&(cc_1<600))
		begin
			dig<=8'b11000000;
			sel<=6'b011111;
			cc_1<=cc_1+1;
		end
		
		if (key_sta[4]>key_sta_3[4])
		begin
			key_sta_3[4]<=key_sta[4];
			status<=1;
		end
	end
	
	
	
	
	else if (status==1)
	begin
		if (cc_2==6000)
		begin
			cc_2<=0;
		end
		else if ((0<=cc_2)&&(cc_2<1000))
		begin
		
			if (num_posi%6==0)
			begin
				sel<=6'b111110;
				dig<=num_pool_2[num_value[0]%10];
				if (key_sta_3[0]<key_sta[0])
				begin
					key_sta_3[0]<=key_sta[0];
					num_value[0]<=num_value[0]+1;
				end
				
				if (key_sta_3[1]<key_sta[1])
				begin
					key_sta_3[1]<=key_sta[1];
					num_value[0]<=num_value[0]-1;
				end
				
				if (key_sta_3[2]<key_sta[2])
				begin
					key_sta_3[2]<=key_sta[2];
					num_posi<=num_posi-1;
				end
				if (key_sta_3[3]<key_sta[3])
				begin
					key_sta_3[3]<=key_sta[3];
					num_posi<=num_posi+1;
				end
			end
			else
			begin
				dig<=num_pool[num_value[0]%10];
				sel<=6'b111110;
			end
			cc_2<=cc_2+1;
		end
		else if ((1000<=cc_2)&&(cc_2<2000))
		begin
			if (num_posi%6==1)
			begin
				sel<=6'b111101;
				dig<=num_pool_2[num_value[1]%10];
				
				
				if (key_sta_3[0]<key_sta[0])
				begin
					key_sta_3[0]<=key_sta[0];
					num_value[1]<=num_value[1]+1;
				end
				
				if (key_sta_3[1]<key_sta[1])
				begin
					key_sta_3[1]<=key_sta[1];
					num_value[1]<=num_value[1]-1;
				end
				
				if (key_sta_3[2]<key_sta[2])
				begin
					key_sta_3[2]<=key_sta[2];
					num_posi<=num_posi-1;
				end
				if (key_sta_3[3]<key_sta[3])
				begin
					key_sta_3[3]<=key_sta[3];
					num_posi<=num_posi+1;
				end
				
			end
			else
			begin
				dig<=num_pool[num_value[1]%10];
				sel<=6'b111101;
			end
			
			cc_2<=cc_2+1;
		end
		else if ((2000<=cc_2)&&(cc_2<3000))
		begin
			if (num_posi%6==2)
			begin
				sel<=6'b111011;
				dig<=num_pool_2[num_value[2]%6];
				
				
				if (key_sta_3[0]<key_sta[0])
				begin
					key_sta_3[0]<=key_sta[0];
					num_value[2]<=num_value[2]+1;
				end
				
				if (key_sta_3[1]<key_sta[1])
				begin
					key_sta_3[1]<=key_sta[1];
					num_value[2]<=num_value[2]-1;
				end
				
				if (key_sta_3[2]<key_sta[2])
				begin
					key_sta_3[2]<=key_sta[2];
					num_posi<=num_posi-1;
				end
				if (key_sta_3[3]<key_sta[3])
				begin
					key_sta_3[3]<=key_sta[3];
					num_posi<=num_posi+1;
				end
				
			end
			else
			begin
				dig<=num_pool[num_value[2]%6];
				sel<=6'b111011;
			end
			cc_2<=cc_2+1;
		end
		else if ((3000<=cc_2)&&(cc_2<4000))
		begin
			if (num_posi%6==3)
			begin
				sel<=6'b110111;
				dig<=num_pool_2[num_value[3]%10];
				
				
				if (key_sta_3[0]<key_sta[0])
				begin
					key_sta_3[0]<=key_sta[0];
					num_value[3]<=num_value[3]+1;
				end
				
				if (key_sta_3[1]<key_sta[1])
				begin
					key_sta_3[1]<=key_sta[1];
					num_value[3]<=num_value[3]-1;
				end
				
				if (key_sta_3[2]<key_sta[2])
				begin
					key_sta_3[2]<=key_sta[2];
					num_posi<=num_posi-1;
				end
				if (key_sta_3[3]<key_sta[3])
				begin
					key_sta_3[3]<=key_sta[3];
					num_posi<=num_posi+1;
				end
				
			end
			else
			begin
				dig<=num_pool[num_value[3]%10];
				sel<=6'b110111;
			end
			cc_2<=cc_2+1;
		end
		else if ((4000<=cc_2)&&(cc_2<5000))
		begin
			if (num_posi%6==4)
			begin
				sel<=6'b101111;
				dig<=num_pool_2[num_value[4]%10];
				
				
				if (key_sta_3[0]<key_sta[0])
				begin
					key_sta_3[0]<=key_sta[0];
					num_value[4]<=num_value[4]+1;
				end
				
				if (key_sta_3[1]<key_sta[1])
				begin
					key_sta_3[1]<=key_sta[1];
					num_value[4]<=num_value[4]-1;
				end
				
				if (key_sta_3[2]<key_sta[2])
				begin
					key_sta_3[2]<=key_sta[2];
					num_posi<=num_posi-1;
				end
				if (key_sta_3[3]<key_sta[3])
				begin
					key_sta_3[3]<=key_sta[3];
					num_posi<=num_posi+1;
				end
				
			end
			else
			begin
				dig<=num_pool[num_value[4]%10];
				sel<=6'b101111;
			end
			cc_2<=cc_2+1;
		end
		else if ((5000<=cc_2)&&(cc_2<6000))
		begin
			if (num_posi%6==5)
			begin
				sel<=6'b011111;
				dig<=num_pool_2[num_value[5]%10];
				
				
				if (key_sta_3[0]<key_sta[0])
				begin
					key_sta_3[0]<=key_sta[0];
					num_value[5]<=num_value[5]+1;
				end
				
				if (key_sta_3[1]<key_sta[1])
				begin
					key_sta_3[1]<=key_sta[1];
					num_value[5]<=num_value[5]-1;
				end
				
				if (key_sta_3[2]<key_sta[2])
				begin
					key_sta_3[2]<=key_sta[2];
					num_posi<=num_posi-1;
				end
				if (key_sta_3[3]<key_sta[3])
				begin
					key_sta_3[3]<=key_sta[3];
					num_posi<=num_posi+1;
				end
				
			end
			else
			begin
				dig<=num_pool[num_value[5]%10];
				sel<=6'b011111;
			end
			cc_2<=cc_2+1;
		end
		
		
		
		if (key_sta[4]>key_sta_3[4])
		begin
			key_sta_3[4]<=key_sta[4];
			status<=2;
			num_value_2[0]<=num_value[0];
			num_value_2[1]<=num_value[1];
			num_value_2[2]<=num_value[2];
			num_value_2[3]<=num_value[3];
			num_value_2[4]<=num_value[4];
			num_value_2[5]<=num_value[5];
			
			num_value_2_1[0]<=num_value[0];
			num_value_2_1[1]<=num_value[1];
			num_value_2_1[2]<=num_value[2];
			num_value_2_1[3]<=num_value[3];
			num_value_2_1[4]<=num_value[4];
			num_value_2_1[5]<=num_value[5];
			
			num_value_2_2[0]<=num_value[0];
			num_value_2_2[1]<=num_value[1];
			num_value_2_2[2]<=num_value[2];
			num_value_2_2[3]<=num_value[3];
			num_value_2_2[4]<=num_value[4];
			num_value_2_2[5]<=num_value[5];
			
			num_value_2_3[0]<=num_value[0];
			num_value_2_3[1]<=num_value[1];
			num_value_2_3[2]<=num_value[2];
			num_value_2_3[3]<=num_value[3];
			num_value_2_3[4]<=num_value[4];
			num_value_2_3[5]<=num_value[5];
			
			num_value_2_4[0]<=num_value[0];
			num_value_2_4[1]<=num_value[1];
			num_value_2_4[2]<=num_value[2];
			num_value_2_4[3]<=num_value[3];
			num_value_2_4[4]<=num_value[4];
			num_value_2_4[5]<=num_value[5];
		end
	end
	else if (status==2)
	begin
		if (cc_3==6000)
		begin
			cc_3<=0;
			cc_31<=cc_31+1;
		end
		else if ((0<=cc_3)&&(cc_3<1000))
		begin
			
			dig<=num_pool[num_value[0]%10];
			sel<=6'b111110;
			cc_3<=cc_3+1;
			
		end
		else if ((1000<=cc_3)&&(cc_3<2000))
		begin
			dig<=num_pool[num_value[1]%10];
			sel<=6'b111101;
			cc_3<=cc_3+1;
		end
		else if ((2000<=cc_3)&&(cc_3<3000))
		begin
			dig<=num_pool[num_value[2]%6];
			sel<=6'b111011;
			cc_3<=cc_3+1;
		end
		else if ((3000<=cc_3)&&(cc_3<4000))
		begin
			dig<=num_pool[num_value[3]%10];
			sel<=6'b110111;
			cc_3<=cc_3+1;
		end
		else if ((4000<=cc_3)&&(cc_3<5000))
		begin
			dig<=num_pool[num_value[4]%10];
			sel<=6'b101111;
			cc_3<=cc_3+1;
		end
		else if ((5000<=cc_3)&&(cc_3<6000))
		begin
			cc_3<=cc_3+1;
			dig<=num_pool[num_value[5]%10];
			sel<=6'b011111;
		end
		cc_31<=cc_31+1;
		//对百分秒进行控制
		if (cc_31==500000)
		begin
			num_value[5]<=num_value[5]-1;
			cc_31<=0;
			index[1][0]<=1;
			index[2][0]<=1;
			index[3][0]<=1;
			index[4][0]<=1;
			index[5][0]<=1;
			
		end
		//对时分秒进行控制
		if ((num_value[5]%10==9)&&(index[1][0]==1))
		begin
			if (num_value_2[5]%10==9)
			begin
				num_value_2[5]<=0;
			end
			else
			begin
				num_value[4]<=num_value[4]-1;
				index[1][0]<=0;
			end
			index[2][1]<=1;
			index[3][1]<=1;
			index[4][1]<=1;
			index[5][1]<=1;
		end
		//对秒的个位数进行控制
		
		if (((num_value[4]%10==9)&&(num_value[5]%10==9))&&((index[2][1]==1)&&(index[2][0]==1)))
		begin
			if ((num_value_2_1[5]%10==9)&&(num_value_2_1[4]%10==9))
			begin
				num_value_2_1[5]<=0;
				num_value_2_1[4]<=0;
			end
			else
			begin
				
				num_value[3]<=num_value[3]-1;
				
			end
			index[2]<=0;
			
			index[3][2]<=1;
			index[4][2]<=1;
			index[5][2]<=1;
		end
		
		if ((num_value[3]%10==9)&&(num_value[4]%10==9)&&(num_value[5]%10==9)&&
			(index[3][0]==1)&&(index[3][1]==1)&&(index[3][2]==1))
		begin
			if ((num_value_2_2[5]%10==9)&&(num_value_2_2[4]%10==9)&&(num_value_2_2[3]%10==9))
			begin
				num_value_2_2[5]<=0;
				num_value_2_2[4]<=0;
				num_value_2_2[3]<=0;
			end
			else
			begin
				num_value[2]<=num_value[2]-1;
				index[3]<=0;
			end
			index[4][3]<=1;
			index[5][3]<=1;
				
		end
		
		if ((num_value[3]%10==9)&&(num_value[4]%10==9)&&(num_value[5]%10==9)&&(num_value[2]%6==5)&&
			(index[4][0]==1)&&(index[4][1]==1)&&(index[4][2]==1)&&(index[4][3]==1))
		begin
			if ((num_value_2_3[5]%10==9)&&(num_value_2_3[4]%10==9)&&(num_value_2_3[3]%10==9)&&(num_value_2_3[2]%6==5))
			begin
				num_value_2_3[5]<=0;
				num_value_2_3[4]<=0;
				num_value_2_3[3]<=0;
				num_value_2_3[2]<=0;
			end
			else
			begin
				num_value[1]<=num_value[1]-1;
				index[4]<=0;
			end;
			index[5][4]<=1;
				
		end
		
		if ((num_value[3]%10==9)&&(num_value[4]%10==9)&&(num_value[5]%10==9)&&(num_value[2]%6==5)&&(num_value[1]%10==9)&&
			(index[5][0]==1)&&(index[5][1]==1)&&(index[5][2]==1)&&(index[5][3]==1)&&(index[5][4]==1))
		begin
			if ((num_value_2_4[5]%10==9)&&(num_value_2_4[4]%10==9)&&(num_value_2_4[3]%10==9)&&(num_value_2_4[2]%6==5)&&(num_value_2_4[1]%10==0))
			begin
				num_value_2_4[5]<=0;
				num_value_2_4[4]<=0;
				num_value_2_4[3]<=0;
				num_value_2_4[2]<=0;
				num_value_2_4[1]<=0;
			end
			else
			begin
				num_value[0]<=num_value[0]-1;
				index[5]<=0;
			end
			
				
		end
		
		if ((num_value[3]%10==0)&&(num_value[4]%10==0)&&(num_value[5]%10==0)&&(num_value[2]%6==0)&&
		(num_value[1]%10==0)&&(num_value[0]%10==0))
		begin
			status<=3;
		end
	end
	/
	else if (status==3)
	begin
		if(ring_clc==125000000)
		begin
			status<=4;
		end
		else
		begin
			ring<=0;
			ring_clc<=ring_clc+1;
		end
		sel<=6'b000000;
		dig<=8'b11111111;
	end
	
	else if (status==4) //设置一个状态用来对数据进行初始化
	begin	
	ring<=1;
	led<=0;
	dig<=8'b11111111;
	sel<=6'b111111;  
	cc_1<=0;
	cc_2<=0;
	num_pool[0]<=8'b11000000;
	num_pool[1]<=8'b11111001;
	num_pool[2]<=8'b10100100;
	num_pool[3]<=8'b10110000;
	num_pool[4]<=8'b10011001;
	num_pool[5]<=8'b10010010;
	num_pool[6]<=8'b10000010;
	num_pool[7]<=8'b11111000;
	num_pool[8]<=8'b10000000;
	num_pool[9]<=8'b10010000;
	num_pool_2[0]<=8'b01000000;
	num_pool_2[1]<=8'b01111001;
	num_pool_2[2]<=8'b00100100;
	num_pool_2[3]<=8'b00110000;
	num_pool_2[4]<=8'b00011001;
	num_pool_2[5]<=8'b00010010;
	num_pool_2[6]<=8'b00000010;
	num_pool_2[7]<=8'b01111000;
	num_pool_2[8]<=8'b00000000;
	num_pool_2[9]<=8'b00010000;
	num_value[0]<=720000;
	num_value[1]<=720000;
	num_value[2]<=720000;  //最高位为5,此处整除6
	num_value[3]<=720000;
	num_value[4]<=720000;
	num_value[5]<=720000;
	num_posi<=360;   //设置成6的整数倍
	cc_3<=0;
	cc_31<=0;
	index[0]<=0;
	index[1]<=0;
	index[2]<=0;
	index[3]<=0;
	index[4]<=0;
	index[5]<=0;
	ring_clc<=0;
	num_value_2[0]<=0;
	num_value_2[1]<=0;
	num_value_2[2]<=0;
	num_value_2[3]<=0;
	num_value_2[4]<=0;
	num_value_2[5]<=0;
		
	num_value_2_1[0]<=0;
	num_value_2_1[1]<=0;
	num_value_2_1[2]<=0;
	num_value_2_1[3]<=0;
	num_value_2_1[4]<=0;
	num_value_2_1[5]<=0;
		
	num_value_2_2[0]<=0;
	num_value_2_2[1]<=0;
	num_value_2_2[2]<=0;
	num_value_2_2[3]<=0;
	num_value_2_2[4]<=0;
	num_value_2_2[5]<=0;
		
	num_value_2_2[0]<=0;
	num_value_2_2[1]<=0;
	num_value_2_2[2]<=0;
	num_value_2_2[3]<=0;
	num_value_2_2[4]<=0;
	num_value_2_2[5]<=0;
		
	num_value_2_2[0]<=0;
	num_value_2_2[1]<=0;
	num_value_2_2[2]<=0;
	num_value_2_2[3]<=0;
	num_value_2_2[4]<=0;
	num_value_2_2[5]<=0;
	status<=0;
	end
	
end










always @ (posedge in)    //并行的按键检测运算
begin
	
	if (cc_key_1==500000)
	begin
		cc_key_1<=0;
		if (temp_1==0)
		begin
			if (key_sta_2[0]>0)
			begin
				key_sta[0]<=key_sta[0]+1;
				key_sta_2[0]<=0;
				temp_1<=0;
			end
		end
		else
		begin
			key_sta_2[0]<=1;
			temp_1<=0;
		end
	end
	else
	begin
		if (key[0] == 0)
		begin
			temp_1<=temp_1+1;
		end
		cc_key_1<=cc_key_1+1;
	end
	
	if (cc_key_2==500000)
	begin
		cc_key_2<=0;
		if (temp_2==0)
		begin
			if (key_sta_2[1]>0)
			begin
				key_sta[1]<=key_sta[1]+1;
				key_sta_2[1]<=0;
				temp_2<=0;
			end
		end
		else
		begin
			key_sta_2[1]<=1;
			temp_2<=0;
		end
	end
	else
	begin
		if (key[1] == 0)
		begin
			temp_2<=temp_2+1;
		end
		cc_key_2<=cc_key_2+1;
	end
	
	if (cc_key_3==500000)
	begin
		cc_key_3<=0;
		if (temp_3==0)
		begin
			if (key_sta_2[2]>0)
			begin
				key_sta[2]<=key_sta[2]+1;
				key_sta_2[2]<=0;
				temp_3<=0;
			end
		end
		else
		begin
			key_sta_2[2]<=1;
			temp_3<=0;
		end
	end
	else
	begin
		if (key[2] == 0)
		begin
			temp_3<=temp_3+1;
		end
		cc_key_3<=cc_key_3+1;
	end
	
	if (cc_key_4==500000)
	begin
		cc_key_4<=0;
		if (temp_4==0)
		begin
			if (key_sta_2[3]>0)
			begin
				key_sta[3]<=key_sta[3]+1;
				key_sta_2[3]<=0;
				temp_4<=0;
			end
		end
		else
		begin
			key_sta_2[3]<=1;
			temp_4<=0;
		end
	end
	else
	begin
		if (key[3] == 0)
		begin
			temp_4<=temp_4+1;
		end
		cc_key_4<=cc_key_4+1;
	end
	
	if (cc_key_5==500000)
	begin
		cc_key_5<=0;
		if (temp_5==0)
		begin
			if (key_sta_2[4]>0)
			begin
				key_sta[4]<=key_sta[4]+1;
				key_sta_2[4]<=0;
				temp_5<=0;
			end
		end
		else
		begin
			key_sta_2[4]<=1;
			temp_5<=0;
		end
	end
	else
	begin
		if (key[4] == 0)
		begin
			temp_5<=temp_5+1;
		end
		cc_key_5<=cc_key_5+1;
	end
	
	
end
endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值