Así que estoy tratando de hacer un FSM básico en verilog para encender 3 LED diferentes. He visto ejemplos y el trabajo de otras personas, pero no puedo entender por qué el mío no funciona. Tal vez alguien pueda ayudarme a detectar un error en mi código que no puedo ver.
module blink( input rst, output reg [2:0] leds, output LED);
OSCH #("2.08") osc_int ( //"2.03" specifies the operating frequency, 2.03 MHz. Other clock frequencies can be found in the MachX02's documentation
.STDBY(1'b0), //Specifies active state
.OSC(clk), //Outputs clock signal to 'clk' net
.SEDSTDBY());
wire clk_slow; //this will be the slower clock wire
reg [21:0] cnt; //these two lines use the fast clock to increment a 21 bit register
always @(posedge clk) cnt <= cnt+1;
assign clk_slow = cnt[21]; //this is high whenever the 21st bit of the fast clock register is true, thus slowing the clock to about 1 Hz
assign LED = clk_slow ; //status LED so I know my clock is working
reg [1:0] state;
reg [1:0] state_n;
parameter S0 = 2'b00; //state paramenters
parameter S1 = 2'b01;
parameter S2 = 2'b10;
always @ (posedge clk_slow or posedge rst) //state changer
begin
if(!rst)
state <= S0;
else
state <= state_n;
end
always @ (*) //changes next state
begin
case(state)
S0: state_n = S1;
S1: state_n = S2;
S2: state_n = S0;
default state_n = S0;
endcase
end
always @ (*) //decides what leds to light based on state
begin
if (state == S0)
leds = 3'b001;
else if(state == S1)
leds = 3'b010;
else if(state == S2)
leds = 3'b100;
end
endmodule
No estoy muy seguro de por qué no funciona. El LED de estado que he conectado está parpadeando a 1 Hz, lo cual es correcto. Mis otros 3 LED parecen estar atascados en el estado 0 ... o algo así. Cuando presiono el botón de reinicio, a veces cambia mi LED al estado 1, pero creo que tiene que ver con la superposición del reloj. Cualquier ayuda es apreciada.
Estoy usando un FPGA de Lattice Diamond para programar esto. Estoy usando el reloj incorporado para generar el reloj inicial, y estoy usando los LED de a bordo. Mi botón de reinicio es externo y activo bajo.