module SPI_slave2 ( input clk, input cs, input mosi, input sck, input [15:0] data_to_cpu, input data_load, output reg miso = 1'b0, output reg [15:0] addr = 16'd0, output reg [15:0] data = 16'd0, output reg addr_ready = 1'b0, output reg data_ready = 1'b0, output wr ); reg[1:0] sck_reg; reg[1:0] mosi_reg; reg[5:0] bit_counter; reg[15:0] data_send_reg; wire sck_risingEdge; wire sck_fallingEdge; wire mosi_data; //--------------------------------- // Выделяем фронт и спад сигнала sck //--------------------------------- always @(posedge clk) begin if(cs) sck_reg <= 2'b00; else sck_reg <= {sck_reg[0], sck}; end assign sck_risingEdge = (sck_reg == 2'b01); assign sck_fallingEdge = (sck_reg == 2'b10); //--------------------------------- // Выделяем сигнал mosi //--------------------------------- always @(posedge clk) begin if(cs) mosi_reg <= 2'b00; else mosi_reg <= {mosi_reg[0], mosi}; end assign mosi_data = mosi_reg[1]; //--------------------------------- // Если cs==1 - очищаем приемный регистр // и обнуляем счетчик. // Иначе по спаду sck принимаем данные // и увеличиваем счетчик. //--------------------------------- always @(posedge clk) begin if(cs) begin addr <= 16'd0; data <= 16'd0; bit_counter <= 6'b000000; end else if (sck_fallingEdge) begin if (bit_counter[4]) data <= {data[14:0], mosi_data}; else addr <= {addr[14:0], mosi_data}; bit_counter <= bit_counter + 6'b000001; end end //--------------------------------- // Выделяем сигналы готовности адреса и данных //--------------------------------- always @(posedge clk) begin addr_ready <= (~cs) && (bit_counter[4] | bit_counter[5]); data_ready <= (~cs) && (bit_counter[5]); end //--------------------------------- // Если cs==1 - заносим в регистр данные для посылки // Иначе сдвигаем данные и отправляем побитно //--------------------------------- always @(posedge clk) begin if(cs) miso <= 1'b0; else if (data_load) data_send_reg <= data_to_cpu; else if (sck_risingEdge) begin if (bit_counter[4]) begin miso <= addr[15]? 1'b0 : data_send_reg[15]; data_send_reg <= {data_send_reg[14:0], 1'b0}; end end end assign wr = addr[15]; endmodule /* module SPI_slave2 ( input clk, input cs, input mosi, input sck, input [15:0] data_to_cpu, output miso, output reg [15:0] data = 16'b0000000000000000, output reg data_ready, output bNeedData ); reg[1:0] sck_reg; reg[1:0] mosi_reg; reg[4:0] bit_counter; reg[15:0] data_send_reg; wire sck_risingEdge; wire sck_fallingEdge; wire mosi_data; //--------------------------------- // Выделяем фронт и спад сигнала sck //--------------------------------- always @(posedge clk) begin if(cs) sck_reg <= 2'b00; else sck_reg <= {sck_reg[0], sck}; end assign sck_risingEdge = (sck_reg == 2'b01); assign sck_fallingEdge = (sck_reg == 2'b10); //--------------------------------- // Выделяем сигнал mosi //--------------------------------- always @(posedge clk) begin if(cs) mosi_reg <= 2'b00; else mosi_reg <= {mosi_reg[0], mosi}; end assign mosi_data = mosi_reg[1]; //--------------------------------- // Если cs==1 - очищаем приемный регистр // и обнуляем счетчик. // Иначе по спаду sck принимаем данные // и увеличиваем счетчик. //--------------------------------- always @(posedge clk) begin if(cs) begin data <= 16'h00; bit_counter <= 5'b00000; end else if (sck_fallingEdge) begin data <= {data[14:0], mosi_data}; bit_counter <= bit_counter + 5'b00001; end end //--------------------------------- // Выделяем сигнал готовности данных //--------------------------------- always @(posedge clk) data_ready <= (~cs) && (bit_counter[4]); //--------------------------------- // Если cs==1 - заносим в регистр данные для посылки // Иначе сдвигаем данные и отправляем побитно //--------------------------------- always @(posedge clk) begin if(cs) data_send_reg <= 16'h00; else if (bit_counter == 5'b00000) data_send_reg <= data_to_cpu; if (sck_risingEdge) data_send_reg <= {data_send_reg[14:0], 1'b0}; end assign bNeedData = (~cs) && (bit_counter[4]); assign miso = data_send_reg[15]; endmodule */