📄 qiangda.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 + -