// Verilog 代碼:Mars Rover 走 500 米
module mars_rover(
input wire clk, // 時鐘信號,每秒觸發一次
input wire reset, // 重置信號,將 Rover 設為初始狀態
input wire FS, // 前方感測器 (1 = 偵測到障礙物, 0 = 無障礙物)
input wire LS, // 左側感測器 (1 = 偵測到障礙物, 0 = 無障礙物)
input wire RS, // 右側感測器 (1 = 偵測到障礙物, 0 = 無障礙物)
output reg MF, // 前進 (1 = 前進, 0 = 停止)
output reg TL, // 左轉 (1 = 左轉, 0 = 不左轉)
output reg TR // 右轉 (1 = 右轉, 0 = 不右轉)
);
// 計數器,用於追蹤行駛的距離
reg [8:0] distance; // 假設最大行駛距離 500 米,9 位元足夠
// 每次時鐘觸發,檢查 Rover 行駛邏輯
always @(posedge clk or posedge reset) begin
if (reset) begin
// 如果重置信號啟動,將 Rover 設為初始狀態
distance <= 0;
MF <= 0;
TL <= 0;
TR <= 0;
end
else begin
// 根據行駛距離來控制 Rover 的行為
// **0-100 米: 前面無障礙物,直走**
if (distance < 100) begin
// 當前方 (FS) 無障礙物,直走
if (FS == 0) begin
MF <= 1; // 前進
TL <= 0; // 不左轉
TR <= 0; // 不右轉
end
else begin
MF <= 0; // 停止
TL <= 0; // 不左轉
TR <= 0; // 不右轉
end
end
// **100-200 米: 右前方有障礙物,左轉**
else if (distance >= 100 && distance < 200) begin
// 當右前方 (RS) 有障礙物,進行左轉
if (RS == 1) begin
MF <= 0; // 停止
TL <= 1; // 左轉
TR <= 0; // 不右轉
end
else begin
MF <= 1; // 前進
TL <= 0; // 不左轉
TR <= 0; // 不右轉
end
end
// **200-300 米: 左前方有障礙物,右轉**
else if (distance >= 200 && distance < 300) begin
// 當左前方 (LS) 有障礙物,進行右轉
if (LS == 1) begin
MF <= 0; // 停止
TL <= 0; // 不左轉
TR <= 1; // 右轉
end
else begin
MF <= 1; // 前進
TL <= 0; // 不左轉
TR <= 0; // 不右轉
end
end
// **300-500 米: 無障礙物,直走**
else if (distance >= 300 && distance < 500) begin
// 當前方、左邊、右邊都無障礙物,直走
if (FS == 0 && LS == 0 && RS == 0) begin
MF <= 1; // 前進
TL <= 0; // 不左轉
TR <= 0; // 不右轉
end
else begin
MF <= 0; // 停止
TL <= 0; // 不左轉
TR <= 0; // 不右轉
end
end
// 更新行駛距離
distance <= distance + 1; // 每次時鐘觸發,距離增加 1 米
end
end
endmodule