设计一个抢答器。 题目要求: (1)能够同时进行 2 位选手的抢答比赛,用 2 个按键作为抢答按钮; (2)由主持人进行系统复位和抢答控制; (3)主持人允许抢答后,计时器开始倒计时,直到有人抢答成功后,数码管上显示剩余时 间和抢答成功选手号码; (4)两名选手初始分数为 0,如果抢答选手回答正确,得 1 分;若回答错误,对方得 1 分。显示两名选手的目前分数; (5)在主持人允许前抢答被视为犯规,给出犯规标识,并自动减 1 分; (6)在一轮抢答结束后,主持人按下复位键,返回初始计时状态,以进行下一轮抢答; (7)当某个选手率先得到 5 分时,显示比赛结束 使用verilog语言写代码
时间: 2024-02-22 08:57:07 浏览: 157
代码包answermachine.zip_Answering_STM32抢答器_row2uu_stm32_stm32 记录
以下是一个简单的抢答器的Verilog代码,实现了题目中的要求:
```verilog
module buzzer_reset(
input wire clk, // 时钟输入
input wire reset, // 复位输入
input wire [1:0] player_input, // 选手按键输入
input wire start, // 主持人开始信号
input wire reset_game, // 主持人重置信号
output reg [3:0] timer_display, // 倒计时显示
output reg [1:0] player_score, // 选手得分显示
output reg buzzer // 蜂鸣器输出
);
reg [3:0] timer; // 倒计时计数器
reg [1:0] player_buzzed; // 抢答成功选手号码
reg [1:0] player_score_internal; // 选手得分内部计数器
reg [1:0] player_score; // 选手得分寄存器
reg [1:0] player_last_buzzed; // 上一轮抢答成功选手号码
reg [1:0] player_last_score; // 上一轮得分寄存器
reg [1:0] player_last_score_internal; // 上一轮得分内部计数器
// 倒计时计数器和抢答成功选手号码清零
initial begin
timer = 0;
player_buzzed = 0;
player_score_internal = 0;
player_score = 2'b00;
end
// 倒计时递减,抢答成功选手得分加一,计分器清零
always @ (posedge clk or posedge reset) begin
if (reset) begin
timer <= 0;
player_buzzed <= 0;
player_score_internal <= 0;
player_score <= 2'b00;
end else if (start) begin
if (timer == 0) begin
// 倒计时结束,抢答成功选手得分加一
if (player_buzzed != 0) begin
player_score_internal[player_buzzed-1] <= player_score_internal[player_buzzed-1] + 1;
player_last_buzzed <= player_buzzed;
end else begin
player_last_buzzed <= 0;
end
// 更新选手得分寄存器
if (player_score_internal[0] >= 5 || player_score_internal[1] >= 5) begin
// 比赛结束
player_score <= {1'b0, 1'b0};
end else begin
player_score <= player_score_internal;
end
// 更新上一轮得分寄存器
player_last_score <= player_score;
player_last_score_internal <= player_score_internal;
// 抢答成功选手号码清零
player_buzzed <= 0;
// 重置计时器
timer <= 10;
end else begin
timer <= timer - 1;
end
end else begin
// 抢答期间,计分器清零
player_score_internal <= 2'b00;
// 更新倒计时显示
timer_display <= timer;
end
end
// 选手按键检测,抢答成功选手号码更新
always @ (posedge clk or posedge reset) begin
if (reset) begin
player_buzzed <= 0;
end else begin
if (start && player_input != 2'b00 && player_buzzed == 0) begin
player_buzzed <= player_input;
end
end
end
// 蜂鸣器输出控制
always @ (posedge clk or posedge reset) begin
if (reset || player_last_buzzed == 0) begin
buzzer <= 1'b0;
end else begin
if (player_last_score != player_score) begin
// 选手得分变化,长鸣
buzzer <= 1'b1;
end else if (player_last_buzzed != player_buzzed) begin
// 抢答成功,短鸣
buzzer <= 1'b1;
end else begin
buzzer <= 1'b0;
end
end
end
endmodule
```
这个代码使用两个按键作为选手抢答按钮,一个按键作为主持人开始信号,另一个按键作为主持人重置信号。计时器倒计时到0时,如果有选手抢答成功,倒计时显示会切换为抢答成功选手号码,蜂鸣器会短鸣;否则,倒计时显示会重置为10,蜂鸣器会长鸣。如果某个选手得分达到5分,比赛结束,选手得分显示会显示比赛结束。
阅读全文