Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module fsm_sequence (
- input wire [1:0] i_w_in, // Intrare pe 2 biți: 2'd0 -> 'a', 2'd1 -> 'b', 2'd2 -> 'c', 2'd3 -> 'd'
- input wire i_w_clk, // Semnal de ceas
- input wire i_w_reset, // Reset activ 0
- output reg o_w_out // Ieșire: 1 dacă secvența este validă, 0 altfel
- );
- // Definirea stărilor folosind localparam
- localparam IDLE = 3'b000; // Stare inițială
- localparam S1 = 3'b001; // Stare după detectarea lui 'a'
- localparam S2 = 3'b010; // Stare după detectarea lui 'b'
- localparam S3 = 3'b011; // Stare după detectarea lui 'c'
- // Registre pentru starea curentă și starea următoare
- reg [2:0] current_state, next_state;
- // Tranzițiile FSM
- always @(posedge i_w_clk or negedge i_w_reset) begin
- if (!i_w_reset)
- current_state <= IDLE; // Reset la stare inițială
- else
- current_state <= next_state;
- end
- // Logica pentru determinarea stării următoare
- always @(*) begin
- next_state = current_state; // Implicit rămâne în starea curentă
- case (current_state)
- IDLE:
- if (i_w_in == 2'd0) // Detectează 'a'
- next_state = S1;
- S1:
- if (i_w_in == 2'd1) // Detectează 'b'
- next_state = S2;
- else
- next_state = IDLE;
- S2:
- if (i_w_in == 2'd2) // Detectează 'c'
- next_state = S3;
- else
- next_state = IDLE;
- S3:
- if (i_w_in == 2'd1) // Detectează din nou 'b' pentru repetiție
- next_state = S2;
- else if (i_w_in == 2'd0) // Permite detectarea unui nou 'a'
- next_state = S1;
- else
- next_state = IDLE;
- endcase
- end
- // Logica pentru ieșirea FSM
- always @(*) begin
- o_w_out = (current_state == S3); // Secvența este validă în starea S3
- end
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement