```=v /* =============================================================== Filename : spi_top_module.v Simulator : Quartus II 20.1 ModelSim 2020.1 scription : spi controller Release : Aug.20,2021 =============================================================== */ module spi_top_module( input clk, input go, input reset, input [15:0] regdata, output reg sdat, output reg spc, output reg scen, output reg ordy ); //initial initial begin sdat=1'bz; spc=1'b1; scen=1'b1; ordy=1'b0; end //parameter parameter idle_state=2'd0, start_state=2'd1, data_state=2'd2, finish_state=2'd3; //regs reg [1:0]state,next_state; reg [15:0] shift_regs_data_state; reg [3:0] counter_data_state; //fsm always@(posedge clk) begin if (reset) state<=idle_state; else state<=next_state; end always@(*) begin case (state) idle_state: if (go) next_state=start_state; else next_state=state; start_state: next_state=data_state; data_state: if (counter_data_state==4'd15) next_state=finish_state; else next_state=state; finish_state: next_state=idle_state; endcase end always@(*) begin case (state) idle_state:begin sdat=1'bz; spc=1'd1; scen=1'd1; ordy=1'd0; end start_state:begin sdat=1'bz; //shift reg spc=1'd1; scen=1'd0; ordy=1'd0; end data_state:begin sdat=shift_regs_data_state[15]; spc=~clk; scen=1'd0; ordy=1'd0; end finish_state:begin sdat=1'bz; spc=~clk; scen=1'd1; ordy=1'd1; end endcase end /* =============================================================== shift_reg_for_data_state =============================================================== */ always@(posedge clk) begin case (state) start_state: shift_regs_data_state<=regdata; data_state: begin /*shift_regs_data_state[0]<=1'd0; shift_regs_data_state[1]<=shift_regs_data_state[0]; shift_regs_data_state[2]<=shift_regs_data_state[1]; shift_regs_data_state[3]<=shift_regs_data_state[2]; shift_regs_data_state[4]<=shift_regs_data_state[3]; shift_regs_data_state[5]<=shift_regs_data_state[4]; shift_regs_data_state[6]<=shift_regs_data_state[5]; shift_regs_data_state[7]<=shift_regs_data_state[6]; shift_regs_data_state[8]<=shift_regs_data_state[7]; shift_regs_data_state[9]<=shift_regs_data_state[8]; shift_regs_data_state[10]<=shift_regs_data_state[9]; shift_regs_data_state[11]<=shift_regs_data_state[10]; shift_regs_data_state[12]<=shift_regs_data_state[11]; shift_regs_data_state[13]<=shift_regs_data_state[12]; shift_regs_data_state[14]<=shift_regs_data_state[13]; shift_regs_data_state[15]<=shift_regs_data_state[14];*/ shift_regs_data_state[15:0]<={shift_regs_data_state[14:0],1'd0}; end default: shift_regs_data_state<=1'd0; endcase end ////////////////////////////////////////////////// //counter_for_data_state ////////////////////////////////////////////////// always@(posedge clk) begin case (state) data_state: counter_data_state<=counter_data_state+1'd1; default :counter_data_state<=1'd0; endcase end endmodule ```