用verilog语言设计一个四人抢答器,时钟频率为50mhz,裁判按下按键后开始10秒倒计时,选手只能在这10秒内抢答才有效,选手按下按键后停止倒数并在数码管上显示时间,不使用display语句
时间: 2024-05-09 20:16:26 浏览: 130
根据题意,可以分为裁判模块、倒计时模块和抢答模块,下面分别进行设计。
裁判模块:
```verilog
module referee(
input clk,
input rst,
input start, // 裁判按键
output reg [3:0] sel // 选手编号
);
reg [3:0] counter;
always @(posedge clk or posedge rst) begin
if (rst) begin
sel <= 4'b1111;
counter <= 0;
end
else begin
if (start) begin // 裁判按下按键
sel <= 4'b1111; // 重置选手编号
counter <= 500_000_000; // 10秒倒计时
end
else if (counter > 0) begin
counter <= counter - 1;
if (counter == 0) // 时间到
sel <= 4'b0000; // 选手编号为0表示时间到
end
end
end
endmodule
```
倒计时模块:
```verilog
module timer(
input clk,
input rst,
input [3:0] sel, // 选手编号
input start, // 裁判按键
output reg [15:0] time // 倒计时时间
);
reg [31:0] counter;
always @(posedge clk or posedge rst) begin
if (rst) begin
time <= 16'h0000;
counter <= 0;
end
else begin
if (start || sel != 4'b1111) // 裁判按下按键或有选手抢答
counter <= 0;
else if (counter < 50_000_000) // 未达到1秒
counter <= counter + 1;
else begin
counter <= 0;
if (time > 0) // 时间减1
time <= time - 1;
end
end
end
endmodule
```
抢答模块:
```verilog
module buzzer(
input clk,
input rst,
input [3:0] sel, // 选手编号
input start, // 裁判按键
input [3:0] btn, // 选手按键
output reg [3:0] buzz // 抢答成功的选手编号
);
reg [3:0] counter;
always @(posedge clk or posedge rst) begin
if (rst) begin
buzz <= 4'b1111;
counter <= 0;
end
else begin
if (start || sel != 4'b1111) // 裁判按下按键或有选手抢答
counter <= 0;
else if (counter < 50_000_000) // 未达到1秒
counter <= counter + 1;
else begin
counter <= 0;
if (btn != 4'b0000 && buzz == 4'b1111) begin // 选手按下按键且无人抢答
buzz <= btn;
end
end
end
end
endmodule
```
最后,将三个模块组合在一起:
```verilog
module quizzer(
input clk,
input rst,
input [3:0] btn, // 选手按键
output reg [3:0] seg // 数码管
);
wire [3:0] sel;
wire [15:0] time;
wire [3:0] buzz;
referee ref(clk, rst, btn[0], sel);
timer tmr(clk, rst, sel, btn[0], time);
buzzer buz(clk, rst, sel, btn[0], btn[1:], buzz);
always @(*) begin
case (buzz)
4'b0001: seg = 16'h3F9F; // 显示9
4'b0010: seg = 16'h0C06; // 显示2
4'b0100: seg = 16'h5B4F; // 显示5
4'b1000: seg = 16'h7C7F; // 显示8
default: seg = time;
endcase
end
endmodule
```
其中,seg为数码管的显示值,buzz为抢答成功的选手编号。对于数码管的显示,可以通过case语句进行判断。
阅读全文
相关推荐








