module
qiangda4(clk,clr,inputEn,add,stu,inputL1,inputL2,inputL3,inputL4,Led1,Led2,Led3,B uzzer);
// 開始聲明各個(gè)端口
//輸入口
input clk,clr,inputEn,add,stu,inputL1,inputL2,inputL3,inputL4;
//輸出口
output [0:7] Led1; //倒計(jì)時(shí)時(shí)使用的LED控制端
output [0:7] Led2; //數(shù)碼管控制端
output [0:7] Led3; //分?jǐn)?shù)顯示數(shù)碼管控制端
output Buzzer; //蜂鳴器
//各個(gè)寄存器變量聲明
reg [0:7] Led1;
reg [0:7] Led2;
reg [0:7] Led3;
reg cnt=32'b0;
reg Buzzer;
reg score=4’hf;//分?jǐn)?shù)顯示寄存器
//配置寄存器,EnFlat是表明開始搶答的標(biāo)志位
reg EnFlat=1'b0;
//BuClk是蜂鳴器的標(biāo)志位
reg BuClk=1'b0;
//BuL是做蜂鳴器的延時(shí)用
reg [0:7]BuL=8'd0;
//搶答選手標(biāo)志位
reg answer=3’d0;
//各組分?jǐn)?shù)標(biāo)志位
reg score1=4’d5;
reg score2=4’d5;
reg score3=4’d5;
reg score4=4’d5;
//------------初始化模塊---------------
always @ (posedge clk)//捕捉時(shí)鐘
begin
//初始化各按鍵并開始搶答
begin
if(inputEn==1'b0)
begin
//初始化各個(gè)標(biāo)志位和參數(shù)
EnFlat=1'b1;
//倒計(jì)時(shí)開始時(shí)8個(gè)Led燈全亮
Led1=8'b11111111;
//組號(hào)顯示靜態(tài)數(shù)碼管(數(shù)碼管為共陽極)的控制端,有8位Led2=8'b11111111;
//分?jǐn)?shù)顯示數(shù)碼管控制端
Led3=8'b11111111;
//蜂鳴器標(biāo)志位
BuClk=1'b0;
//蜂鳴器的控制管腳,低電平為發(fā)聲音
Buzzer=1'b1;
//--------搶答模塊-------
begin
if(EnFlat==1'b1)
begin
//如果按鍵1按下
if(inputL1==1'b0)
begin
//禁止其他選手搶答
EnFlat=1'b0;
//選手標(biāo)志位改變,用于加減分?jǐn)?shù)模塊
answer=3’d1;
//靜態(tài)數(shù)碼管顯示序號(hào)'1' ,及顯示選手對(duì)應(yīng)的組號(hào)
Led2=8'hf9;
//指示蜂鳴器發(fā)聲
BuClk=1'b1;
//如果按鍵2按下
else if(inputL2==1'b0)
begin
//禁止其他選手搶答
EnFlat=1'b0;
answer=3’d2;
Led2=8'ha4;
BuClk=1'b1;
//如果按鍵3按下
else if(inputL3==1'b0)
begin
//禁止其他選手搶答
EnFlat=1'b0;
answer=3’d3;
Led2=8'hb0;
BuClk=1'b1;
//如果按鍵4按下
else if(inputL4==1'b0)
begin
//禁止其他選手搶答
EnFlat=1'b0;
answer=3’d4;
Led2=8'h99;
BuClk=1'b1;
//-------------------加減分?jǐn)?shù)模塊----------------
//第一組加減分
if(answer ==3’d1)
begin
if(add)
score1=score1+1;
//當(dāng)主持人判定選手的回答正確時(shí),按下add鍵進(jìn)行加分操作else
if(stu)
score1=score1-1;
//當(dāng)主持人判定選手的回答錯(cuò)誤時(shí),按下stu鍵進(jìn)行減分操作
score=score1;//把第一組的分?jǐn)?shù)賦值給分?jǐn)?shù)寄存器
//第二組加減分
if(answer ==3’d2)
begin
if(add)
score2=score2+1;
//當(dāng)主持人判定選手的回答正確時(shí),按下add鍵進(jìn)行加分操作else
if(stu)
score2=score2-1;
//當(dāng)主持人判定選手的回答錯(cuò)誤時(shí),按下stu鍵進(jìn)行減分操作
score=score2;
//第三組加減分
if(answer ==3’d3)
begin
if(add)
score3=score3+1;
//當(dāng)主持人判定選手的回答正確時(shí),按下add鍵進(jìn)行加分操作
else
if(stu)
score3=score3-1;
//當(dāng)主持人判定選手的回答錯(cuò)誤時(shí),按下stu鍵進(jìn)行減分操作
score=score3;
//第四組加減分
if(answer ==3’d4)
begin
if(add)
score4=score4+1;
if(stu)
score4=score4-1;
//當(dāng)主持人判定選手的回答錯(cuò)誤時(shí),按下stu鍵進(jìn)行減分操作
score=score4;
//-----------------倒計(jì)時(shí)模塊--------------------
begin
if(EnFlat==1'b1)
begin
if(cnt!=32'd4*******)//計(jì)時(shí)實(shí)現(xiàn)1HZ分頻
cnt=cnt+32'd1;
else
begin
cnt=32'd0;
Led1=8'b11111111
if(Led1==8'b0)//倒計(jì)時(shí)結(jié)束還沒有按鍵按下,則搶答停止且蜂鳴器響EnFlat=1'b0;
BuClk=1'b1;
//----------蜂鳴器模塊-----------------
//當(dāng)蜂鳴器標(biāo)志位置1時(shí)
//進(jìn)入此蜂鳴器處理程序
begin
if(BuClk==1'b1)
begin
//蜂鳴器發(fā)聲
Buzzer=1'b0;
//延時(shí)變量加1
BuL = BuL + 8'd1;
//當(dāng)?shù)竭_(dá)延時(shí)的時(shí)間時(shí)關(guān)掉蜂鳴器
if(BuL==8'd255)
begin
//延時(shí)變量復(fù)位
BuL=8'd0;
//蜂鳴器標(biāo)志位復(fù)位
BuClk=1'b0;
//蜂鳴器停掉
Buzzer=1'b1;
//-------------重置模塊----------------
//按下clr鍵以后各組參數(shù)重置,整個(gè)比賽重新開始
if(clr)
begin
//重置各個(gè)標(biāo)志位和參數(shù)
EnFlat=1'b1;
//重置時(shí)8個(gè)Led燈全亮
Led1=8'b11111111;
//選手號(hào)靜態(tài)數(shù)碼管的控制端,有8位
Led2=8'b11111111;
//選手分?jǐn)?shù)顯示數(shù)碼管重置
Led3=8'b11111111;
//蜂鳴器標(biāo)志位重置
BuClk=1'b0;
//蜂鳴器的控制管腳重置,低電平為發(fā)聲音
Buzzer=1'b1;
//各組分?jǐn)?shù)重置
score1=4’d5;
score2=4’d5;
score3=4’d5;
score4=4’d5;
//分?jǐn)?shù)顯示寄存器重置
answer=8’hff;
//-----------數(shù)碼顯示模塊------------
begin
case(score)
4'h0: Led3 = 8'hc0; //顯示0
4'h1: Led3 = 8'hf9; //顯示1
4'h2: Led3 = 8'ha4; //顯示2
4'h3: Led3 = 8'hb0; //顯示3
4'h4: Led3 = 8'h99; //顯示4
4'h5: Led3 = 8'h92; //顯示5
4'h6: Led3 = 8'h82; //顯示6
4'h7: Led3 = 8'hf8; //顯示7
4'h8: Led3 = 8'h80; //顯示8
4'h9: Led3 = 8'h90; //顯示9
4'ha: Led3 = 8'hbf; //顯示-
default:Led3 = 8'hff; //不顯示endcase
endmodule