⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qiangda.v

📁 用verilog hdl硬件描述语言实现多人抢答器功能
💻 V
字号:
/*======================================================
= Module Neme:   qiangda
=Project Name:   qiangdaqi
=      Vesion:   2007-6-26 Created By tmsonhust 
======================================================*/
module qiangda(clk1,
			   clk2,
			   k1,
			   k2,
		       k3,
			   k4,
			   reset,
			   alarm,
			   result1,
			   result2,
			   result3,
			   result4);
				
input clk1;       //时钟信号,64Hz
input clk2;       //超时驱动扬声器报警,1Khz
input k1,k2,k3,k4;//抢答按钮信号
input reset;     //主持人抢答开始信号
output alarm;    //报警信号
output result1,result2,result3,result4;//result1~4为抢答结果
reg result1,result2,result3,result4;//抢答结果
reg lock;       //封锁信号
reg delay;      //答题超时标志
reg alarm_ahead;//提前抢答
reg alarm_delay;//开始答题超时
reg[7:0] cnt;//开始答题超时时间控制
reg flag1;  //控制超时时间到之后可以继续检测有选手提前按抢答器
reg flag2;  //一旦有选手提前抢答即报警,同时封锁其他各选手的抢答开关
reg flag3;  //判断第一次抢答后按钮是否放开  
reg clk3;       //提前抢答驱动扬声器报警,500Hz

assign alarm = (alarm_delay & clk2) | (alarm_ahead & clk3) ;

always @(posedge clk2)
	clk3 <= ~clk3;
	
always@(posedge clk1 or posedge reset) 
if(reset)
	begin
		cnt <= 0;
		lock <= 0;
		result1 <= 0;
		result2 <= 0;
		result3 <= 0;
		result4 <= 0;
        alarm_ahead <= 0;
		alarm_delay <= 0;
		delay <= 1; //初始化为答题超时
		flag1 <= 0;
		flag2 <= 0;
		flag3 <= 0; //按键抬起标志
	end
else
	begin
		if(k1 == 1 && lock == 0)
			begin
				result1 <= 1;
				lock <= 1;
			end
		 else if(k2 == 1 && lock == 0)
			begin
				result2 <= 1;
				lock <= 1;
			end
		 else if(k3 == 1 && lock == 0)
			begin
				result3 <= 1;
				lock <= 1;
			end
		 else if(k4 == 1 && lock == 0)
			begin
 				result4 <= 1;
				lock <= 1;
			end
        
		if(lock)
		begin
		    if(!k1 && result1) flag3 <= 1;  //抢答后按钮已抬起
		    else if(!k2 && result2) flag3 <= 1;
		    else if(!k3 && result3) flag3 <= 1;
		    else if(!k4 && result4) flag3 <= 1;
		
			if(cnt == 9 || flag1 == 1) //抢答开始到设置的超时时间之间的间隔为48(3S)
				begin
					if(delay == 1)
					begin
							alarm_delay <= 1; //答题超时
							flag1 <= 0;
					end  
       				else      //没有超时的话,开始检测是否有提前抢答的
						begin         //提前抢答,报警并相应的指示灯亮
							if(k1 == 1 && flag2 == 0)    //只获取第一个提前抢答的并报警
								begin 
								    flag2 <= 1;
									alarm_ahead <= 1;
									result1 <= 1;
									result2 <= 0;
									result3 <= 0;
									result4 <= 0;
								end
							else if(k2 == 1 && flag2 == 0)
								begin 
								    flag2 <= 1;
									alarm_ahead <= 1;
									result2 <= 1;
									result1 <= 0;
									result3 <= 0;
									result4 <= 0;
								end
							else if(k3 == 1 && flag2 == 0)
								begin								    
								    flag2 <= 1; 
									alarm_ahead <= 1;
									result3 <= 1;
									result1 <= 0;
									result2 <= 0;
									result3 <= 0;
								end
							else if(k4 == 1 && flag2 == 0)
								begin 
									flag2 <= 1;
									alarm_ahead <= 1;
									result4 <= 1;
									result1 <= 0;
									result2 <= 0;
									result3 <= 0;
								end
							flag1 <=1;
						end
					cnt <= 0;			
				end	
			else
				begin
					cnt <= cnt + 8'b1;
					if(k1 == 1 && result1 == 1 && flag3 == 1)      
						delay <= 0;//开始答题,清除超时状态(超时状态的清除必须是在抢答按钮按下并弹起后进行)
					else if(k2 == 1 && result2 == 1 && flag3 == 1) 
						delay <= 0;
					else if(k3 == 1 && result3 == 1 && flag3 == 1) 
						delay <= 0;
					else if(k4 == 1 && result4 == 1 && flag3 == 1) 
						delay <= 0;
				end
		end
end
endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -