功能说明
状态图
状态 | 信号 |
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