以下是一个十字路口交通灯控制器的 Verilog 代码:

module traffic_light_controller(
    input clock, // 时钟信号
    input reset, // 复位信号
    output reg [6:0] east_west_display, // 东西方向的倒计时数码管显示
    output reg [6:0] north_south_display, // 南北方向的倒计时数码管显示
    output reg east_west_red, east_west_yellow, east_west_green, // 东西方向的红、黄、绿灯输出
    output reg north_south_red, north_south_yellow, north_south_green // 南北方向的红、黄、绿灯输出
);

// 定义状态机的状态
parameter [2:0] IDLE = 3'b000; // 空闲状态
parameter [2:0] EAST_WEST_GREEN = 3'b001; // 东西方向绿灯状态
parameter [2:0] EAST_WEST_YELLOW = 3'b010; // 东西方向黄灯状态
parameter [2:0] EAST_WEST_RED = 3'b011; // 东西方向红灯状态
parameter [2:0] NORTH_SOUTH_GREEN = 3'b100; // 南北方向绿灯状态
parameter [2:0] NORTH_SOUTH_YELLOW = 3'b101; // 南北方向黄灯状态
parameter [2:0] NORTH_SOUTH_RED = 3'b110; // 南北方向红灯状态

reg [2:0] state; // 当前状态

reg [3:0] east_west_timer; // 东西方向倒计时计数器
reg [3:0] north_south_timer; // 南北方向倒计时计数器

always @(posedge clock) begin
    if (reset) begin
        // 复位状态机和计数器
        state <= IDLE;
        east_west_timer <= 0;
        north_south_timer <= 0;
    end else begin
        case (state)
            IDLE: begin
                // 等待一段时间后进入东西方向绿灯状态
                east_west_timer <= 5;
                north_south_timer <= 8;
                if (east_west_timer == 0) begin
                    state <= EAST_WEST_GREEN;
                end
            end
            EAST_WEST_GREEN: begin
                // 东西方向绿灯持续5秒,然后进入黄灯状态
                east_west_green <= 1;
                east_west_yellow <= 0;
                east_west_red <= 0;
                east_west_timer <= 5;
                if (east_west_timer == 0) begin
                    state <= EAST_WEST_YELLOW;
                end
            end
            EAST_WEST_YELLOW: begin
                // 东西方向黄灯持续3秒,然后进入红灯状态
                east_west_green <= 0;
                east_west_yellow <= 1;
                east_west_red <= 0;
                east_west_timer <= 3;
                if (east_west_timer == 0) begin
                    state <= EAST_WEST_RED;
                end
            end
            EAST_WEST_RED: begin
                // 东西方向红灯持续8秒,然后进入南北方向绿灯状态
                east_west_green <= 0;
                east_west_yellow <= 0;
                east_west_red <= 1;
                east_west_timer <= 8;
                if (east_west_timer == 0) begin
                    state <= NORTH_SOUTH_GREEN;
                end
            end
            NORTH_SOUTH_GREEN: begin
                // 南北方向绿灯持续5秒,然后进入黄灯状态
                north_south_green <= 1;
                north_south_yellow <= 0;
                north_south_red <= 0;
                north_south_timer <= 5;
                if (north_south_timer == 0) begin
                    state <= NORTH_SOUTH_YELLOW;
                end
            end
            NORTH_SOUTH_YELLOW: begin
                // 南北方向黄灯持续3秒,然后进入红灯状态
                north_south_green <= 0;
                north_south_yellow <= 1;
                north_south_red <= 0;
                north_south_timer <= 3;
                if (north_south_timer == 0) begin
                    state <= NORTH_SOUTH_RED;
                end
            end
            NORTH_SOUTH_RED: begin
                // 南北方向红灯持续8秒,然后回到空闲状态
                north_south_green <= 0;
                north_south_yellow <= 0;
                north_south_red <= 1;
                north_south_timer <= 8;
                if (north_south_timer == 0) begin
                    state <= IDLE;
                end
            end
        endcase
    end
end

// 倒计时数码管显示
always @(posedge clock) begin
    case (state)
        IDLE: begin
            // 空闲状态时显示 0000000
            east_west_display <= 7'b0000000;
            north_south_display <= 7'b0000000;
        end
        EAST_WEST_GREEN: begin
            // 东西方向绿灯倒计时显示
            east_west_display <= east_west_timer;
            north_south_display <= 7'b0000000;
        end
        EAST_WEST_YELLOW: begin
            // 东西方向黄灯倒计时显示
            east_west_display <= east_west_timer;
            north_south_display <= 7'b0000000;
        end
        EAST_WEST_RED: begin
            // 东西方向红灯倒计时显示
            east_west_display <= east_west_timer;
            north_south_display <= 7'b0000000;
        end
        NORTH_SOUTH_GREEN: begin
            // 南北方向绿灯倒计时显示
            east_west_display <= 7'b0000000;
            north_south_display <= north_south_timer;
        end
        NORTH_SOUTH_YELLOW: begin
            // 南北方向黄灯倒计时显示
            east_west_display <= 7'b0000000;
            north_south_display <= north_south_timer;
        end
        NORTH_SOUTH_RED: begin
            // 南北方向红灯倒计时显示
            east_west_display <= 7'b0000000;
            north_south_display <= north_south_timer;
        end
    endcase
end

endmodule

模块的输入包括一个时钟信号和一个复位信号,输出包括两个方向的倒计时数码管显示和对应的红、黄、绿灯输出。状态机的状态包括空闲状态、东西方向绿灯状态、东西方向黄灯状态、东西方向红灯状态、南北方向绿灯状态、南北方向黄灯状态和南北方向红灯状态。在每个状态下,根据对应的持续时间控制倒计时计数器和对应的灯输出。倒计时数码管的显示根据当前状态和倒计时计数器的值进行选择。

Verilog 实现十字路口交通灯控制器

原文地址: https://www.cveoy.top/t/topic/lxzC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录