Design a finite state machine FSM that cycles through the la
Design a finite state machine (FSM) that cycles through the last 4 digits of your student ID in a loop. In your design there should be an input that changes the direction of the cycle. Each number of the ID should be displayed on the seven-segment display while the current state of the FSM should be displayed on its corresponding LED. Nonvalid states should keep all LEDs off. For Example, a particular student has the UTEP ID 80-210543. The state diagram and outputs for his design are as follows:
Draft the behavioral Verilog module for the FSM.
Solution
 `timescale 1ns/1ns
 module student_id_fsm (
                        clock,               //SYSTEM CLOCK
                        student_id,           //STUDENT ID
                        clockwise,           //DIRECTION
                        seven_segment_out,   //SEVENSEGMENT
                        four_bit_led       // LED INDICATION
 );
//Port assignments
 input clock;
 input student_id;
 input clockwise;
output seven_segment_out;
 output four_bit_led;
//Port types
 wire clock;
 //integer student_id;
 wire clockwise;
reg [6:0] seven_segment_out;
 reg [3:0] four_bit_led;
//Temporary variables
 integer temp_student_id;
 integer state_0,state_1,state_2,state_3;
 reg [6:0] seven_segment_state0, seven_segment_state1, seven_segment_state2, seven_segment_state3;
 reg [3:0] four_bit_led0, four_bit_led1, four_bit_led2, four_bit_led3;
 integer state_value;
always@(student_id) begin                           // LOGIC for the last 4 digits
        temp_student_id = student_id;
           state_3 = temp_student_id % 10;
        temp_student_id = temp_student_id / 10;
           state_2 = temp_student_id % 10;
        temp_student_id = temp_student_id / 10;
           state_1 = temp_student_id % 10;
        temp_student_id = temp_student_id / 10;
           state_0 = temp_student_id % 10;
 end
 
 always@(state_0) begin                           //LED pattern and seven segment for last digit
    four_bit_led0 = 4\'b0001;
 case (state_0)
 0: seven_segment_state0 = \'b1111110;
 1: seven_segment_state0 = \'b0000110;
 2: seven_segment_state0 = \'b1011011;
 3: seven_segment_state0 = \'b1001111;
 4: seven_segment_state0 = \'b0100111;
 5: seven_segment_state0 = \'b1101101;
 6: seven_segment_state0 = \'b1111101;
 7: seven_segment_state0 = \'b1000110;
 8: seven_segment_state0 = \'b1111111;
 9: seven_segment_state0 = \'b1101111;
 default: seven_segment_state0 = \'b0000000;
 endcase
 end
 
 always@(state_1) begin                           //LED pattern and seven segment for digit at 10th place
    four_bit_led1 = 4\'b0010;
 case (state_1)
 0: seven_segment_state1 = \'b1111110;
 1: seven_segment_state1 = \'b0000110;
 2: seven_segment_state1 = \'b1011011;
 3: seven_segment_state1 = \'b1001111;
 4: seven_segment_state1 = \'b0100111;
 5: seven_segment_state1 = \'b1101101;
 6: seven_segment_state1 = \'b1111101;
 7: seven_segment_state1 = \'b1000110;
 8: seven_segment_state1 = \'b1111111;
 9: seven_segment_state1 = \'b1101111;
 default: seven_segment_state1 = \'b0000000;
 endcase
 end
 
 always@(state_2) begin                         //LED pattern and seven segment for digit at 100th place
    four_bit_led2 = 4\'b0100;
 case (state_2)
 0: seven_segment_state2 = \'b1111110;
 1: seven_segment_state2 = \'b0000110;
 2: seven_segment_state2 = \'b1011011;
 3: seven_segment_state2 = \'b1001111;
 4: seven_segment_state2 = \'b0100111;
 5: seven_segment_state2 = \'b1101101;
 6: seven_segment_state2 = \'b1111101;
 7: seven_segment_state2 = \'b1000110;
 8: seven_segment_state2 = \'b1111111;
 9: seven_segment_state2 = \'b1101111;
 default: seven_segment_state2 = \'b0000000;
 endcase
 end
 
 always@(state_3) begin                         //LED pattern and seven segment for digit at 1000th place
    four_bit_led3 = 4\'b1000;
 case (state_3)
 0: seven_segment_state3 = \'b1111110;
 1: seven_segment_state3 = \'b0000110;
 2: seven_segment_state3 = \'b1011011;
 3: seven_segment_state3 = \'b1001111;
 4: seven_segment_state3 = \'b0100111;
 5: seven_segment_state3 = \'b1101101;
 6: seven_segment_state3 = \'b1111101;
 7: seven_segment_state3 = \'b1000110;
 8: seven_segment_state3 = \'b1111111;
 9: seven_segment_state3 = \'b1101111;
 default: seven_segment_state3 = \'b0000000;
 endcase
 end
 
 always@(posedge clock) begin                         //state transitions
    if(clockwise == 1) begin
        if(state_value == 3)
            state_value = 0;
        else
            state_value = state_value + 1;
    end
    else begin
        if(state_value == 0)
            state_value = 3;
        else
            state_value = state_value - 1;
    end
 end
 
 always@(state_value) begin                         //LED pattern and seven segment when each state
    case(state_value)
    0 : begin seven_segment_out = seven_segment_state0;
               four_bit_led = four_bit_led0;
        end
    1 : begin seven_segment_out = seven_segment_state1;
               four_bit_led = four_bit_led1;
        end
    2 : begin seven_segment_out = seven_segment_state2;
               four_bit_led = four_bit_led2;
        end
    2 : begin seven_segment_out = seven_segment_state3;
               four_bit_led = four_bit_led3;
        end
     endcase
 end  
 
 
 endmodule



