首页 > 其他分享 >Verilog实例(二)交通信号灯控制器

Verilog实例(二)交通信号灯控制器

时间:2023-01-23 20:23:28浏览次数:50  
标签:控制器 HWY Cntry 信号灯 Verilog Hwy CNTRY parameter RED

功能说明

 

状态图

 

状态 信号
S0 Hwy=G, Cntry=R
S1 Hwy=Y, Cntry=R
S2 Hwy=R, Cntry=R
S3 Hwy=R, Cntry=G
S4 Hwy=R, Cntry=Y

Verilog代码

 
`define TRUE 1'b1
`define FALSE 1'b0

// 延迟
`define Y2RDELAY 3 // 黄灯亮转到红灯亮的延迟
`define R2GDELAY 2 // 红灯亮转到绿灯亮的延迟

module sig_control(hwy, cntry, X, clock, clear);

    // 输入/输出端口声明
    output [1:0] hwy, cntry; //表示3个状态的2位输出:GREEN,YELLOW,RED。
    reg [1:0] hwy, cntry;

    input X; // 若为真(TRUE),表示有汽车通过乡村公路,否则位假(FALSE)。

    input clock, clear; 
    
    // 交通灯状态
    parameter S0 = 3'd0; // HWY=GREEN, CNTRY=RED;
    parameter S1 = 3'd1; // HWY=YELLOW, CNTRY=RED;
    parameter S2 = 3'd2; // HWY=RED, CNTRY=RED;
    parameter S3 = 3'd3; // HWY=RED, CNTRY=YELLOW;
    parameter S4 = 3'd4; // HWY=RED, CNTRY=GREEN;

    // 内部状态变量
    reg [2:0] state;
    reg [2:0] next_state;

    // 状态只能在时钟信号的正跳变沿改变
    always @(posedge clock) begin
        if (clear)
            state <= S0; // 控制器状态从0开始。
        else
            state <= next_state; // 状态改变。        
    end

    // 计算主路信号和乡村信号的值
    always @(state) begin
        hwy = GREEN; //默认的主路信号灯的颜色赋值
        cntry = RED; //默认的乡村信号灯的颜色赋值
        case(state)
            S0: ; // 没有改变,用默认值。
            S1: hwy = YELLOW;
            S2: hwy = RED;
            S3: begin
                hwy = RED;
                cntry = GREEN;
            end
            S4: begin
                hwy = RED;
                cntry = YELLOW;
            end
        endcase
    end

    // 用case语句描述的状态机
    always @(state or X) begin
        case (state)
            S0: if (X)
                    next_state = S1;
                else
                    next_state = S0;
            S1: begin // 延迟几个正跳变沿时钟
                repeat(`Y2RDELAY) @(posedge clock);
                next_state = S2;
            end
            S2: begin // 延迟几个正跳变沿时钟
                repeat(`R2GDELAY) @(posedge clock);
                next_state = S3;
            end
            S3: if (X)
                    next_state = S3;
                else
                    next_state = S4;
            S4: begin // 延迟几个正跳变沿时钟
                repeat(`Y2RDELAY) @(posedge clock);
                next_state = S0;
            end
            default: next_state = S0;
        endcase
    end

endmodule

// 测试用的激励信号模块
module stimulus;

    wire [1:0] MAIN_SIG, CNTRY_SIG;
    reg CAR_ON_CNTRY_RD; // 若为真(TRUE),表示有汽车通过乡村公路,否则位假(FALSE)。
    reg CLOCK, CLEAR;

    // 调用(实例引用)交通信号灯控制器模块
    sig_control SC(MAIN_SIG, CNTRY_SIG, CAR_ON_CNTRY_RD, CLOCK, CLEAR);

    // 设置监视系统任务
    initial begin
        $monitor($time, "Main Sig = %b Country Sig = %b Car_on_cntry = %b", MAIN_SIG, CNTRY_SIG, CAR_ON_CNTRY_RD);
    end

    // 设置时钟
    initial begin
        CLOCK = `FALSE;
        forever #5 CLOCK = ~CLOCK;
    end

    // 控制清零信号
    initial begin
        CLEAR = `TRUE;
        repeat (5) @(negedge CLOCK);
        CLEAR = `FALSE;
    end

    // 施加激励信号
    initial begin
        CAR_ON_CNTRY_RD = `FALSE;

        repeat (20) @(negedge CLOCK); CAR_ON_CNTRY_RD = `TRUE;
        repeat (10) @(negedge CLOCK); CAR_ON_CNTRY_RD = `FALSE;
        
        repeat (20) @(negedge CLOCK); CAR_ON_CNTRY_RD = `TRUE;
        repeat (10) @(negedge CLOCK); CAR_ON_CNTRY_RD = `FALSE;
        
        repeat (20) @(negedge CLOCK); CAR_ON_CNTRY_RD = `TRUE;
        repeat (10) @(negedge CLOCK); CAR_ON_CNTRY_RD = `FALSE;
        
        repeat (10) @(negedge CLOCK); $stop;
    end
endmodule

ModelSim仿真

ModelSim版本:ModelSim SE-64 10.5

仿真结果如下:

 

 

标签:控制器,HWY,Cntry,信号灯,Verilog,Hwy,CNTRY,parameter,RED
From: https://www.cnblogs.com/vicky2021/p/17065128.html

相关文章