用Verilog设计一个抢答器 功能要求如下: A.能够同时进行2位选手的抢答比赛,用2个按键作为抢答按钮; B.由主持人进行系统复位和抢答控制; C.主持人允许抢答后,计时器开始倒计时,直到有人抢答成功后,数码管上显示剩余时间和抢答成功选手号码: D.两名选手初始分数为0,如果抢答选手回答正确,得1分;若回答错误,对方得1分。显示两名选手的目前分数; E.在主持人允许前抢答被视为犯规,给出犯规标识,并自动减1分; F.在一轮抢答结束后,主持人按下复位键,返回初始计时状态,以进行下一轮抢答; G.当某个选手率先得到5分时,显示比赛结束;
时间: 2023-11-12 14:07:39 浏览: 93
以下是抢答器的Verilog代码,其中使用了FPGA上的按键和数码管:
```verilog
module QiangDaqi(
input clk,
input rst,
input [1:0] btn, // 抢答按钮
input en, // 抢答控制
output [3:0] seg, // 数码管
output [1:0] led // LED灯,显示选手得分
);
reg [3:0] seg_reg; // 数码管显示寄存器
reg [7:0] cnt_reg; // 抢答计时器寄存器
reg [1:0] player_score[1:2]; // 两名选手得分寄存器
parameter MAX_TIME = 8'h20; // 最大计时时间,约为2s
parameter WRONG_PENALTY = 1; // 犯规扣分
assign seg = seg_reg;
assign led = player_score[1] << 1 | player_score[2];
always @(posedge clk) begin
if (rst) begin
seg_reg <= 4'b1111; // 数码管显示0
cnt_reg <= MAX_TIME; // 抢答计时器初始化
player_score[1] <= 2'b0; // 两名选手得分初始化
player_score[2] <= 2'b0;
end
else begin
// 数码管显示剩余时间和抢答成功选手号码
if (cnt_reg > 0) begin
case (cnt_reg)
8'h10: seg_reg <= 4'b0011; // 数码管显示1
8'h09: seg_reg <= 4'b0000; // 数码管显示9
8'h08: seg_reg <= 4'b0001; // 数码管显示8
8'h07: seg_reg <= 4'b0010; // 数码管显示7
8'h06: seg_reg <= 4'b0011; // 数码管显示6
8'h05: seg_reg <= 4'b0000; // 数码管显示5
8'h04: seg_reg <= 4'b0001; // 数码管显示4
8'h03: seg_reg <= 4'b0010; // 数码管显示3
8'h02: seg_reg <= 4'b0011; // 数码管显示2
8'h01: begin
seg_reg <= player_score[1] ? 4'b0001 : 4'b0010; // 数码管显示抢答成功选手号码
player_score[seg_reg] <= player_score[seg_reg] + 1; // 抢答成功得分
end
default: seg_reg <= 4'b1111; // 数码管显示0
endcase
cnt_reg <= cnt_reg - 1; // 抢答计时器减1
end
// 抢答控制
else if (en) begin
if (btn[1] && btn[0]) begin // 两名选手同时按下抢答按钮,犯规
seg_reg <= 4'b1000; // 数码管显示犯规标识
if (player_score[1] == 0 && player_score[2] == 0) begin
// 如果两名选手得分都为0,则不扣分
seg_reg <= 4'b1001; // 数码管显示无效抢答标识
end
else begin
// 犯规,扣分
if (player_score[1] > player_score[2]) begin
player_score[1] <= player_score[1] - WRONG_PENALTY;
end
else if (player_score[2] > player_score[1]) begin
player_score[2] <= player_score[2] - WRONG_PENALTY;
end
end
end
else if (btn[1]) begin // 选手1抢答成功
cnt_reg <= 0; // 抢答计时器清零
seg_reg <= 4'b0001; // 数码管显示选手1号
end
else if (btn[0]) begin // 选手2抢答成功
cnt_reg <= 0; // 抢答计时器清零
seg_reg <= 4'b0010; // 数码管显示选手2号
end
end
end
end
endmodule
```
这个抢答器使用了一个抢答计时器,初始值为8'h20,约为2s。当主持人允许抢答后,计时器开始倒计时,直到有人抢答成功或计时器归零。如果抢答成功,则数码管显示抢答成功选手号码,对应选手得分加1;如果抢答失败,则数码管显示剩余时间,抢答计时器继续减1。
如果两名选手同时按下抢答按钮,犯规,数码管显示犯规标识,并扣除一定分数。如果两名选手得分都为0,则不扣分,数码管显示无效抢答标识。
在一轮抢答结束后,主持人按下复位键,抢答器返回初始计时状态,以进行下一轮抢答。当某个选手率先得到5分时,显示比赛结束。
阅读全文