ad7124的FPGA代码
扫描二维码
随时随地手机看文章
module
qiangda4(clk,clr,inputEn,add,stu,inputL1,inputL2,inputL3,inputL4,Led1,Led2,Led3,B uzzer);
// 开始声明各个端口
//输入口
input clk,clr,inputEn,add,stu,inputL1,inputL2,inputL3,inputL4;
//输出口
output [0:7] Led1; //倒计时时使用的LED控制端
output [0:7] Led2; //数码管控制端
output [0:7] Led3; //分数显示数码管控制端
output Buzzer; //蜂鸣器
//各个寄存器变量声明
reg [0:7] Led1;
reg [0:7] Led2;
reg [0:7] Led3;
reg cnt=32'b0;
reg Buzzer;
reg score=4’hf;//分数显示寄存器
//配置寄存器,EnFlat是表明开始抢答的标志位
reg EnFlat=1'b0;
//BuClk是蜂鸣器的标志位
reg BuClk=1'b0;
//BuL是做蜂鸣器的延时用
reg [0:7]BuL=8'd0;
//抢答选手标志位
reg answer=3’d0;
//各组分数标志位
reg score1=4’d5;
reg score2=4’d5;
reg score3=4’d5;
reg score4=4’d5;
//------------初始化模块---------------
always @ (posedge clk)//捕捉时钟
begin
//初始化各按键并开始抢答
begin
if(inputEn==1'b0)
begin
//初始化各个标志位和参数
EnFlat=1'b1;
//倒计时开始时8个Led灯全亮
Led1=8'b11111111;
//组号显示静态数码管(数码管为共阳极)的控制端,有8位Led2=8'b11111111;
//分数显示数码管控制端
Led3=8'b11111111;
//蜂鸣器标志位
BuClk=1'b0;
//蜂鸣器的控制管脚,低电平为发声音
Buzzer=1'b1;
//--------抢答模块-------
begin
if(EnFlat==1'b1)
begin
//如果按键1按下
if(inputL1==1'b0)
begin
//禁止其他选手抢答
EnFlat=1'b0;
//选手标志位改变,用于加减分数模块
answer=3’d1;
//静态数码管显示序号'1' ,及显示选手对应的组号
Led2=8'hf9;
//指示蜂鸣器发声
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;
//-------------------加减分数模块----------------
//第一组加减分
if(answer ==3’d1)
begin
if(add)
score1=score1+1;
//当主持人判定选手的回答正确时,按下add键进行加分操作else
if(stu)
score1=score1-1;
//当主持人判定选手的回答错误时,按下stu键进行减分操作
score=score1;//把第一组的分数赋值给分数寄存器
//第二组加减分
if(answer ==3’d2)
begin
if(add)
score2=score2+1;
//当主持人判定选手的回答正确时,按下add键进行加分操作else
if(stu)
score2=score2-1;
//当主持人判定选手的回答错误时,按下stu键进行减分操作
score=score2;
//第三组加减分
if(answer ==3’d3)
begin
if(add)
score3=score3+1;
//当主持人判定选手的回答正确时,按下add键进行加分操作
else
if(stu)
score3=score3-1;
//当主持人判定选手的回答错误时,按下stu键进行减分操作
score=score3;
//第四组加减分
if(answer ==3’d4)
begin
if(add)
score4=score4+1;
if(stu)
score4=score4-1;
//当主持人判定选手的回答错误时,按下stu键进行减分操作
score=score4;
//-----------------倒计时模块--------------------
begin
if(EnFlat==1'b1)
begin
if(cnt!=32'd4*******)//计时实现1HZ分频
cnt=cnt+32'd1;
else
begin
cnt=32'd0;
Led1=8'b11111111
if(Led1==8'b0)//倒计时结束还没有按键按下,则抢答停止且蜂鸣器响EnFlat=1'b0;
BuClk=1'b1;
//----------蜂鸣器模块-----------------
//当蜂鸣器标志位置1时
//进入此蜂鸣器处理程序
begin
if(BuClk==1'b1)
begin
//蜂鸣器发声
Buzzer=1'b0;
//延时变量加1
BuL = BuL + 8'd1;
//当到达延时的时间时关掉蜂鸣器
if(BuL==8'd255)
begin
//延时变量复位
BuL=8'd0;
//蜂鸣器标志位复位
BuClk=1'b0;
//蜂鸣器停掉
Buzzer=1'b1;
//-------------重置模块----------------
//按下clr键以后各组参数重置,整个比赛重新开始
if(clr)
begin
//重置各个标志位和参数
EnFlat=1'b1;
//重置时8个Led灯全亮
Led1=8'b11111111;
//选手号静态数码管的控制端,有8位
Led2=8'b11111111;
//选手分数显示数码管重置
Led3=8'b11111111;
//蜂鸣器标志位重置
BuClk=1'b0;
//蜂鸣器的控制管脚重置,低电平为发声音
Buzzer=1'b1;
//各组分数重置
score1=4’d5;
score2=4’d5;
score3=4’d5;
score4=4’d5;
//分数显示寄存器重置
answer=8’hff;
//-----------数码显示模块------------
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