// 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