---
# System prepended metadata

title: '火星無人車  純時序時脈控制 純always模塊 '
tags: [MarsRover, FPGA, "#Verilog\_"]

---

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