Advertisement
aidanozo

Untitled

Nov 20th, 2024
650
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module fsm_sequence (
  2.     input wire [1:0] i_w_in,    // Intrare pe 2 biți: 2'd0 -> 'a', 2'd1 -> 'b', 2'd2 -> 'c', 2'd3 -> 'd'
  3.     input wire i_w_clk,         // Semnal de ceas
  4.     input wire i_w_reset,       // Reset activ 0
  5.     output reg o_w_out          // Ieșire: 1 dacă secvența este validă, 0 altfel
  6. );
  7.  
  8.     // Definirea stărilor folosind localparam
  9.     localparam IDLE = 3'b000;  // Stare inițială
  10.     localparam S1   = 3'b001;  // Stare după detectarea lui 'a'
  11.     localparam S2   = 3'b010;  // Stare după detectarea lui 'b'
  12.     localparam S3   = 3'b011;  // Stare după detectarea lui 'c'
  13.  
  14.     // Registre pentru starea curentă și starea următoare
  15.     reg [2:0] current_state, next_state;
  16.  
  17.     // Tranzițiile FSM
  18.     always @(posedge i_w_clk or negedge i_w_reset) begin
  19.         if (!i_w_reset)
  20.             current_state <= IDLE; // Reset la stare inițială
  21.         else
  22.             current_state <= next_state;
  23.     end
  24.  
  25.     // Logica pentru determinarea stării următoare
  26.     always @(*) begin
  27.         next_state = current_state; // Implicit rămâne în starea curentă
  28.         case (current_state)
  29.             IDLE:
  30.                 if (i_w_in == 2'd0) // Detectează 'a'
  31.                     next_state = S1;
  32.             S1:
  33.                 if (i_w_in == 2'd1) // Detectează 'b'
  34.                     next_state = S2;
  35.                 else
  36.                     next_state = IDLE;
  37.             S2:
  38.                 if (i_w_in == 2'd2) // Detectează 'c'
  39.                     next_state = S3;
  40.                 else
  41.                     next_state = IDLE;
  42.             S3:
  43.                 if (i_w_in == 2'd1) // Detectează din nou 'b' pentru repetiție
  44.                     next_state = S2;
  45.                 else if (i_w_in == 2'd0) // Permite detectarea unui nou 'a'
  46.                     next_state = S1;
  47.                 else
  48.                     next_state = IDLE;
  49.         endcase
  50.     end
  51.  
  52.     // Logica pentru ieșirea FSM
  53.     always @(*) begin
  54.         o_w_out = (current_state == S3); // Secvența este validă în starea S3
  55.     end
  56.  
  57. endmodule
  58.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement