add fsm_traffic

This commit is contained in:
Jose Luis Montañes Ojados
2026-03-01 05:00:05 +01:00
parent 6df7024707
commit d4ffd9dd46
3 changed files with 105 additions and 1 deletions

48
fsm_traffic/fsm_traffic.v Normal file
View File

@@ -0,0 +1,48 @@
/*
fsm_traffic
*/
module fsm_traffic (
input clk,
input rst,
output red_led,
output green_led,
output yellow_led
);
localparam RED = 2'b00;
localparam GREEN = 2'b01;
localparam YELLOW = 2'b10;
reg[1:0] state, next_state;
reg[7:0] timer;
always @(posedge clk or posedge rst) begin
if (rst) begin
state <= RED;
timer <= 3;
end
else if (timer == 0) begin
state <= next_state;
case (next_state)
RED: timer <= 3;
YELLOW: timer <= 1;
GREEN: timer <= 2;
default: timer <= 3;
endcase
end
else timer <= timer - 1;
end
always @(*) begin
case (state)
RED: next_state = GREEN;
YELLOW: next_state = RED;
GREEN: next_state = YELLOW;
default: next_state = RED;
endcase
end
assign red_led = state == RED;
assign green_led = state == GREEN;
assign yellow_led = state == YELLOW;
endmodule

View File

@@ -0,0 +1,56 @@
/*
fsm_traffic testbench
*/
`include "fsm_traffic/fsm_traffic.v"
module fsm_traffic_tb;
reg clk, rst;
wire red_led, green_led, yellow_led;
fsm_traffic dut (
.clk(clk),
.rst(rst),
.red_led(red_led),
.green_led(green_led),
.yellow_led(yellow_led)
);
initial clk = 0;
always #5 clk = ~clk;
task show_state;
$display("t=%0t | rst=%b | R=%b G=%b Y=%b",
$time, rst, red_led, green_led, yellow_led);
endtask
initial begin
$dumpfile("fsm_traffic/fsm_traffic.vcd");
$dumpvars(0, fsm_traffic_tb);
// Reset
rst = 1;
@(posedge clk); #1
show_state;
rst = 0;
// Dejar correr varios ciclos para ver todos los estados
repeat(9) begin
@(posedge clk); #1
show_state;
end
// Reset a mitad de secuencia debe volver a RED
rst = 1;
@(posedge clk); #1
show_state;
rst = 0;
repeat(3) begin
@(posedge clk); #1
show_state;
end
$finish;
end
endmodule