一、实验要求
用设计一拔河游戏机,要求如下:电路使用15个发光二极管表示拔河的“电子绳”,开机后只有中间一个发亮,此即拔河的中心点。游戏双方各持一个按钮,迅速地、不断地按动产生脉冲,谁按的快,亮点就向谁的一方移动,每按一次,亮点移动一次。亮点一到任一方的终端发光二极管时,这一方就获胜,此时双方按钮均无作用,输出保持,只有复位后亮点才恢复到中心。由裁判下达比赛命令后,双方才能输入信号,否则,输入无效。
二、实验代码
源代码
module tug_of_war
(
input clk, reset_n, p1_btn, p2_btn, referee_cmd,
output reg[14:0] leds
);
parameter CENTER_LED = 7;
parameter WAIT_CMD = 4'd0;
parameter WAIT_INPUT = 4'd1;
parameter RUNNING = 4'd2;
parameter P1_WIN = 4'd3;
parameter P2_WIN = 4'd4;
parameter OUTPUT_HOLD = 4'd5;
reg [3:0] state;
reg [14:0] counter;
always @(posedge clk, negedge reset_n) begin
if (~reset_n) begin
counter <= 15'd0;
leds <= 15'b000000010000000;
state <= WAIT_CMD;
end
else begin
case (state)
WAIT_CMD: begin
if (referee_cmd) begin
state <= WAIT_INPUT;
end
end
WAIT_INPUT: begin
if (p1_btn || p2_btn) begin
state <= RUNNING;
end
end
RUNNING: begin
if (counter == 15'd000001) begin
counter <= 15'd0;
if (p1_btn == p2_btn) begin
leds <= leds;
end
else if (p1_btn > p2_btn) begin
leds <= {leds[13:0], 1'b0};
end
else if (p2_btn > p1_btn) begin
leds <= {1'b0, leds[14:1]};
end
if (leds == 15'b100000000000000 || leds == 15'b000000000000001) begin
if (p1_btn) begin
state <= P1_WIN;
end
else if (p2_btn) begin
state <= P2_WIN;
end
end
end
else begin
counter <= counter + 1;
end
end
P1_WIN: begin
leds <= 15'b100000000000000;
state <= OUTPUT_HOLD;
end
P2_WIN: begin
leds <= 15'b000000000000001;
state <= OUTPUT_HOLD;
end
OUTPUT_HOLD: begin
if (referee_cmd==0) begin
leds <= 15'b000000010000000;
end
else if (referee_cmd==1) begin
leds <= leds;
end
end
endcase
end
end
endmodule
[点击并拖拽以移动]
测试代码文章来源:https://www.toymoban.com/news/detail-767972.html
module tb_tug_of_war;
reg clk;
reg reset_n;
reg p1_btn;
reg p2_btn;
reg referee_cmd;
wire [14:0] leds;
tug_of_war dut (
.clk(clk),
.reset_n(reset_n),
.p1_btn(p1_btn),
.p2_btn(p2_btn),
.referee_cmd(referee_cmd),
.leds(leds)
);
always #5 clk = ~clk;
initial begin
reset_n = 0;
clk = 0;
#100;
reset_n = 1;
#200;
referee_cmd = 1;
#50;
p2_btn = 1;
#50;
p1_btn = 1;
p2_btn = 0;
#50;
p1_btn = 0;
p2_btn = 1;
#50;
p1_btn = 1;
p2_btn = 0;
#170;
p1_btn = 0;
referee_cmd = 0;
reset_n = 0;
#100;
referee_cmd = 1;
reset_n = 1;
#200;
p1_btn = 0;
p2_btn = 1;
#150;
p2_btn = 0;
referee_cmd = 0;
reset_n = 0;
#100000;
$finish;
end
endmodule
测试代码可以自己改数据,第一个是P1胜利,不是一边倒胜利,有拉锯,后面是P2胜利,一边倒胜利,如果不想,可以在测试代码加一下。文章来源地址https://www.toymoban.com/news/detail-767972.html
到了这里,关于FPGA课设:拔河游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!