module transparport(ClkToFPGA, Reset, DataValidToFPGA, DataToFPGA, DataValidFromFPGA, DataFromFPGA);
   input ClkToFPGA;
   input Reset;
   input DataValidToFPGA;
   input DataToFPGA;
   output DataValidFromFPGA;
   output DataFromFPGA;

   parameter state0 = 2'b00;
   parameter state1 = 2'b01;
   parameter state2 = 2'b10;
   parameter state3 = 2'b11;
	
   wire ClkToFPGA, Reset, DataValidToFPGA;
   wire DataValidFromFPGA;
   wire DataFromFPGA;

   (* signal_encoding = "user" *)
   reg [1:0] cur_state;
   reg [1:0] next_state;
   reg [7:0] mem_ele;
   reg [2:0] bit_pos;
   wire data_out_done;
   wire inc_address;

   assign DataValidFromFPGA = (cur_state == state2 || cur_state == state3) ? 1'b1 : 1'b0;
   assign data_out_done = (bit_pos == 3'b111) ? 1'b1 : 1'b0;
   assign DataFromFPGA = mem_ele[bit_pos]; 
   assign inc_address = (cur_state == state1 || cur_state == state3) ? 1'b1 : 1'b0; 

   always @(posedge ClkToFPGA or posedge Reset)
      if (Reset == 1'b1) 
         mem_ele <= 8'b0000_0000;
      else if (DataValidToFPGA == 1'b1) 
         mem_ele[bit_pos] <= DataToFPGA;

   always @(negedge ClkToFPGA or posedge Reset)
      if (Reset == 1'b1) 
         bit_pos <= 3'b000;
      else if (inc_address == 1'b1)
         bit_pos <= bit_pos + 1;

   always @(posedge ClkToFPGA or posedge Reset) // State transition logic
      if (Reset == 1'b1) cur_state <= state0;
      else cur_state <= next_state;

   always @(cur_state or DataValidToFPGA or data_out_done) // Next state combinational logic
      begin
         case (cur_state)
            state0:
               if (DataValidToFPGA == 0)
                  next_state <= state0;
               else 
                  next_state <= state1;
            state1:
               if (DataValidToFPGA == 1)
                  next_state <= state1;
               else 
                  next_state <= state2;
            state2:
               next_state <= state3;
            state3:
               if (data_out_done == 0)
                  next_state <= state3;
               else 
                  next_state <= state0;
            default: next_state <= state0;
         endcase
      end


endmodule
